@sftech/ng-orchestrator 0.0.11 → 0.0.13
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-CM9cDrXP.mjs → sftech-ng-orchestrator-agent.service-B1eDDbBp.mjs} +3 -3
- package/fesm2022/{sftech-ng-orchestrator-agent.service-CM9cDrXP.mjs.map → sftech-ng-orchestrator-agent.service-B1eDDbBp.mjs.map} +1 -1
- package/fesm2022/sftech-ng-orchestrator-agents.routes-DMY81ODI.mjs +218 -0
- package/fesm2022/sftech-ng-orchestrator-agents.routes-DMY81ODI.mjs.map +1 -0
- package/fesm2022/sftech-ng-orchestrator-chat.routes-VZLqUmet.mjs +154 -0
- package/fesm2022/sftech-ng-orchestrator-chat.routes-VZLqUmet.mjs.map +1 -0
- package/fesm2022/{sftech-ng-orchestrator-prompt-display.component-5a8wT14o.mjs → sftech-ng-orchestrator-prompt-display.component-Cs98Is_J.mjs} +2 -2
- package/fesm2022/{sftech-ng-orchestrator-prompt-display.component-5a8wT14o.mjs.map → sftech-ng-orchestrator-prompt-display.component-Cs98Is_J.mjs.map} +1 -1
- package/fesm2022/{sftech-ng-orchestrator-prompt.service-BQ9cKQCm.mjs → sftech-ng-orchestrator-prompt.service-5pF5b4ys.mjs} +2 -2
- package/fesm2022/{sftech-ng-orchestrator-prompt.service-BQ9cKQCm.mjs.map → sftech-ng-orchestrator-prompt.service-5pF5b4ys.mjs.map} +1 -1
- package/fesm2022/{sftech-ng-orchestrator-prompts.routes-DLAz29Gn.mjs → sftech-ng-orchestrator-prompts.routes-C_K_TNaw.mjs} +3 -3
- package/fesm2022/{sftech-ng-orchestrator-prompts.routes-DLAz29Gn.mjs.map → sftech-ng-orchestrator-prompts.routes-C_K_TNaw.mjs.map} +1 -1
- package/fesm2022/{sftech-ng-orchestrator-sftech-ng-orchestrator-QxboGYpc.mjs → sftech-ng-orchestrator-sftech-ng-orchestrator-BVqY_Vj9.mjs} +4 -4
- package/fesm2022/{sftech-ng-orchestrator-sftech-ng-orchestrator-QxboGYpc.mjs.map → sftech-ng-orchestrator-sftech-ng-orchestrator-BVqY_Vj9.mjs.map} +1 -1
- package/fesm2022/sftech-ng-orchestrator.mjs +1 -1
- package/lib/ng-orchestrator/agents/components/agent/agent-display/agent-display.component.d.ts +4 -3
- package/lib/ng-orchestrator/agents/components/agent/agent-display/prompt-helper-modal/prompt-helper-modal.component.d.ts +12 -0
- package/lib/ng-orchestrator/agents/core/dtos/agent-create-request.dto.d.ts +1 -0
- package/lib/ng-orchestrator/chat/chat.component.d.ts +1 -1
- package/package.json +2 -2
- package/fesm2022/sftech-ng-orchestrator-agents.routes-GsOhn5LG.mjs +0 -159
- package/fesm2022/sftech-ng-orchestrator-agents.routes-GsOhn5LG.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-chat.routes-BiKjhPDt.mjs +0 -154
- package/fesm2022/sftech-ng-orchestrator-chat.routes-BiKjhPDt.mjs.map +0 -1
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { Pipe, signal, effect, Component } from '@angular/core';
|
|
3
|
-
import * as i1 from '@angular/forms';
|
|
4
|
-
import { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
-
import { Button } from 'primeng/button';
|
|
6
|
-
import { FloatLabel } from 'primeng/floatlabel';
|
|
7
|
-
import { InputText } from 'primeng/inputtext';
|
|
8
|
-
import { ProgressSpinner } from 'primeng/progressspinner';
|
|
9
|
-
import { Select } from 'primeng/select';
|
|
10
|
-
import { map, switchMap, of, catchError } from 'rxjs';
|
|
11
|
-
import { A as AgentService } from './sftech-ng-orchestrator-agent.service-CM9cDrXP.mjs';
|
|
12
|
-
import { O as OrcherstratorService } from './sftech-ng-orchestrator-sftech-ng-orchestrator-QxboGYpc.mjs';
|
|
13
|
-
import { P as PromptService, a as PromptHistoryService } from './sftech-ng-orchestrator-prompt.service-BQ9cKQCm.mjs';
|
|
14
|
-
import { Fieldset } from 'primeng/fieldset';
|
|
15
|
-
import { FormErrorDisplayComponent } from '@sftech/ng-shared';
|
|
16
|
-
import { MarkdownComponent } from 'ngx-markdown';
|
|
17
|
-
|
|
18
|
-
class BoldedInputVarPipe {
|
|
19
|
-
transform(value) {
|
|
20
|
-
return value ? value.replace(/\{\{(.*?)\}\}/g, '<span class="font-bold">{{ $1 }}</span>') : '';
|
|
21
|
-
}
|
|
22
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BoldedInputVarPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
23
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: BoldedInputVarPipe, isStandalone: true, name: "boldInputVars" });
|
|
24
|
-
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BoldedInputVarPipe, decorators: [{
|
|
26
|
-
type: Pipe,
|
|
27
|
-
args: [{
|
|
28
|
-
name: 'boldInputVars'
|
|
29
|
-
}]
|
|
30
|
-
}] });
|
|
31
|
-
|
|
32
|
-
class ChatComponent {
|
|
33
|
-
orchestratorService;
|
|
34
|
-
agentService;
|
|
35
|
-
promptService;
|
|
36
|
-
promptHistoryService;
|
|
37
|
-
answer = signal(undefined);
|
|
38
|
-
status = signal(EOrchestratorStatus.IDLE);
|
|
39
|
-
agents = signal(undefined);
|
|
40
|
-
selectedUserPrompt = signal(undefined);
|
|
41
|
-
statuses = EOrchestratorStatus;
|
|
42
|
-
form = new FormGroup({
|
|
43
|
-
agent: new FormControl(undefined),
|
|
44
|
-
});
|
|
45
|
-
inputForm = new FormGroup({});
|
|
46
|
-
constructor(orchestratorService, agentService, promptService, promptHistoryService) {
|
|
47
|
-
this.orchestratorService = orchestratorService;
|
|
48
|
-
this.agentService = agentService;
|
|
49
|
-
this.promptService = promptService;
|
|
50
|
-
this.promptHistoryService = promptHistoryService;
|
|
51
|
-
effect(() => {
|
|
52
|
-
if (!this.selectedUserPrompt()) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
this.selectedUserPrompt()
|
|
56
|
-
.template.match(/{{(.*?)}}/g)
|
|
57
|
-
?.forEach((m) => {
|
|
58
|
-
const key = m.slice(2, -2);
|
|
59
|
-
this.inputForm.addControl(key, new FormControl('', [Validators.required]));
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
ngOnInit() {
|
|
64
|
-
this.agentService
|
|
65
|
-
.getAll()
|
|
66
|
-
.pipe(map((res) => {
|
|
67
|
-
if (!res.data) {
|
|
68
|
-
this.status.set(EOrchestratorStatus.ERROR);
|
|
69
|
-
}
|
|
70
|
-
this.agents.set(res.data?.items);
|
|
71
|
-
}))
|
|
72
|
-
.subscribe();
|
|
73
|
-
this.form
|
|
74
|
-
.get('agent')
|
|
75
|
-
?.valueChanges.pipe(switchMap((value) => {
|
|
76
|
-
if (value) {
|
|
77
|
-
if (value.llmUserPromptHistoryId) {
|
|
78
|
-
return this.promptHistoryService.get(value.llmUserPromptHistoryId);
|
|
79
|
-
}
|
|
80
|
-
return this.promptService.get(value.llmUserPromptId);
|
|
81
|
-
}
|
|
82
|
-
this.selectedUserPrompt.set(undefined);
|
|
83
|
-
this.inputForm = new FormGroup({});
|
|
84
|
-
return of(null);
|
|
85
|
-
}), map((res) => {
|
|
86
|
-
if (!res?.data) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
this.selectedUserPrompt.set(res?.data);
|
|
90
|
-
}))
|
|
91
|
-
.subscribe();
|
|
92
|
-
}
|
|
93
|
-
run() {
|
|
94
|
-
if (this.form.valid && this.inputForm.valid) {
|
|
95
|
-
this.status.set(EOrchestratorStatus.REQUESTING);
|
|
96
|
-
this.orchestratorService
|
|
97
|
-
.runAgent({ agentIdentifier: this.form.get('agent').value.identifier, userInput: this.inputForm.value })
|
|
98
|
-
.pipe(map((res) => {
|
|
99
|
-
this.answer.set(res.data?.message);
|
|
100
|
-
this.status.set(EOrchestratorStatus.ANSWERED);
|
|
101
|
-
}), catchError((err) => {
|
|
102
|
-
console.error(err);
|
|
103
|
-
this.status.set(EOrchestratorStatus.ERROR);
|
|
104
|
-
return of();
|
|
105
|
-
}))
|
|
106
|
-
.subscribe();
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
console.error('Form is invalid');
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
getInputFormControlNames() {
|
|
113
|
-
return Object.keys(this.inputForm.controls);
|
|
114
|
-
}
|
|
115
|
-
example = '**Aufwärmteil (25 min)**\n' +
|
|
116
|
-
'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' +
|
|
117
|
-
'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' +
|
|
118
|
-
'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' +
|
|
119
|
-
'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' +
|
|
120
|
-
'5. **Streching (5 min)** – Dehnen der wichtigen Muskelgruppen (Arme, Beine, Rumpf). *Ziel:* Vermeidung von Verletzungen, Förderung der Beweglichkeit. \n' +
|
|
121
|
-
'**Hauptteil (50 min)**\n' +
|
|
122
|
-
'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' +
|
|
123
|
-
'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' +
|
|
124
|
-
'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' +
|
|
125
|
-
'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' +
|
|
126
|
-
'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' +
|
|
127
|
-
'**Abschlussteil (15 min)**\n' +
|
|
128
|
-
'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' +
|
|
129
|
-
'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' +
|
|
130
|
-
'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';
|
|
131
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ChatComponent, deps: [{ token: OrcherstratorService }, { token: AgentService }, { token: PromptService }, { token: PromptHistoryService }], target: i0.ɵɵFactoryTarget.Component });
|
|
132
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: ChatComponent, isStandalone: true, selector: "sftech-chat", ngImport: i0, 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}", 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.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: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { 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: ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "size", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "fluid", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "pipe", type: BoldedInputVarPipe, name: "boldInputVars" }, { kind: "component", type: FormErrorDisplayComponent, selector: "sftech-form-error-display", inputs: ["control", "label"] }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }] });
|
|
133
|
-
}
|
|
134
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ChatComponent, decorators: [{
|
|
135
|
-
type: Component,
|
|
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}" }]
|
|
137
|
-
}], ctorParameters: () => [{ type: OrcherstratorService }, { type: AgentService }, { type: PromptService }, { type: PromptHistoryService }] });
|
|
138
|
-
var EOrchestratorStatus;
|
|
139
|
-
(function (EOrchestratorStatus) {
|
|
140
|
-
EOrchestratorStatus["IDLE"] = "IDLE";
|
|
141
|
-
EOrchestratorStatus["REQUESTING"] = "REQUESTING";
|
|
142
|
-
EOrchestratorStatus["ANSWERED"] = "ANSWERED";
|
|
143
|
-
EOrchestratorStatus["ERROR"] = "ERROR";
|
|
144
|
-
})(EOrchestratorStatus || (EOrchestratorStatus = {}));
|
|
145
|
-
|
|
146
|
-
const chatRoutes = [
|
|
147
|
-
{
|
|
148
|
-
path: '',
|
|
149
|
-
component: ChatComponent
|
|
150
|
-
}
|
|
151
|
-
];
|
|
152
|
-
|
|
153
|
-
export { chatRoutes };
|
|
154
|
-
//# sourceMappingURL=sftech-ng-orchestrator-chat.routes-BiKjhPDt.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sftech-ng-orchestrator-chat.routes-BiKjhPDt.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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"}
|