@sftech/ng-orchestrator 0.0.9 → 0.0.10
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.service-B-Oyla5f.mjs → sftech-ng-orchestrator-agent.service-w7yNia2v.mjs} +3 -3
- package/fesm2022/{sftech-ng-orchestrator-agent.service-B-Oyla5f.mjs.map → sftech-ng-orchestrator-agent.service-w7yNia2v.mjs.map} +1 -1
- package/fesm2022/sftech-ng-orchestrator-agents.routes-BnMYwh1T.mjs +148 -0
- package/fesm2022/sftech-ng-orchestrator-agents.routes-BnMYwh1T.mjs.map +1 -0
- package/fesm2022/{sftech-ng-orchestrator-chat.routes-C-qQU3r4.mjs → sftech-ng-orchestrator-chat.routes-D4nOLrzi.mjs} +5 -6
- package/fesm2022/sftech-ng-orchestrator-chat.routes-D4nOLrzi.mjs.map +1 -0
- package/fesm2022/sftech-ng-orchestrator-prompt-display.component-C2jx7jgq.mjs +114 -0
- package/fesm2022/sftech-ng-orchestrator-prompt-display.component-C2jx7jgq.mjs.map +1 -0
- package/fesm2022/{sftech-ng-orchestrator-prompt.service-CGjm-Lgg.mjs → sftech-ng-orchestrator-prompt.service-DXvM-ziS.mjs} +2 -2
- package/fesm2022/{sftech-ng-orchestrator-prompt.service-CGjm-Lgg.mjs.map → sftech-ng-orchestrator-prompt.service-DXvM-ziS.mjs.map} +1 -1
- package/fesm2022/{sftech-ng-orchestrator-prompts.routes-C0Lzyz67.mjs → sftech-ng-orchestrator-prompts.routes-CO3W8D4y.mjs} +3 -3
- package/fesm2022/{sftech-ng-orchestrator-prompts.routes-C0Lzyz67.mjs.map → sftech-ng-orchestrator-prompts.routes-CO3W8D4y.mjs.map} +1 -1
- package/fesm2022/{sftech-ng-orchestrator-sftech-ng-orchestrator-BvI6i-px.mjs → sftech-ng-orchestrator-sftech-ng-orchestrator-CgBxpVr9.mjs} +21 -5
- package/fesm2022/sftech-ng-orchestrator-sftech-ng-orchestrator-CgBxpVr9.mjs.map +1 -0
- package/fesm2022/sftech-ng-orchestrator.mjs +1 -1
- package/lib/ng-orchestrator/agents/components/agent/agent-display/agent-display.component.d.ts +8 -1
- package/lib/ng-orchestrator/core/configuration/orchestrator-config.interface.d.ts +9 -1
- package/lib/ng-orchestrator/core/configuration/orchestrator-config.mapper.d.ts +3 -2
- package/lib/ng-orchestrator/core/dtos/mcp-tool-response.dto.d.ts +4 -0
- package/lib/ng-orchestrator/core/service/orcherstrator.service.d.ts +2 -0
- package/package.json +2 -2
- package/fesm2022/sftech-ng-orchestrator-agents.routes-DB9PYB14.mjs +0 -130
- package/fesm2022/sftech-ng-orchestrator-agents.routes-DB9PYB14.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-chat.routes-C-qQU3r4.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-prompt-display.component-LSo-QYNv.mjs +0 -114
- package/fesm2022/sftech-ng-orchestrator-prompt-display.component-LSo-QYNv.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-sftech-ng-orchestrator-BvI6i-px.mjs.map +0 -1
|
@@ -2,8 +2,8 @@ import * as i1 from '@angular/common/http';
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { Inject, Injectable } from '@angular/core';
|
|
4
4
|
import { BaseDbModel, EFilterTypes, BaseDbApiService } from '@sftech/ng-shared';
|
|
5
|
-
import { a as ORCHESTRATOR_CONFIGURATION } from './sftech-ng-orchestrator-sftech-ng-orchestrator-
|
|
6
|
-
import { b as Prompt } from './sftech-ng-orchestrator-prompt.service-
|
|
5
|
+
import { a as ORCHESTRATOR_CONFIGURATION } from './sftech-ng-orchestrator-sftech-ng-orchestrator-CgBxpVr9.mjs';
|
|
6
|
+
import { b as Prompt } from './sftech-ng-orchestrator-prompt.service-DXvM-ziS.mjs';
|
|
7
7
|
|
|
8
8
|
class Agent extends BaseDbModel {
|
|
9
9
|
identifier;
|
|
@@ -100,4 +100,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
|
|
|
100
100
|
}] }] });
|
|
101
101
|
|
|
102
102
|
export { AgentService as A, Agent as a };
|
|
103
|
-
//# sourceMappingURL=sftech-ng-orchestrator-agent.service-
|
|
103
|
+
//# sourceMappingURL=sftech-ng-orchestrator-agent.service-w7yNia2v.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sftech-ng-orchestrator-agent.service-
|
|
1
|
+
{"version":3,"file":"sftech-ng-orchestrator-agent.service-w7yNia2v.mjs","sources":["../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/core/models/agent.model.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/core/services/agent.service.ts"],"sourcesContent":["import { BaseDbModel, EFilterTypes, IBaseDbResponseDto } from '@sftech/ng-shared';\r\nimport { IAgentResponseDto } from '../dtos/agent-response.dto';\r\nimport {IPromptHistoryResponseDto} from \"../../../prompts/core/dtos/prompt-history-response.dto\";\r\nimport {Prompt} from \"../../../prompts/core/models/prompt.model\";\r\nimport {PromptHistory} from \"../../../prompts/core/models/prompt-history.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 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 llmMaxTokens?: 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 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 ['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 ['llmMaxTokens', 'LLM-Max-Tokens'],\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 ]);\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.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.llmMaxTokens = dto.llmMaxTokens;\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 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 '../../../core/configuration/orchestrator-config.interface';\r\nimport { ORCHESTRATOR_CONFIGURATION } from '../../../core/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"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component, inject, signal } from '@angular/core';
|
|
3
|
+
import { RouterOutlet } from '@angular/router';
|
|
4
|
+
import { BaseDisplayComponent, BaseDialogComponent, BaseListComponent, IconProvider, PaginatorComponent } from '@sftech/ng-shared';
|
|
5
|
+
import { DialogService } from 'primeng/dynamicdialog';
|
|
6
|
+
import { Panel } from 'primeng/panel';
|
|
7
|
+
import * as i1$1 from 'primeng/table';
|
|
8
|
+
import { TableModule } from 'primeng/table';
|
|
9
|
+
import { A as AgentService, a as Agent } from './sftech-ng-orchestrator-agent.service-w7yNia2v.mjs';
|
|
10
|
+
import * as i1 from '@angular/forms';
|
|
11
|
+
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
12
|
+
import { AutoFocus } from 'primeng/autofocus';
|
|
13
|
+
import { Button } from 'primeng/button';
|
|
14
|
+
import { DatePicker } from 'primeng/datepicker';
|
|
15
|
+
import { Fieldset } from 'primeng/fieldset';
|
|
16
|
+
import { FloatLabel } from 'primeng/floatlabel';
|
|
17
|
+
import { InputText } from 'primeng/inputtext';
|
|
18
|
+
import { Textarea } from 'primeng/textarea';
|
|
19
|
+
import { O as OrcherstratorService, a as ORCHESTRATOR_CONFIGURATION } from './sftech-ng-orchestrator-sftech-ng-orchestrator-CgBxpVr9.mjs';
|
|
20
|
+
import { P as PromptDisplayComponent } from './sftech-ng-orchestrator-prompt-display.component-C2jx7jgq.mjs';
|
|
21
|
+
import { MultiSelect } from 'primeng/multiselect';
|
|
22
|
+
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
|
|
23
|
+
|
|
24
|
+
class AgentsComponent {
|
|
25
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AgentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
26
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.11", type: AgentsComponent, isStandalone: true, selector: "sftech-agents", ngImport: i0, template: "<router-outlet></router-outlet>\r\n", styles: [""], dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
|
|
27
|
+
}
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AgentsComponent, decorators: [{
|
|
29
|
+
type: Component,
|
|
30
|
+
args: [{ selector: 'sftech-agents', imports: [RouterOutlet], template: "<router-outlet></router-outlet>\r\n" }]
|
|
31
|
+
}] });
|
|
32
|
+
|
|
33
|
+
class AgentDisplayComponent extends BaseDisplayComponent {
|
|
34
|
+
_repo = inject(AgentService);
|
|
35
|
+
_route = 'agents';
|
|
36
|
+
_orchestratorService = inject(OrcherstratorService);
|
|
37
|
+
tools = signal([]);
|
|
38
|
+
dialog = inject(DialogService);
|
|
39
|
+
_options = inject(ORCHESTRATOR_CONFIGURATION);
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
super.ngOnInit();
|
|
42
|
+
this._orchestratorService.getTools().subscribe(res => this.tools.set(res));
|
|
43
|
+
}
|
|
44
|
+
initializeForm() {
|
|
45
|
+
return new FormGroup({
|
|
46
|
+
id: new FormControl({ value: this.model().id, disabled: true }),
|
|
47
|
+
createdAt: new FormControl({ value: this.model().createdAt, disabled: true }),
|
|
48
|
+
identifier: new FormControl({ value: this.model().identifier, disabled: true }),
|
|
49
|
+
llmUserPrompt: new FormControl({ value: this.model().llmUserPrompt, disabled: true }),
|
|
50
|
+
llmSystemPrompt: new FormControl({ value: this.model().llmSystemPrompt, disabled: true }),
|
|
51
|
+
description: new FormControl({ value: this.model().description, disabled: !this.canEdit }),
|
|
52
|
+
connectorUrl: new FormControl({ value: this.model().connectorUrl, disabled: !this.canEdit }),
|
|
53
|
+
tools: new FormControl({ value: this.model().tools, disabled: !this.canEdit }),
|
|
54
|
+
llmProvider: new FormControl({ value: this.model().llmProvider, disabled: !this.canEdit }),
|
|
55
|
+
llmModel: new FormControl({ value: this.model().llmModel, disabled: !this.canEdit }),
|
|
56
|
+
llmTemperature: new FormControl({ value: this.model().llmTemperature, disabled: !this.canEdit }),
|
|
57
|
+
llmTimeout: new FormControl({ value: this.model().llmTimeout, disabled: !this.canEdit }),
|
|
58
|
+
llmRetries: new FormControl({ value: this.model().llmRetries, disabled: !this.canEdit }),
|
|
59
|
+
llmMaxTokens: new FormControl({ value: this.model().llmMaxTokens, disabled: !this.canEdit }),
|
|
60
|
+
name: new FormControl(this.model()?.name),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
getNewModel() {
|
|
64
|
+
const agent = new Agent();
|
|
65
|
+
agent.connectorUrl = this._options.defaultConnectorUrl;
|
|
66
|
+
agent.llmProvider = this._options.defaultLlmProvider;
|
|
67
|
+
agent.llmModel = this._options.defaultLlmModel;
|
|
68
|
+
agent.llmTemperature = this._options.defaultLlmTemperature;
|
|
69
|
+
agent.llmTimeout = this._options.defaultLlmTimeout;
|
|
70
|
+
agent.llmRetries = this._options.defaultLlmRetries;
|
|
71
|
+
agent.llmMaxTokens = this._options.defaultLlmMaxTokens;
|
|
72
|
+
return agent;
|
|
73
|
+
}
|
|
74
|
+
mapFormToUpdateDto() {
|
|
75
|
+
return {
|
|
76
|
+
description: this.form.get('description')?.value,
|
|
77
|
+
connectorUrl: this.form.get('connectorUrl')?.value,
|
|
78
|
+
tools: this.form.get('tools')?.value,
|
|
79
|
+
llmProvider: this.form.get('llmProvider')?.value,
|
|
80
|
+
llmModel: this.form.get('llmModel')?.value,
|
|
81
|
+
llmTemperature: this.form.get('llmTemperature')?.value,
|
|
82
|
+
llmTimeout: this.form.get('llmTimeout')?.value,
|
|
83
|
+
llmRetries: this.form.get('llmRetries')?.value,
|
|
84
|
+
llmMaxTokens: this.form.get('llmMaxTokens')?.value,
|
|
85
|
+
name: this.form.get('name')?.value,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
mapFormToCreateDto() {
|
|
89
|
+
return {
|
|
90
|
+
description: this.form.get('description')?.value,
|
|
91
|
+
connectorUrl: this.form.get('connectorUrl')?.value,
|
|
92
|
+
tools: this.form.get('tools')?.value,
|
|
93
|
+
llmProvider: this.form.get('llmProvider')?.value,
|
|
94
|
+
llmModel: this.form.get('llmModel')?.value,
|
|
95
|
+
llmTemperature: this.form.get('llmTemperature')?.value,
|
|
96
|
+
llmTimeout: this.form.get('llmTimeout')?.value,
|
|
97
|
+
llmRetries: this.form.get('llmRetries')?.value,
|
|
98
|
+
llmMaxTokens: this.form.get('llmMaxTokens')?.value,
|
|
99
|
+
name: this.form.get('name')?.value,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
openPromptModal(promptId) {
|
|
103
|
+
console.log(promptId);
|
|
104
|
+
if (!promptId) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this.dialog.open(PromptDisplayComponent, { inputValues: { id: promptId, canEdit: true, openedAsModal: true }, focusOnShow: false, modal: true, dismissableMask: true, width: '70%', contentStyle: { overflow: 'auto' } });
|
|
108
|
+
}
|
|
109
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AgentDisplayComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
110
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", type: AgentDisplayComponent, isStandalone: true, selector: "sftech-prompt-display", providers: [DialogService], usesInheritance: true, ngImport: i0, template: "<sftech-base-dialog [hasHeader]=\"true\" (closed)=\"close({ operation: 'aborted' })\">\r\n <ng-template #header>\r\n <div class=\"flex justify-between\">\r\n <h2 class=\"text-xl font-semibold\">\r\n Agent\r\n @if (model()) {\r\n <span class=\"ms-1\">{{ this.model()!.identifier }}</span>\r\n }\r\n </h2>\r\n </div>\r\n </ng-template>\r\n <ng-template #body>\r\n @if (model()) {\r\n <form [formGroup]=\"form\" [pAutoFocus]=\"true\">\r\n <p-fieldset legend=\"Stammdaten\">\r\n <div class=\"grid grid-cols-3 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"id\" formControlName=\"id\" pInputText class=\"w-full\"/>\r\n <label for=\"id\">{{ this.model()!.getUiNameForProperty('id') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"identifier\" formControlName=\"identifier\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('identifier')?.dirty && form.get('identifier')?.invalid\"/>\r\n <label for=\"identifier\">{{ this.model()!.getUiNameForProperty('identifier') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-datePicker id=\"createdAt\" formControlName=\"createdAt\" dateFormat=\"dd.mm.yy\" [showTime]=\"true\"\r\n [hourFormat]=\"'24'\" [style]=\"{'width': '100%'}\" [class.ng-invalid]=\"form.get('createdAt')?.dirty && form.get('createdAt')?.invalid\"></p-datePicker>\r\n <label for=\"createdAt\">{{ this.model()!.getUiNameForProperty('createdAt') }}</label>\r\n </p-floatlabel>\r\n </div>\r\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\r\n <input type=\"text\" id=\"name\" formControlName=\"name\" pTextarea class=\"w-full\" [class.ng-invalid]=\"form.get('name')?.dirty && form.get('name')?.invalid\" />\r\n <label for=\"name\">{{ this.model()!.getUiNameForProperty('name') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\r\n <textarea rows=\"5\" id=\"description\" formControlName=\"description\" pTextarea class=\"w-full\" [class.ng-invalid]=\"form.get('description')?.dirty && form.get('description')?.invalid\"></textarea>\r\n <label for=\"description\">{{ this.model()!.getUiNameForProperty('description') }}</label>\r\n </p-floatlabel>\r\n </p-fieldset>\r\n @if (!isNew()) {\r\n <p-fieldset legend=\"Prompts\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmUserPrompt\" (click)=\"openPromptModal(model()!.llmUserPromptId)\"\r\n [value]=\"model()!.llmUserPrompt?.identifier\" pInputText class=\"w-full cursor-pointer\"/>\r\n <label for=\"llmUserPrompt\">{{ this.model()!.getUiNameForProperty('llmUserPrompt') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmSystemPrompt\" (click)=\"openPromptModal(model()!.llmSystemPromptId)\"\r\n [value]=\"model()!.llmSystemPrompt?.identifier\" pInputText class=\"w-full cursor-pointer\"/>\r\n <label for=\"llmSystemPrompt\">{{ this.model()!.getUiNameForProperty('llmSystemPrompt') }}</label>\r\n </p-floatlabel>\r\n\r\n </div>\r\n </p-fieldset>\r\n }\r\n <p-fieldset legend=\"LLM-Tools\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-multiselect id=\"tools\" [options]=\"tools()\" formControlName=\"tools\" optionLabel=\"name\" optionValue=\"name\" styleClass=\"w-full md:w-80\" display=\"chip\">\r\n <ng-template let-tool #item>\r\n <div class=\"flex items-center gap-2\">\r\n <div>{{ tool.name }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template #dropdownicon>\r\n <i class=\"pi pi-map\"></i>\r\n </ng-template>\r\n <ng-template #filtericon>\r\n <i class=\"pi pi-map-marker\"></i>\r\n </ng-template>\r\n <ng-template #header>\r\n <div class=\"font-medium px-3 py-2\">Verf\u00FCgbare Tools</div>\r\n </ng-template>\r\n </p-multiselect>\r\n <label for=\"tools\">Tools</label>\r\n </p-floatlabel>\r\n </div>\r\n </p-fieldset>\r\n <p-fieldset legend=\"LLM-Konfiguration\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"connectorUrl\"\r\n formControlName=\"connectorUrl\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('connectorUrl')?.dirty && form.get('connectorUrl')?.invalid\"/>\r\n <label for=\"connectorUrl\">{{ this.model()!.getUiNameForProperty('connectorUrl') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmProvider\"\r\n formControlName=\"llmProvider\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmProvider')?.dirty && form.get('llmProvider')?.invalid\"/>\r\n <label for=\"llmProvider\">{{ this.model()!.getUiNameForProperty('llmProvider') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmModel\"\r\n formControlName=\"llmModel\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmModel')?.dirty && form.get('llmModel')?.invalid\"/>\r\n <label for=\"llmModel\">{{ this.model()!.getUiNameForProperty('llmModel') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmTemperature\"\r\n formControlName=\"llmTemperature\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmTemperature')?.dirty && form.get('llmTemperature')?.invalid\"/>\r\n <label for=\"llmTemperature\">{{ this.model()!.getUiNameForProperty('llmTemperature') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmTimeout\"\r\n formControlName=\"llmTimeout\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmTimeout')?.dirty && form.get('llmTimeout')?.invalid\"/>\r\n <label for=\"llmTimeout\">{{ this.model()!.getUiNameForProperty('llmTimeout') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmRetries\"\r\n formControlName=\"llmRetries\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmRetries')?.dirty && form.get('llmRetries')?.invalid\"/>\r\n <label for=\"llmRetries\">{{ this.model()!.getUiNameForProperty('llmRetries') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmMaxTokens\"\r\n formControlName=\"llmMaxTokens\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmMaxTokens')?.dirty && form.get('llmMaxTokens')?.invalid\"/>\r\n <label for=\"llmMaxTokens\">{{ this.model()!.getUiNameForProperty('llmMaxTokens') }}</label>\r\n </p-floatlabel>\r\n\r\n </div>\r\n </p-fieldset>\r\n\r\n <div class=\"flex justify-end\">\r\n <p-button label=\"Speichern\" type=\"submit\" (onClick)=\"submitForm()\" (keyup.enter)=\"submitForm()\"\r\n [disabled]=\"!form.dirty\"></p-button>\r\n </div>\r\n </form>\r\n }\r\n </ng-template>\r\n <ng-template #footer>\r\n\r\n </ng-template>\r\n</sftech-base-dialog>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "directive", type: AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus", "pAutoFocus"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "component", type: DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "size", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "variant", "fluid", "pSize"], outputs: ["onResize"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: BaseDialogComponent, selector: "sftech-base-dialog", inputs: ["hasHeader", "hasFooter", "showButtons", "headerText"], outputs: ["closed"] }, { kind: "component", type: Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "component", type: MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus", "highlightOnSelect"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }] });
|
|
111
|
+
}
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AgentDisplayComponent, decorators: [{
|
|
113
|
+
type: Component,
|
|
114
|
+
args: [{ selector: 'sftech-prompt-display', imports: [ReactiveFormsModule, InputText, AutoFocus, FloatLabel, DatePicker, Textarea, Button, BaseDialogComponent, Fieldset, MultiSelect], providers: [DialogService], template: "<sftech-base-dialog [hasHeader]=\"true\" (closed)=\"close({ operation: 'aborted' })\">\r\n <ng-template #header>\r\n <div class=\"flex justify-between\">\r\n <h2 class=\"text-xl font-semibold\">\r\n Agent\r\n @if (model()) {\r\n <span class=\"ms-1\">{{ this.model()!.identifier }}</span>\r\n }\r\n </h2>\r\n </div>\r\n </ng-template>\r\n <ng-template #body>\r\n @if (model()) {\r\n <form [formGroup]=\"form\" [pAutoFocus]=\"true\">\r\n <p-fieldset legend=\"Stammdaten\">\r\n <div class=\"grid grid-cols-3 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"id\" formControlName=\"id\" pInputText class=\"w-full\"/>\r\n <label for=\"id\">{{ this.model()!.getUiNameForProperty('id') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"identifier\" formControlName=\"identifier\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('identifier')?.dirty && form.get('identifier')?.invalid\"/>\r\n <label for=\"identifier\">{{ this.model()!.getUiNameForProperty('identifier') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-datePicker id=\"createdAt\" formControlName=\"createdAt\" dateFormat=\"dd.mm.yy\" [showTime]=\"true\"\r\n [hourFormat]=\"'24'\" [style]=\"{'width': '100%'}\" [class.ng-invalid]=\"form.get('createdAt')?.dirty && form.get('createdAt')?.invalid\"></p-datePicker>\r\n <label for=\"createdAt\">{{ this.model()!.getUiNameForProperty('createdAt') }}</label>\r\n </p-floatlabel>\r\n </div>\r\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\r\n <input type=\"text\" id=\"name\" formControlName=\"name\" pTextarea class=\"w-full\" [class.ng-invalid]=\"form.get('name')?.dirty && form.get('name')?.invalid\" />\r\n <label for=\"name\">{{ this.model()!.getUiNameForProperty('name') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\r\n <textarea rows=\"5\" id=\"description\" formControlName=\"description\" pTextarea class=\"w-full\" [class.ng-invalid]=\"form.get('description')?.dirty && form.get('description')?.invalid\"></textarea>\r\n <label for=\"description\">{{ this.model()!.getUiNameForProperty('description') }}</label>\r\n </p-floatlabel>\r\n </p-fieldset>\r\n @if (!isNew()) {\r\n <p-fieldset legend=\"Prompts\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmUserPrompt\" (click)=\"openPromptModal(model()!.llmUserPromptId)\"\r\n [value]=\"model()!.llmUserPrompt?.identifier\" pInputText class=\"w-full cursor-pointer\"/>\r\n <label for=\"llmUserPrompt\">{{ this.model()!.getUiNameForProperty('llmUserPrompt') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmSystemPrompt\" (click)=\"openPromptModal(model()!.llmSystemPromptId)\"\r\n [value]=\"model()!.llmSystemPrompt?.identifier\" pInputText class=\"w-full cursor-pointer\"/>\r\n <label for=\"llmSystemPrompt\">{{ this.model()!.getUiNameForProperty('llmSystemPrompt') }}</label>\r\n </p-floatlabel>\r\n\r\n </div>\r\n </p-fieldset>\r\n }\r\n <p-fieldset legend=\"LLM-Tools\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-multiselect id=\"tools\" [options]=\"tools()\" formControlName=\"tools\" optionLabel=\"name\" optionValue=\"name\" styleClass=\"w-full md:w-80\" display=\"chip\">\r\n <ng-template let-tool #item>\r\n <div class=\"flex items-center gap-2\">\r\n <div>{{ tool.name }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template #dropdownicon>\r\n <i class=\"pi pi-map\"></i>\r\n </ng-template>\r\n <ng-template #filtericon>\r\n <i class=\"pi pi-map-marker\"></i>\r\n </ng-template>\r\n <ng-template #header>\r\n <div class=\"font-medium px-3 py-2\">Verf\u00FCgbare Tools</div>\r\n </ng-template>\r\n </p-multiselect>\r\n <label for=\"tools\">Tools</label>\r\n </p-floatlabel>\r\n </div>\r\n </p-fieldset>\r\n <p-fieldset legend=\"LLM-Konfiguration\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"connectorUrl\"\r\n formControlName=\"connectorUrl\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('connectorUrl')?.dirty && form.get('connectorUrl')?.invalid\"/>\r\n <label for=\"connectorUrl\">{{ this.model()!.getUiNameForProperty('connectorUrl') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmProvider\"\r\n formControlName=\"llmProvider\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmProvider')?.dirty && form.get('llmProvider')?.invalid\"/>\r\n <label for=\"llmProvider\">{{ this.model()!.getUiNameForProperty('llmProvider') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmModel\"\r\n formControlName=\"llmModel\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmModel')?.dirty && form.get('llmModel')?.invalid\"/>\r\n <label for=\"llmModel\">{{ this.model()!.getUiNameForProperty('llmModel') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmTemperature\"\r\n formControlName=\"llmTemperature\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmTemperature')?.dirty && form.get('llmTemperature')?.invalid\"/>\r\n <label for=\"llmTemperature\">{{ this.model()!.getUiNameForProperty('llmTemperature') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmTimeout\"\r\n formControlName=\"llmTimeout\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmTimeout')?.dirty && form.get('llmTimeout')?.invalid\"/>\r\n <label for=\"llmTimeout\">{{ this.model()!.getUiNameForProperty('llmTimeout') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmRetries\"\r\n formControlName=\"llmRetries\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmRetries')?.dirty && form.get('llmRetries')?.invalid\"/>\r\n <label for=\"llmRetries\">{{ this.model()!.getUiNameForProperty('llmRetries') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmMaxTokens\"\r\n formControlName=\"llmMaxTokens\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmMaxTokens')?.dirty && form.get('llmMaxTokens')?.invalid\"/>\r\n <label for=\"llmMaxTokens\">{{ this.model()!.getUiNameForProperty('llmMaxTokens') }}</label>\r\n </p-floatlabel>\r\n\r\n </div>\r\n </p-fieldset>\r\n\r\n <div class=\"flex justify-end\">\r\n <p-button label=\"Speichern\" type=\"submit\" (onClick)=\"submitForm()\" (keyup.enter)=\"submitForm()\"\r\n [disabled]=\"!form.dirty\"></p-button>\r\n </div>\r\n </form>\r\n }\r\n </ng-template>\r\n <ng-template #footer>\r\n\r\n </ng-template>\r\n</sftech-base-dialog>\r\n" }]
|
|
115
|
+
}] });
|
|
116
|
+
|
|
117
|
+
class AgentsListComponent extends BaseListComponent {
|
|
118
|
+
_repo = inject(AgentService);
|
|
119
|
+
_route = 'agents';
|
|
120
|
+
_modalComponent = AgentDisplayComponent;
|
|
121
|
+
detailModalHeaderText = 'Agent-Details';
|
|
122
|
+
iconProvider = IconProvider;
|
|
123
|
+
constructor() {
|
|
124
|
+
super();
|
|
125
|
+
}
|
|
126
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AgentsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
127
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", type: AgentsListComponent, isStandalone: true, selector: "sftech-prompts-list", providers: [DialogService], usesInheritance: true, ngImport: i0, template: "<h1 class=\"text-primary-900 font-bold text-xl p-2 my-4\">Agent-\u00DCbersicht</h1>\r\n\r\n@if (!data()) {\r\n <p-panel [toggleable]=\"false\">\r\n <p class=\"m-0\">\r\n Daten werden geladen...\r\n </p>\r\n </p-panel>\r\n} @else if (data()!.length === 0) {\r\n <p-panel [toggleable]=\"false\">\r\n <p class=\"m-0\">\r\n Es sind keine Prompts vorhanden.\r\n </p>\r\n </p-panel>\r\n} @else if (data()!.length > 0) {\r\n <p-table [value]=\"data()!\"\r\n stripedRows\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n selectionMode=\"single\"\r\n [resizableColumns]=\"true\"\r\n dataKey=\"id\"\r\n >\r\n <ng-template #header>\r\n <tr>\r\n @for(column of data()![0].propertiesToShow; track column) {\r\n <th>{{ data()![0].getUiNameForProperty(column) }}</th>\r\n }\r\n </tr>\r\n </ng-template>\r\n <ng-template #body let-prompt>\r\n <tr (click)=\"openDisplay(prompt.id)\" [pSelectableRow]=\"prompt\">\r\n @for(column of data()![0].propertiesToShow; track column) {\r\n <td style=\"white-space: pre-wrap\">\r\n {{ prompt.getPropertyValue(column) }}\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <sftech-paginator [pagination]=\"odata().pagination\" (odataChanged)=\"updatePagination($event)\"></sftech-paginator>\r\n <div class=\"flex justify-end p-2\">\r\n <p-button (onClick)=\"openDisplay(undefined)\">\r\n <fa-icon [icon]=\"iconProvider.add\"></fa-icon> Neuer Agent\r\n </p-button>\r\n </div>\r\n}\r\n\r\n", styles: [""], dependencies: [{ kind: "component", type: PaginatorComponent, selector: "sftech-paginator", inputs: ["pagination"], outputs: ["odataChanged"] }, { kind: "component", type: Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i1$1.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
|
|
128
|
+
}
|
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AgentsListComponent, decorators: [{
|
|
130
|
+
type: Component,
|
|
131
|
+
args: [{ selector: 'sftech-prompts-list', imports: [PaginatorComponent, Panel, TableModule, Button, FaIconComponent], providers: [DialogService], template: "<h1 class=\"text-primary-900 font-bold text-xl p-2 my-4\">Agent-\u00DCbersicht</h1>\r\n\r\n@if (!data()) {\r\n <p-panel [toggleable]=\"false\">\r\n <p class=\"m-0\">\r\n Daten werden geladen...\r\n </p>\r\n </p-panel>\r\n} @else if (data()!.length === 0) {\r\n <p-panel [toggleable]=\"false\">\r\n <p class=\"m-0\">\r\n Es sind keine Prompts vorhanden.\r\n </p>\r\n </p-panel>\r\n} @else if (data()!.length > 0) {\r\n <p-table [value]=\"data()!\"\r\n stripedRows\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n selectionMode=\"single\"\r\n [resizableColumns]=\"true\"\r\n dataKey=\"id\"\r\n >\r\n <ng-template #header>\r\n <tr>\r\n @for(column of data()![0].propertiesToShow; track column) {\r\n <th>{{ data()![0].getUiNameForProperty(column) }}</th>\r\n }\r\n </tr>\r\n </ng-template>\r\n <ng-template #body let-prompt>\r\n <tr (click)=\"openDisplay(prompt.id)\" [pSelectableRow]=\"prompt\">\r\n @for(column of data()![0].propertiesToShow; track column) {\r\n <td style=\"white-space: pre-wrap\">\r\n {{ prompt.getPropertyValue(column) }}\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <sftech-paginator [pagination]=\"odata().pagination\" (odataChanged)=\"updatePagination($event)\"></sftech-paginator>\r\n <div class=\"flex justify-end p-2\">\r\n <p-button (onClick)=\"openDisplay(undefined)\">\r\n <fa-icon [icon]=\"iconProvider.add\"></fa-icon> Neuer Agent\r\n </p-button>\r\n </div>\r\n}\r\n\r\n" }]
|
|
132
|
+
}], ctorParameters: () => [] });
|
|
133
|
+
|
|
134
|
+
const agentsRoutes = [
|
|
135
|
+
{
|
|
136
|
+
path: '',
|
|
137
|
+
component: AgentsComponent,
|
|
138
|
+
children: [
|
|
139
|
+
{
|
|
140
|
+
path: '',
|
|
141
|
+
component: AgentsListComponent,
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
|
|
147
|
+
export { agentsRoutes };
|
|
148
|
+
//# sourceMappingURL=sftech-ng-orchestrator-agents.routes-BnMYwh1T.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sftech-ng-orchestrator-agents.routes-BnMYwh1T.mjs","sources":["../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/agents.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/agents.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/components/agent/agent-display/agent-display.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/components/agent/agent-display/agent-display.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/components/agent/agents-list/agents-list.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/components/agent/agents-list/agents-list.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/agents/agents.routes.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\nimport { RouterOutlet } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'sftech-agents',\r\n imports: [RouterOutlet],\r\n templateUrl: './agents.component.html',\r\n styleUrl: './agents.component.css',\r\n})\r\nexport class AgentsComponent {}\r\n","<router-outlet></router-outlet>\r\n","import {Component, Inject, effect, inject, signal, OnInit} from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { BaseDialogComponent, BaseDisplayComponent, EFilterOperator, EFilterTypes, ESortDirection, OData, ODataOrder, OdataFilter, OdataFilterCollection } from '@sftech/ng-shared';\r\nimport { AutoFocus } from 'primeng/autofocus';\r\nimport { Button } from 'primeng/button';\r\nimport { DatePicker } from 'primeng/datepicker';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { Fieldset } from 'primeng/fieldset';\r\nimport { FloatLabel } from 'primeng/floatlabel';\r\nimport { InputText } from 'primeng/inputtext';\r\nimport { Textarea } from 'primeng/textarea';\r\nimport { IOrchestratorConfig } from '../../../../core/configuration/orchestrator-config.interface';\r\nimport { ORCHESTRATOR_CONFIGURATION } from '../../../../core/configuration/orchestrator-configuration.token';\r\nimport { PromptDisplayComponent } from '../../../../prompts/components/prompt/prompt-display/prompt-display.component';\r\nimport { IAgentResponseDto } from '../../../core/dtos/agent-response.dto';\r\nimport { IAgentUpdateDto } from '../../../core/dtos/agent-update-request.dto';\r\nimport { Agent } from '../../../core/models/agent.model';\r\nimport { AgentService } from '../../../core/services/agent.service';\r\nimport {OrcherstratorService} from \"../../../../core/service/orcherstrator.service\";\r\nimport {IMcpToolResponseDto} from \"../../../../core/dtos/mcp-tool-response.dto\";\r\nimport {MultiSelect} from \"primeng/multiselect\";\r\n\r\n@Component({\r\n selector: 'sftech-prompt-display',\r\n imports: [ReactiveFormsModule, InputText, AutoFocus, FloatLabel, DatePicker, Textarea, Button, BaseDialogComponent, Fieldset, MultiSelect],\r\n providers: [DialogService],\r\n templateUrl: './agent-display.component.html',\r\n styleUrl: './agent-display.component.css',\r\n})\r\nexport class AgentDisplayComponent extends BaseDisplayComponent<Agent, IAgentUpdateDto, IAgentUpdateDto, IAgentResponseDto> implements OnInit {\r\n protected override _repo = inject(AgentService);\r\n protected override _route = 'agents';\r\n protected _orchestratorService = inject(OrcherstratorService);\r\n\r\n public tools = signal<IMcpToolResponseDto[]>([])\r\n\r\n protected dialog = inject(DialogService);\r\n\r\n private _options: IOrchestratorConfig = inject(ORCHESTRATOR_CONFIGURATION);\r\n\r\n public override ngOnInit(): void {\r\n super.ngOnInit();\r\n this._orchestratorService.getTools().subscribe(res => this.tools.set(res));\r\n }\r\n\r\n protected override initializeForm(): FormGroup {\r\n return new FormGroup({\r\n id: new FormControl({ value: this.model()!.id, disabled: true }),\r\n createdAt: new FormControl({ value: this.model()!.createdAt, disabled: true }),\r\n identifier: new FormControl({ value: this.model()!.identifier, disabled: true }),\r\n llmUserPrompt: new FormControl({ value: this.model()!.llmUserPrompt, disabled: true }),\r\n llmSystemPrompt: new FormControl({ value: this.model()!.llmSystemPrompt, disabled: true }),\r\n description: new FormControl({ value: this.model()!.description, disabled: !this.canEdit }),\r\n connectorUrl: new FormControl({ value: this.model()!.connectorUrl, disabled: !this.canEdit }),\r\n tools: new FormControl({ value: this.model()!.tools, disabled: !this.canEdit }),\r\n llmProvider: new FormControl({ value: this.model()!.llmProvider, disabled: !this.canEdit }),\r\n llmModel: new FormControl({ value: this.model()!.llmModel, disabled: !this.canEdit }),\r\n llmTemperature: new FormControl({ value: this.model()!.llmTemperature, disabled: !this.canEdit }),\r\n llmTimeout: new FormControl({ value: this.model()!.llmTimeout, disabled: !this.canEdit }),\r\n llmRetries: new FormControl({ value: this.model()!.llmRetries, disabled: !this.canEdit }),\r\n llmMaxTokens: new FormControl({ value: this.model()!.llmMaxTokens, disabled: !this.canEdit }),\r\n name: new FormControl(this.model()?.name),\r\n });\r\n }\r\n protected override getNewModel(): Agent {\r\n const agent = new Agent();\r\n agent.connectorUrl = this._options.defaultConnectorUrl;\r\n agent.llmProvider = this._options.defaultLlmProvider;\r\n agent.llmModel = this._options.defaultLlmModel;\r\n agent.llmTemperature = this._options.defaultLlmTemperature;\r\n agent.llmTimeout = this._options.defaultLlmTimeout;\r\n agent.llmRetries = this._options.defaultLlmRetries;\r\n agent.llmMaxTokens = this._options.defaultLlmMaxTokens;\r\n return agent;\r\n }\r\n protected override mapFormToUpdateDto(): IAgentUpdateDto {\r\n return {\r\n description: this.form.get('description')?.value,\r\n connectorUrl: this.form.get('connectorUrl')?.value,\r\n tools: this.form.get('tools')?.value,\r\n llmProvider: this.form.get('llmProvider')?.value,\r\n llmModel: this.form.get('llmModel')?.value,\r\n llmTemperature: this.form.get('llmTemperature')?.value,\r\n llmTimeout: this.form.get('llmTimeout')?.value,\r\n llmRetries: this.form.get('llmRetries')?.value,\r\n llmMaxTokens: this.form.get('llmMaxTokens')?.value,\r\n name: this.form.get('name')?.value,\r\n };\r\n }\r\n protected override mapFormToCreateDto(): IAgentUpdateDto {\r\n return {\r\n description: this.form.get('description')?.value,\r\n connectorUrl: this.form.get('connectorUrl')?.value,\r\n tools: this.form.get('tools')?.value,\r\n llmProvider: this.form.get('llmProvider')?.value,\r\n llmModel: this.form.get('llmModel')?.value,\r\n llmTemperature: this.form.get('llmTemperature')?.value,\r\n llmTimeout: this.form.get('llmTimeout')?.value,\r\n llmRetries: this.form.get('llmRetries')?.value,\r\n llmMaxTokens: this.form.get('llmMaxTokens')?.value,\r\n name: this.form.get('name')?.value,\r\n };\r\n }\r\n\r\n public openPromptModal(promptId: number | undefined): void {\r\n console.log(promptId);\r\n if (!promptId) {\r\n return;\r\n }\r\n this.dialog.open(PromptDisplayComponent, { inputValues: { id: promptId, canEdit: true, openedAsModal: true }, focusOnShow: false, modal: true, dismissableMask: true, width: '70%', contentStyle: { overflow: 'auto' } });\r\n }\r\n}\r\n","<sftech-base-dialog [hasHeader]=\"true\" (closed)=\"close({ operation: 'aborted' })\">\r\n <ng-template #header>\r\n <div class=\"flex justify-between\">\r\n <h2 class=\"text-xl font-semibold\">\r\n Agent\r\n @if (model()) {\r\n <span class=\"ms-1\">{{ this.model()!.identifier }}</span>\r\n }\r\n </h2>\r\n </div>\r\n </ng-template>\r\n <ng-template #body>\r\n @if (model()) {\r\n <form [formGroup]=\"form\" [pAutoFocus]=\"true\">\r\n <p-fieldset legend=\"Stammdaten\">\r\n <div class=\"grid grid-cols-3 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"id\" formControlName=\"id\" pInputText class=\"w-full\"/>\r\n <label for=\"id\">{{ this.model()!.getUiNameForProperty('id') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"identifier\" formControlName=\"identifier\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('identifier')?.dirty && form.get('identifier')?.invalid\"/>\r\n <label for=\"identifier\">{{ this.model()!.getUiNameForProperty('identifier') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-datePicker id=\"createdAt\" formControlName=\"createdAt\" dateFormat=\"dd.mm.yy\" [showTime]=\"true\"\r\n [hourFormat]=\"'24'\" [style]=\"{'width': '100%'}\" [class.ng-invalid]=\"form.get('createdAt')?.dirty && form.get('createdAt')?.invalid\"></p-datePicker>\r\n <label for=\"createdAt\">{{ this.model()!.getUiNameForProperty('createdAt') }}</label>\r\n </p-floatlabel>\r\n </div>\r\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\r\n <input type=\"text\" id=\"name\" formControlName=\"name\" pTextarea class=\"w-full\" [class.ng-invalid]=\"form.get('name')?.dirty && form.get('name')?.invalid\" />\r\n <label for=\"name\">{{ this.model()!.getUiNameForProperty('name') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\r\n <textarea rows=\"5\" id=\"description\" formControlName=\"description\" pTextarea class=\"w-full\" [class.ng-invalid]=\"form.get('description')?.dirty && form.get('description')?.invalid\"></textarea>\r\n <label for=\"description\">{{ this.model()!.getUiNameForProperty('description') }}</label>\r\n </p-floatlabel>\r\n </p-fieldset>\r\n @if (!isNew()) {\r\n <p-fieldset legend=\"Prompts\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmUserPrompt\" (click)=\"openPromptModal(model()!.llmUserPromptId)\"\r\n [value]=\"model()!.llmUserPrompt?.identifier\" pInputText class=\"w-full cursor-pointer\"/>\r\n <label for=\"llmUserPrompt\">{{ this.model()!.getUiNameForProperty('llmUserPrompt') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmSystemPrompt\" (click)=\"openPromptModal(model()!.llmSystemPromptId)\"\r\n [value]=\"model()!.llmSystemPrompt?.identifier\" pInputText class=\"w-full cursor-pointer\"/>\r\n <label for=\"llmSystemPrompt\">{{ this.model()!.getUiNameForProperty('llmSystemPrompt') }}</label>\r\n </p-floatlabel>\r\n\r\n </div>\r\n </p-fieldset>\r\n }\r\n <p-fieldset legend=\"LLM-Tools\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-multiselect id=\"tools\" [options]=\"tools()\" formControlName=\"tools\" optionLabel=\"name\" optionValue=\"name\" styleClass=\"w-full md:w-80\" display=\"chip\">\r\n <ng-template let-tool #item>\r\n <div class=\"flex items-center gap-2\">\r\n <div>{{ tool.name }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template #dropdownicon>\r\n <i class=\"pi pi-map\"></i>\r\n </ng-template>\r\n <ng-template #filtericon>\r\n <i class=\"pi pi-map-marker\"></i>\r\n </ng-template>\r\n <ng-template #header>\r\n <div class=\"font-medium px-3 py-2\">Verfügbare Tools</div>\r\n </ng-template>\r\n </p-multiselect>\r\n <label for=\"tools\">Tools</label>\r\n </p-floatlabel>\r\n </div>\r\n </p-fieldset>\r\n <p-fieldset legend=\"LLM-Konfiguration\">\r\n <div class=\"grid grid-cols-3 mb-2 gap-2\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"connectorUrl\"\r\n formControlName=\"connectorUrl\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('connectorUrl')?.dirty && form.get('connectorUrl')?.invalid\"/>\r\n <label for=\"connectorUrl\">{{ this.model()!.getUiNameForProperty('connectorUrl') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmProvider\"\r\n formControlName=\"llmProvider\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmProvider')?.dirty && form.get('llmProvider')?.invalid\"/>\r\n <label for=\"llmProvider\">{{ this.model()!.getUiNameForProperty('llmProvider') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"llmModel\"\r\n formControlName=\"llmModel\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmModel')?.dirty && form.get('llmModel')?.invalid\"/>\r\n <label for=\"llmModel\">{{ this.model()!.getUiNameForProperty('llmModel') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmTemperature\"\r\n formControlName=\"llmTemperature\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmTemperature')?.dirty && form.get('llmTemperature')?.invalid\"/>\r\n <label for=\"llmTemperature\">{{ this.model()!.getUiNameForProperty('llmTemperature') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmTimeout\"\r\n formControlName=\"llmTimeout\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmTimeout')?.dirty && form.get('llmTimeout')?.invalid\"/>\r\n <label for=\"llmTimeout\">{{ this.model()!.getUiNameForProperty('llmTimeout') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmRetries\"\r\n formControlName=\"llmRetries\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmRetries')?.dirty && form.get('llmRetries')?.invalid\"/>\r\n <label for=\"llmRetries\">{{ this.model()!.getUiNameForProperty('llmRetries') }}</label>\r\n </p-floatlabel>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"number\" id=\"llmMaxTokens\"\r\n formControlName=\"llmMaxTokens\" pInputText class=\"w-full\" [class.ng-invalid]=\"form.get('llmMaxTokens')?.dirty && form.get('llmMaxTokens')?.invalid\"/>\r\n <label for=\"llmMaxTokens\">{{ this.model()!.getUiNameForProperty('llmMaxTokens') }}</label>\r\n </p-floatlabel>\r\n\r\n </div>\r\n </p-fieldset>\r\n\r\n <div class=\"flex justify-end\">\r\n <p-button label=\"Speichern\" type=\"submit\" (onClick)=\"submitForm()\" (keyup.enter)=\"submitForm()\"\r\n [disabled]=\"!form.dirty\"></p-button>\r\n </div>\r\n </form>\r\n }\r\n </ng-template>\r\n <ng-template #footer>\r\n\r\n </ng-template>\r\n</sftech-base-dialog>\r\n","import { Component, inject } from '@angular/core';\r\nimport { BaseListComponent, IconProvider, PaginatorComponent } from '@sftech/ng-shared';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { Panel } from 'primeng/panel';\r\nimport { TableModule } from 'primeng/table';\r\nimport { IAgentResponseDto } from '../../../core/dtos/agent-response.dto';\r\nimport { IAgentUpdateDto } from '../../../core/dtos/agent-update-request.dto';\r\nimport { Agent } from '../../../core/models/agent.model';\r\nimport { AgentService } from '../../../core/services/agent.service';\r\nimport { AgentDisplayComponent } from '../agent-display/agent-display.component';\r\nimport {Button} from \"primeng/button\";\r\nimport {FaIconComponent} from \"@fortawesome/angular-fontawesome\";\r\n\r\n@Component({\r\n selector: 'sftech-prompts-list',\r\n imports: [PaginatorComponent, Panel, TableModule, Button, FaIconComponent],\r\n providers: [DialogService],\r\n templateUrl: './agents-list.component.html',\r\n styleUrl: './agents-list.component.css',\r\n})\r\nexport class AgentsListComponent extends BaseListComponent<Agent, IAgentUpdateDto, IAgentUpdateDto, IAgentResponseDto> {\r\n protected _repo = inject(AgentService);\r\n protected _route = 'agents';\r\n protected _modalComponent = AgentDisplayComponent;\r\n protected detailModalHeaderText = 'Agent-Details';\r\n\r\n public iconProvider = IconProvider;\r\n\r\n constructor() {\r\n super();\r\n }\r\n}\r\n","<h1 class=\"text-primary-900 font-bold text-xl p-2 my-4\">Agent-Übersicht</h1>\r\n\r\n@if (!data()) {\r\n <p-panel [toggleable]=\"false\">\r\n <p class=\"m-0\">\r\n Daten werden geladen...\r\n </p>\r\n </p-panel>\r\n} @else if (data()!.length === 0) {\r\n <p-panel [toggleable]=\"false\">\r\n <p class=\"m-0\">\r\n Es sind keine Prompts vorhanden.\r\n </p>\r\n </p-panel>\r\n} @else if (data()!.length > 0) {\r\n <p-table [value]=\"data()!\"\r\n stripedRows\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n selectionMode=\"single\"\r\n [resizableColumns]=\"true\"\r\n dataKey=\"id\"\r\n >\r\n <ng-template #header>\r\n <tr>\r\n @for(column of data()![0].propertiesToShow; track column) {\r\n <th>{{ data()![0].getUiNameForProperty(column) }}</th>\r\n }\r\n </tr>\r\n </ng-template>\r\n <ng-template #body let-prompt>\r\n <tr (click)=\"openDisplay(prompt.id)\" [pSelectableRow]=\"prompt\">\r\n @for(column of data()![0].propertiesToShow; track column) {\r\n <td style=\"white-space: pre-wrap\">\r\n {{ prompt.getPropertyValue(column) }}\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <sftech-paginator [pagination]=\"odata().pagination\" (odataChanged)=\"updatePagination($event)\"></sftech-paginator>\r\n <div class=\"flex justify-end p-2\">\r\n <p-button (onClick)=\"openDisplay(undefined)\">\r\n <fa-icon [icon]=\"iconProvider.add\"></fa-icon> Neuer Agent\r\n </p-button>\r\n </div>\r\n}\r\n\r\n","import { AgentsComponent } from './agents.component';\r\nimport { AgentsListComponent } from './components/agent/agents-list/agents-list.component';\r\n\r\nexport const agentsRoutes = [\r\n {\r\n path: '',\r\n component: AgentsComponent,\r\n children: [\r\n {\r\n path: '',\r\n component: AgentsListComponent,\r\n },\r\n ],\r\n },\r\n];\r\n"],"names":["i1"],"mappings":"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"}
|
|
@@ -5,13 +5,12 @@ import { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angula
|
|
|
5
5
|
import { Button } from 'primeng/button';
|
|
6
6
|
import { FloatLabel } from 'primeng/floatlabel';
|
|
7
7
|
import { InputText } from 'primeng/inputtext';
|
|
8
|
-
import { Panel } from 'primeng/panel';
|
|
9
8
|
import { ProgressSpinner } from 'primeng/progressspinner';
|
|
10
9
|
import { Select } from 'primeng/select';
|
|
11
10
|
import { map, switchMap, of, catchError } from 'rxjs';
|
|
12
|
-
import { A as AgentService } from './sftech-ng-orchestrator-agent.service-
|
|
13
|
-
import { O as OrcherstratorService } from './sftech-ng-orchestrator-sftech-ng-orchestrator-
|
|
14
|
-
import { P as PromptService, a as PromptHistoryService } from './sftech-ng-orchestrator-prompt.service-
|
|
11
|
+
import { A as AgentService } from './sftech-ng-orchestrator-agent.service-w7yNia2v.mjs';
|
|
12
|
+
import { O as OrcherstratorService } from './sftech-ng-orchestrator-sftech-ng-orchestrator-CgBxpVr9.mjs';
|
|
13
|
+
import { P as PromptService, a as PromptHistoryService } from './sftech-ng-orchestrator-prompt.service-DXvM-ziS.mjs';
|
|
15
14
|
import { Fieldset } from 'primeng/fieldset';
|
|
16
15
|
import { FormErrorDisplayComponent } from '@sftech/ng-shared';
|
|
17
16
|
import { MarkdownComponent } from 'ngx-markdown';
|
|
@@ -134,7 +133,7 @@ class ChatComponent {
|
|
|
134
133
|
}
|
|
135
134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: ChatComponent, decorators: [{
|
|
136
135
|
type: Component,
|
|
137
|
-
args: [{ selector: 'sftech-chat', imports: [ReactiveFormsModule, FloatLabel, InputText, Button,
|
|
136
|
+
args: [{ selector: 'sftech-chat', imports: [ReactiveFormsModule, FloatLabel, InputText, Button, ProgressSpinner, Select, Fieldset, BoldedInputVarPipe, FormErrorDisplayComponent, MarkdownComponent], template: "<div class=\"flex flex-col items-center justify-center mb-10 mt-5 py-10 px-5 border-[1px] border-primary-500 rounded\">\r\n @if (status() === statuses.ANSWERED) {\r\n <div class=\"font-bold\">\r\n <p>Ingolf sagt:</p>\r\n </div>\r\n <markdown style=\"display: block; width: 100%; word-wrap: break-word\" [data]=\"answer()\"></markdown>\r\n } @else if (status() === statuses.ERROR) {\r\n <div class=\"font-bold\">\r\n <p>Ups... Ein Fehler ist aufgetreten</p>\r\n </div>\r\n <div class=\"mt-7\">\r\n Beim Senden deiner Nachricht an unseren Server ist ein Fehler aufgetreten. Bitte versuche es sp\u00E4ter\r\n noch einmal.\r\n </div>\r\n } @else if (status() === statuses.REQUESTING) {\r\n <div class=\"font-bold\">\r\n <p>Deine Anfrage wird verarbeitet</p>\r\n </div>\r\n <p class=\"mt-7\">\r\n <p-progress-spinner ariaLabel=\"loading\"/>\r\n </p>\r\n } @else if (status() === statuses.IDLE) {\r\n <div class=\"font-bold\">\r\n <p>Jetzt Anfrage senden</p>\r\n </div>\r\n <p class=\"mt-7\">\r\n Schicke uns jetzt deine Frage. Wir verfeinern diese um die bestm\u00F6gliche Antwort zu erhalten.\r\n </p>\r\n }\r\n</div>\r\n\r\n<form [formGroup]=\"form\" class=\"pt-2 mb-4\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-select id=\"agent\" formControlName=\"agent\" [options]=\"agents()!\" [dataKey]=\"'id'\" optionLabel=\"name\"\r\n [filter]=\"true\" filterBy=\"name\" class=\"w-full\"/>\r\n <label for=\"agent\">W\u00E4hle einen Agent</label>\r\n </p-floatlabel>\r\n</form>\r\n@if (getInputFormControlNames().length > 0) {\r\n <div class=\"bg-highlight border-[1px] border-primary-900 mb-4 p-2\">\r\n <p class=\"mb-5\">Im folgenden werden die im Template mit <span ngNonBindable class=\"font-bold\">{{ }}</span>\r\n markierten Bereiche durch deine Eingaben ersetzt:\r\n </p>\r\n <p-fieldset legend=\"Template\" class=\"mt-2\">\r\n <div [innerHTML]=\"selectedUserPrompt()?.template | boldInputVars\">\r\n\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n <form [formGroup]=\"inputForm\">\r\n <div class=\"grid grid-cols-3 gap-2\">\r\n @for (controlName of getInputFormControlNames(); track controlName) {\r\n <div>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"{{ controlName}}\" formControlName=\"{{ controlName }}\" pInputText\r\n class=\"w-full\"/>\r\n <label for=\"{{ controlName }}\">{{ controlName }}</label>\r\n </p-floatlabel>\r\n <sftech-form-error-display [control]=\"inputForm.get(controlName)!\"\r\n [label]=\"controlName\"></sftech-form-error-display>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"mt-2\">\r\n <p-button type=\"submit\" label=\"Senden\" (onClick)=\"run()\"/>\r\n </div>\r\n </form>\r\n}" }]
|
|
138
137
|
}], ctorParameters: () => [{ type: OrcherstratorService }, { type: AgentService }, { type: PromptService }, { type: PromptHistoryService }] });
|
|
139
138
|
var EOrchestratorStatus;
|
|
140
139
|
(function (EOrchestratorStatus) {
|
|
@@ -152,4 +151,4 @@ const chatRoutes = [
|
|
|
152
151
|
];
|
|
153
152
|
|
|
154
153
|
export { chatRoutes };
|
|
155
|
-
//# sourceMappingURL=sftech-ng-orchestrator-chat.routes-
|
|
154
|
+
//# sourceMappingURL=sftech-ng-orchestrator-chat.routes-D4nOLrzi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sftech-ng-orchestrator-chat.routes-D4nOLrzi.mjs","sources":["../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/core/pipes/bold-input-vars.pipe.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/chat/chat.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/chat/chat.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/chat/chat.routes.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'boldInputVars'\r\n})\r\n\r\nexport class BoldedInputVarPipe implements PipeTransform {\r\n transform(value: string | undefined): string {\r\n return value ? value.replace(/\\{\\{(.*?)\\}\\}/g, '<span class=\"font-bold\">{{ $1 }}</span>') : '';\r\n }\r\n}","import {Component, effect, OnInit, signal} from '@angular/core';\r\nimport {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';\r\nimport {Button} from 'primeng/button';\r\nimport {FloatLabel} from 'primeng/floatlabel';\r\nimport {InputText} from 'primeng/inputtext';\r\nimport {ProgressSpinner} from 'primeng/progressspinner';\r\nimport {Select} from 'primeng/select';\r\nimport {catchError, map, of, switchMap} from 'rxjs';\r\nimport {Agent} from '../agents/core/models/agent.model';\r\nimport {AgentService} from '../agents/core/services/agent.service';\r\nimport {OrcherstratorService} from '../core/service/orcherstrator.service';\r\nimport {PromptHistory} from '../prompts/core/models/prompt-history.model';\r\nimport {Prompt} from '../prompts/core/models/prompt.model';\r\nimport {PromptHistoryService} from '../prompts/core/services/prompt-history.service';\r\nimport {PromptService} from '../prompts/core/services/prompt.service';\r\nimport {Fieldset} from \"primeng/fieldset\";\r\nimport {BoldedInputVarPipe} from \"../core/pipes/bold-input-vars.pipe\";\r\nimport {FormErrorDisplayComponent} from \"@sftech/ng-shared\";\r\nimport {MarkdownComponent} from \"ngx-markdown\";\r\n\r\n@Component({\r\n selector: 'sftech-chat',\r\n imports: [ReactiveFormsModule, FloatLabel, InputText, Button, ProgressSpinner, Select, Fieldset, BoldedInputVarPipe, FormErrorDisplayComponent, MarkdownComponent],\r\n templateUrl: './chat.component.html',\r\n styleUrl: './chat.component.scss',\r\n})\r\nexport class ChatComponent implements OnInit {\r\n public answer = signal<string | undefined>(undefined);\r\n public status = signal<EOrchestratorStatus>(EOrchestratorStatus.IDLE);\r\n\r\n public agents = signal<Agent[] | undefined>(undefined);\r\n public selectedUserPrompt = signal<Prompt | PromptHistory | undefined>(undefined);\r\n\r\n public statuses = EOrchestratorStatus;\r\n\r\n public form = new FormGroup({\r\n agent: new FormControl<Agent | undefined | null>(undefined),\r\n });\r\n\r\n public inputForm = new FormGroup({});\r\n\r\n public constructor(\r\n private readonly orchestratorService: OrcherstratorService,\r\n private readonly agentService: AgentService,\r\n private readonly promptService: PromptService,\r\n private readonly promptHistoryService: PromptHistoryService,\r\n ) {\r\n effect(() => {\r\n if (!this.selectedUserPrompt()) {\r\n return;\r\n }\r\n this.selectedUserPrompt()!\r\n .template.match(/{{(.*?)}}/g)\r\n ?.forEach((m: string) => {\r\n const key = m.slice(2, -2);\r\n this.inputForm.addControl(key, new FormControl('', [Validators.required]));\r\n });\r\n });\r\n }\r\n\r\n public ngOnInit() {\r\n this.agentService\r\n .getAll()\r\n .pipe(\r\n map((res) => {\r\n if (!res.data) {\r\n this.status.set(EOrchestratorStatus.ERROR);\r\n }\r\n this.agents.set(res.data?.items);\r\n }),\r\n )\r\n .subscribe();\r\n this.form\r\n .get('agent')\r\n ?.valueChanges.pipe(\r\n switchMap((value: Agent | null | undefined) => {\r\n if (value) {\r\n if (value.llmUserPromptHistoryId) {\r\n return this.promptHistoryService.get(value.llmUserPromptHistoryId);\r\n }\r\n return this.promptService.get(value.llmUserPromptId);\r\n }\r\n this.selectedUserPrompt.set(undefined);\r\n this.inputForm = new FormGroup({});\r\n return of(null);\r\n }),\r\n map((res) => {\r\n if (!res?.data) {\r\n return;\r\n }\r\n this.selectedUserPrompt.set(res?.data as Prompt | PromptHistory);\r\n }),\r\n )\r\n .subscribe();\r\n }\r\n\r\n public run(): void {\r\n if (this.form.valid && this.inputForm.valid) {\r\n this.status.set(EOrchestratorStatus.REQUESTING);\r\n this.orchestratorService\r\n .runAgent({ agentIdentifier: this.form.get('agent')!.value!.identifier, userInput: this.inputForm.value })\r\n .pipe(\r\n map((res) => {\r\n this.answer.set(res.data?.message);\r\n this.status.set(EOrchestratorStatus.ANSWERED);\r\n }),\r\n catchError((err: unknown) => {\r\n console.error(err);\r\n this.status.set(EOrchestratorStatus.ERROR);\r\n return of();\r\n }),\r\n )\r\n .subscribe();\r\n } else {\r\n console.error('Form is invalid');\r\n }\r\n }\r\n\r\n public getInputFormControlNames(): string[] {\r\n return Object.keys(this.inputForm.controls);\r\n }\r\n\r\n public example = '**Aufwärmteil (25 min)**\\n' +\r\n '1. **Lauf ABC (5 min)** – Die Mädchen laufen spielerisch durch die Halle, dabei machen sie verschiedene Übungen (z.B. Knie hoch, Hacken an den Po, Seitensprünge). *Ziel:* Muskelaktivierung, Steigerung der Herzfrequenz, Verbesserung der Lauftechnik.\\n' +\r\n '2. **Ballgewöhnung (5 min)** – Im Laufen von einer zur anderen Hallenseite werfen sich die Mädchen gegenseitig den Ball zu. *Ziel:* Verbesserung der Ballkoordination, Feinmotorik und des Zusammenspiels.\\n' +\r\n '3. **Löwenspiel (5 min)** – Ein Mädchen (\\'Löwe\\') versucht, die anderen beim Überqueren des Feldes zu fangen. Gefangene Spielerinnen helfen beim Fangen. *Ziel:* Steigerung der Geschwindigkeit, Verbesserung der Reaktionszeit, Förderung der sozialen Interaktion.\\n' +\r\n '4. **\"Kleines\" Handballspiel (5 min)** – Die Mädchen spielen auf einem kleinen Feld (ohne Torwart) und mit nur einem Ball. *Ziel:* Verbesserung der Handballtechnik und des Teamgefühls, Motivation steigern.\\n' +\r\n '5. **Streching (5 min)** – Dehnen der wichtigen Muskelgruppen (Arme, Beine, Rumpf). *Ziel:* Vermeidung von Verletzungen, Förderung der Beweglichkeit. \\n' +\r\n '**Hauptteil (50 min)**\\n' +\r\n '1. **Passübungen (10 min)** – Die Mädchen passen sich den Ball in Zweiergruppen zu, wobei der Ball jeweils nach einem Prellschritt abgespielt wird. *Ziel:* Technikverfeinerung, Verbesserung des Rhythmusgefühls.\\n' +\r\n '2. **Ballstaffel (10 min)** – In Teams von vier Mädchen läuft jeweils das erste Mädchen mit Ball bis zur Mittellinie und zurück, passt dann den Ball zur nächsten Spielerin etc. *Ziel:* Verbesserung der Lauf- und Passtechnik, Förderung des Teamgeists.\\n' +\r\n '3. **3 gegen 2 (10 min)** – Zwei Abwehrspielerinnen versuchen, drei Angreiferinnen am Torwurf zu hindern. Bei Ballverlust findet ein Rollenwechsel statt. *Ziel:* Verbesserung der Abwehr- und Angriffsfähigkeiten, Steigerung des taktischen Verständnisses..\\n' +\r\n '4. **Torwurfübung (10 min)** – Ein Mädchen wirft aufs Tor, die anderen fangen den Ball und werfen ihn zurück. *Ziel:* Verbesserung der Wurftechnik, Steigerung der Treffsicherheit.\\n' +\r\n '5. **\"Großes\" Handballspiel (10 min)** – Die Mädchen spielen ein normales Handballspiel auf dem gesamten Spielfeld. *Ziel:* Anwendung der gelernten Techniken, Förderung des Teamgefühls, Spaß am Spiel.\\n' +\r\n '**Abschlussteil (15 min)**\\n' +\r\n '1. **Ausklang-Spiel (5 min)** – Spielerisches Abschlussspiel ohne Handball, z.B. \"Fischer, Fischer, wie tief ist das Wasser?\". *Ziel:* Normalisierung der Herzfrequenz, Förderung des Gruppenzusammenhalts.\\n' +\r\n '2. **Feedback-Runde (5 min)** – Jedes Mädchen gibt Feedback zum Training und zu einer Mitspielerin. *Ziel:* Förderung der Kommunikationsfähigkeiten, Aufbau eines positiven Trainingsklimas.\\n' +\r\n '3. **Entspannungsübung (5 min)** – Die Mädchen machen mit geschlossenen Augen eine Fantasiereise, um zur Ruhe zu kommen. *Ziel:* Mentale Entspannung, Abschluss des Trainings.\\n';\r\n}\r\n\r\nexport enum EOrchestratorStatus {\r\n IDLE = 'IDLE',\r\n REQUESTING = 'REQUESTING',\r\n ANSWERED = 'ANSWERED',\r\n ERROR = 'ERROR',\r\n}\r\n","<div class=\"flex flex-col items-center justify-center mb-10 mt-5 py-10 px-5 border-[1px] border-primary-500 rounded\">\r\n @if (status() === statuses.ANSWERED) {\r\n <div class=\"font-bold\">\r\n <p>Ingolf sagt:</p>\r\n </div>\r\n <markdown style=\"display: block; width: 100%; word-wrap: break-word\" [data]=\"answer()\"></markdown>\r\n } @else if (status() === statuses.ERROR) {\r\n <div class=\"font-bold\">\r\n <p>Ups... Ein Fehler ist aufgetreten</p>\r\n </div>\r\n <div class=\"mt-7\">\r\n Beim Senden deiner Nachricht an unseren Server ist ein Fehler aufgetreten. Bitte versuche es später\r\n noch einmal.\r\n </div>\r\n } @else if (status() === statuses.REQUESTING) {\r\n <div class=\"font-bold\">\r\n <p>Deine Anfrage wird verarbeitet</p>\r\n </div>\r\n <p class=\"mt-7\">\r\n <p-progress-spinner ariaLabel=\"loading\"/>\r\n </p>\r\n } @else if (status() === statuses.IDLE) {\r\n <div class=\"font-bold\">\r\n <p>Jetzt Anfrage senden</p>\r\n </div>\r\n <p class=\"mt-7\">\r\n Schicke uns jetzt deine Frage. Wir verfeinern diese um die bestmögliche Antwort zu erhalten.\r\n </p>\r\n }\r\n</div>\r\n\r\n<form [formGroup]=\"form\" class=\"pt-2 mb-4\">\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <p-select id=\"agent\" formControlName=\"agent\" [options]=\"agents()!\" [dataKey]=\"'id'\" optionLabel=\"name\"\r\n [filter]=\"true\" filterBy=\"name\" class=\"w-full\"/>\r\n <label for=\"agent\">Wähle einen Agent</label>\r\n </p-floatlabel>\r\n</form>\r\n@if (getInputFormControlNames().length > 0) {\r\n <div class=\"bg-highlight border-[1px] border-primary-900 mb-4 p-2\">\r\n <p class=\"mb-5\">Im folgenden werden die im Template mit <span ngNonBindable class=\"font-bold\">{{ }}</span>\r\n markierten Bereiche durch deine Eingaben ersetzt:\r\n </p>\r\n <p-fieldset legend=\"Template\" class=\"mt-2\">\r\n <div [innerHTML]=\"selectedUserPrompt()?.template | boldInputVars\">\r\n\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n <form [formGroup]=\"inputForm\">\r\n <div class=\"grid grid-cols-3 gap-2\">\r\n @for (controlName of getInputFormControlNames(); track controlName) {\r\n <div>\r\n <p-floatlabel variant=\"in\" class=\"w-full\">\r\n <input type=\"text\" id=\"{{ controlName}}\" formControlName=\"{{ controlName }}\" pInputText\r\n class=\"w-full\"/>\r\n <label for=\"{{ controlName }}\">{{ controlName }}</label>\r\n </p-floatlabel>\r\n <sftech-form-error-display [control]=\"inputForm.get(controlName)!\"\r\n [label]=\"controlName\"></sftech-form-error-display>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"mt-2\">\r\n <p-button type=\"submit\" label=\"Senden\" (onClick)=\"run()\"/>\r\n </div>\r\n </form>\r\n}","import {ChatComponent} from \"./chat.component\";\r\n\r\nexport const chatRoutes = [\r\n {\r\n path: '',\r\n component: ChatComponent\r\n }\r\n];"],"names":["i1.OrcherstratorService","i2.AgentService","i3.PromptService","i4.PromptHistoryService"],"mappings":"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"}
|