@memberjunction/ng-core-entity-forms 6.2.0-edge.3 → 6.2.0-edge.5
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/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +12 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +43 -26
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +7 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +191 -178
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts +48 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts.map +1 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js +195 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js.map +1 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +324 -322
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +16 -3
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.js +103 -43
- package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +8 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +18 -4
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.component.d.ts +5 -5
- package/dist/lib/custom/Files/file-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Files/file-form.component.js +227 -157
- package/dist/lib/custom/Files/file-form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.logic.d.ts +24 -0
- package/dist/lib/custom/Files/file-form.logic.d.ts.map +1 -0
- package/dist/lib/custom/Files/file-form.logic.js +57 -0
- package/dist/lib/custom/Files/file-form.logic.js.map +1 -0
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +3 -2
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +2 -2
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +6 -3
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +3 -3
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js +5 -7
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts +34 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js +33 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +3 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +261 -242
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +8 -8
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +37 -5
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +155 -79
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +8 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +59 -8
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +34 -9
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +164 -43
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js +3 -1
- package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +82 -79
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +16 -2
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +65 -47
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +115 -117
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +64 -24
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +74 -52
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js +86 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js +132 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js +12 -10
- package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +86 -32
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +25 -7
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +180 -160
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js +16 -14
- package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js +23 -21
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js +21 -19
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +30 -20
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +32 -14
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.js +111 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +59 -67
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +35 -17
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +112 -94
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js +130 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -14
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +23 -19
- package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +29 -27
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +17 -15
- package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +27 -9
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.js +106 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js +29 -11
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js +13 -3
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +788 -714
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js +31 -25
- package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +286 -281
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +15 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/feature-values/feature-values.logic.d.ts +55 -0
- package/dist/lib/panels/feature-values/feature-values.logic.d.ts.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.logic.js +88 -0
- package/dist/lib/panels/feature-values/feature-values.logic.js.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.panel.d.ts +39 -0
- package/dist/lib/panels/feature-values/feature-values.panel.d.ts.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.panel.js +303 -0
- package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -0
- package/dist/lib/shared/components/template-editor.component.js +2 -2
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +48 -47
|
@@ -5,6 +5,7 @@ import { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
|
|
|
5
5
|
import { WalkAgentRunTree } from '@memberjunction/ai-core-plus';
|
|
6
6
|
import { TOKEN_PRICE_UNIT_TYPE_DIVISORS } from '@memberjunction/ai-engine-base';
|
|
7
7
|
import * as d3 from 'd3';
|
|
8
|
+
import { SplitPromptRunCost } from './agent-run-cost-split';
|
|
8
9
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
10
11
|
import * as i1 from "./ai-agent-run-cost.service";
|
|
@@ -37,7 +38,7 @@ function AIAgentRunAnalyticsComponent_Conditional_2_Template(rf, ctx) { if (rf &
|
|
|
37
38
|
i0.ɵɵproperty("Message", ctx_r1.error);
|
|
38
39
|
} }
|
|
39
40
|
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
40
|
-
i0.ɵɵelement(0, "i",
|
|
41
|
+
i0.ɵɵelement(0, "i", 67);
|
|
41
42
|
i0.ɵɵtext(1, " Overview ");
|
|
42
43
|
} }
|
|
43
44
|
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -92,6 +93,15 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_42_Template(rf,
|
|
|
92
93
|
i0.ɵɵtextInterpolate2("input ", ctx_r1.formatCost(ctx_r1.inputCost), " \u00B7 output ", ctx_r1.formatCost(ctx_r1.outputCost));
|
|
93
94
|
} }
|
|
94
95
|
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
96
|
+
i0.ɵɵelementStart(0, "span", 32);
|
|
97
|
+
i0.ɵɵtext(1);
|
|
98
|
+
i0.ɵɵelementEnd();
|
|
99
|
+
} if (rf & 2) {
|
|
100
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
101
|
+
i0.ɵɵadvance();
|
|
102
|
+
i0.ɵɵtextInterpolate1("avatar video ", ctx_r1.FormatCost(ctx_r1.AvatarVideoCost));
|
|
103
|
+
} }
|
|
104
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
95
105
|
i0.ɵɵelementStart(0, "span", 25);
|
|
96
106
|
i0.ɵɵtext(1);
|
|
97
107
|
i0.ɵɵpipe(2, "number");
|
|
@@ -101,7 +111,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_43_Template(rf,
|
|
|
101
111
|
i0.ɵɵadvance();
|
|
102
112
|
i0.ɵɵtextInterpolate2("saved ", ctx_r1.formatCost(ctx_r1.cacheSavings), " (", i0.ɵɵpipeBind2(2, 2, ctx_r1.cacheSavingsPct, "1.0-0"), "%) via cache");
|
|
103
113
|
} }
|
|
104
|
-
function
|
|
114
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
105
115
|
i0.ɵɵelementStart(0, "span");
|
|
106
116
|
i0.ɵɵtext(1);
|
|
107
117
|
i0.ɵɵpipe(2, "number");
|
|
@@ -111,7 +121,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_56_Template(rf,
|
|
|
111
121
|
i0.ɵɵadvance();
|
|
112
122
|
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(2, 1, ctx_r1.promptMetrics.tokenUsage.totalCacheWrite), " written");
|
|
113
123
|
} }
|
|
114
|
-
function
|
|
124
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_58_Template(rf, ctx) { if (rf & 1) {
|
|
115
125
|
i0.ɵɵelementStart(0, "span");
|
|
116
126
|
i0.ɵɵtext(1);
|
|
117
127
|
i0.ɵɵpipe(2, "number");
|
|
@@ -121,15 +131,15 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_57_Template(rf,
|
|
|
121
131
|
i0.ɵɵadvance();
|
|
122
132
|
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind2(2, 1, ctx_r1.cacheHitRatePct, "1.0-0"), "% hit rate");
|
|
123
133
|
} }
|
|
124
|
-
function
|
|
134
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_71_Template(rf, ctx) { if (rf & 1) {
|
|
125
135
|
i0.ɵɵelement(0, "i", 21);
|
|
126
136
|
i0.ɵɵtext(1, " Prompt Analytics ");
|
|
127
137
|
} }
|
|
128
|
-
function
|
|
138
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_73_Template(rf, ctx) { if (rf & 1) {
|
|
129
139
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
130
|
-
i0.ɵɵelementStart(0, "div",
|
|
131
|
-
i0.ɵɵlistener("click", function
|
|
132
|
-
i0.ɵɵelement(2, "i",
|
|
140
|
+
i0.ɵɵelementStart(0, "div", 38)(1, "button", 43);
|
|
141
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_73_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleViewMode()); });
|
|
142
|
+
i0.ɵɵelement(2, "i", 44);
|
|
133
143
|
i0.ɵɵtext(3);
|
|
134
144
|
i0.ɵɵelementEnd()();
|
|
135
145
|
} if (rf & 2) {
|
|
@@ -139,13 +149,13 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_72_Template(rf,
|
|
|
139
149
|
i0.ɵɵadvance();
|
|
140
150
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.viewMode === "grid" ? "Expand All" : "Collapse All", " ");
|
|
141
151
|
} }
|
|
142
|
-
function
|
|
143
|
-
i0.ɵɵelement(0, "mj-empty-state",
|
|
152
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_74_Template(rf, ctx) { if (rf & 1) {
|
|
153
|
+
i0.ɵɵelement(0, "mj-empty-state", 39);
|
|
144
154
|
} }
|
|
145
|
-
function
|
|
146
|
-
i0.ɵɵelementStart(0, "div",
|
|
147
|
-
i0.ɵɵelement(1, "span",
|
|
148
|
-
i0.ɵɵelementStart(2, "span",
|
|
155
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
156
|
+
i0.ɵɵelementStart(0, "div", 76);
|
|
157
|
+
i0.ɵɵelement(1, "span", 77);
|
|
158
|
+
i0.ɵɵelementStart(2, "span", 78);
|
|
149
159
|
i0.ɵɵtext(3);
|
|
150
160
|
i0.ɵɵelementEnd()();
|
|
151
161
|
} if (rf & 2) {
|
|
@@ -156,9 +166,9 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_74_Conditional_1
|
|
|
156
166
|
i0.ɵɵadvance(2);
|
|
157
167
|
i0.ɵɵtextInterpolate3("", item_r6.key, ": ", item_r6.value.count, " (", (item_r6.value.count / ctx_r1.promptMetrics.totalCount * 100).toFixed(1), "%)");
|
|
158
168
|
} }
|
|
159
|
-
function
|
|
160
|
-
i0.ɵɵelementStart(0, "div",
|
|
161
|
-
i0.ɵɵrepeaterCreate(1,
|
|
169
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
170
|
+
i0.ɵɵelementStart(0, "div", 70);
|
|
171
|
+
i0.ɵɵrepeaterCreate(1, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Conditional_12_For_2_Template, 4, 5, "div", 76, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
162
172
|
i0.ɵɵpipe(3, "keyvalue");
|
|
163
173
|
i0.ɵɵelementEnd();
|
|
164
174
|
} if (rf & 2) {
|
|
@@ -166,58 +176,58 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_74_Conditional_1
|
|
|
166
176
|
i0.ɵɵadvance();
|
|
167
177
|
i0.ɵɵrepeater(i0.ɵɵpipeBind1(3, 0, ctx_r1.promptMetrics.byModel));
|
|
168
178
|
} }
|
|
169
|
-
function
|
|
179
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Template(rf, ctx) { if (rf & 1) {
|
|
170
180
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
171
|
-
i0.ɵɵelementStart(0, "div",
|
|
172
|
-
i0.ɵɵlistener("click", function
|
|
181
|
+
i0.ɵɵelementStart(0, "div", 40)(1, "div", 46)(2, "div", 47);
|
|
182
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("modelDistribution")); });
|
|
173
183
|
i0.ɵɵelementStart(3, "h3");
|
|
174
|
-
i0.ɵɵelement(4, "i",
|
|
184
|
+
i0.ɵɵelement(4, "i", 68);
|
|
175
185
|
i0.ɵɵtext(5, " Prompts by Model");
|
|
176
186
|
i0.ɵɵelementEnd();
|
|
177
|
-
i0.ɵɵelementStart(6, "button",
|
|
178
|
-
i0.ɵɵelement(7, "i",
|
|
187
|
+
i0.ɵɵelementStart(6, "button", 49);
|
|
188
|
+
i0.ɵɵelement(7, "i", 50);
|
|
179
189
|
i0.ɵɵelementEnd()();
|
|
180
|
-
i0.ɵɵelementStart(8, "div",
|
|
181
|
-
i0.ɵɵelement(10, "div",
|
|
182
|
-
i0.ɵɵconditionalCreate(12,
|
|
190
|
+
i0.ɵɵelementStart(8, "div", 51)(9, "div", 52);
|
|
191
|
+
i0.ɵɵelement(10, "div", 69, 2);
|
|
192
|
+
i0.ɵɵconditionalCreate(12, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Conditional_12_Template, 4, 2, "div", 70);
|
|
183
193
|
i0.ɵɵelementEnd()()();
|
|
184
|
-
i0.ɵɵelementStart(13, "div",
|
|
185
|
-
i0.ɵɵlistener("click", function
|
|
194
|
+
i0.ɵɵelementStart(13, "div", 46)(14, "div", 47);
|
|
195
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Template_div_click_14_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("executionTime")); });
|
|
186
196
|
i0.ɵɵelementStart(15, "h3");
|
|
187
|
-
i0.ɵɵelement(16, "i",
|
|
197
|
+
i0.ɵɵelement(16, "i", 36);
|
|
188
198
|
i0.ɵɵtext(17, " Average Execution Time by Vendor");
|
|
189
199
|
i0.ɵɵelementEnd();
|
|
190
|
-
i0.ɵɵelementStart(18, "button",
|
|
191
|
-
i0.ɵɵelement(19, "i",
|
|
200
|
+
i0.ɵɵelementStart(18, "button", 49);
|
|
201
|
+
i0.ɵɵelement(19, "i", 50);
|
|
192
202
|
i0.ɵɵelementEnd()();
|
|
193
|
-
i0.ɵɵelementStart(20, "div",
|
|
194
|
-
i0.ɵɵelement(22, "div",
|
|
203
|
+
i0.ɵɵelementStart(20, "div", 51)(21, "div", 52);
|
|
204
|
+
i0.ɵɵelement(22, "div", 71, 3);
|
|
195
205
|
i0.ɵɵelementEnd()()();
|
|
196
|
-
i0.ɵɵelementStart(24, "div",
|
|
197
|
-
i0.ɵɵlistener("click", function
|
|
206
|
+
i0.ɵɵelementStart(24, "div", 46)(25, "div", 47);
|
|
207
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Template_div_click_25_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("costByVendor")); });
|
|
198
208
|
i0.ɵɵelementStart(26, "h3");
|
|
199
209
|
i0.ɵɵelement(27, "i", 30);
|
|
200
210
|
i0.ɵɵtext(28, " Cost Distribution by Vendor");
|
|
201
211
|
i0.ɵɵelementEnd();
|
|
202
|
-
i0.ɵɵelementStart(29, "button",
|
|
203
|
-
i0.ɵɵelement(30, "i",
|
|
212
|
+
i0.ɵɵelementStart(29, "button", 49);
|
|
213
|
+
i0.ɵɵelement(30, "i", 50);
|
|
204
214
|
i0.ɵɵelementEnd()();
|
|
205
|
-
i0.ɵɵelementStart(31, "div",
|
|
206
|
-
i0.ɵɵelement(33, "div",
|
|
207
|
-
i0.ɵɵelementStart(35, "div",
|
|
215
|
+
i0.ɵɵelementStart(31, "div", 51)(32, "div", 52);
|
|
216
|
+
i0.ɵɵelement(33, "div", 72, 4);
|
|
217
|
+
i0.ɵɵelementStart(35, "div", 73);
|
|
208
218
|
i0.ɵɵtext(36);
|
|
209
219
|
i0.ɵɵelementEnd()()()();
|
|
210
|
-
i0.ɵɵelementStart(37, "div",
|
|
211
|
-
i0.ɵɵlistener("click", function
|
|
220
|
+
i0.ɵɵelementStart(37, "div", 46)(38, "div", 47);
|
|
221
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Template_div_click_38_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("tokenUsage")); });
|
|
212
222
|
i0.ɵɵelementStart(39, "h3");
|
|
213
|
-
i0.ɵɵelement(40, "i",
|
|
223
|
+
i0.ɵɵelement(40, "i", 74);
|
|
214
224
|
i0.ɵɵtext(41, " Token Usage by Model");
|
|
215
225
|
i0.ɵɵelementEnd();
|
|
216
|
-
i0.ɵɵelementStart(42, "button",
|
|
217
|
-
i0.ɵɵelement(43, "i",
|
|
226
|
+
i0.ɵɵelementStart(42, "button", 49);
|
|
227
|
+
i0.ɵɵelement(43, "i", 50);
|
|
218
228
|
i0.ɵɵelementEnd()();
|
|
219
|
-
i0.ɵɵelementStart(44, "div",
|
|
220
|
-
i0.ɵɵelement(46, "div",
|
|
229
|
+
i0.ɵɵelementStart(44, "div", 51)(45, "div", 52);
|
|
230
|
+
i0.ɵɵelement(46, "div", 75, 5);
|
|
221
231
|
i0.ɵɵelementEnd()()()();
|
|
222
232
|
} if (rf & 2) {
|
|
223
233
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -250,55 +260,55 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_74_Template(rf,
|
|
|
250
260
|
i0.ɵɵadvance();
|
|
251
261
|
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["tokenUsage"] ? "fa-compress" : "fa-expand");
|
|
252
262
|
} }
|
|
253
|
-
function
|
|
263
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_76_Template(rf, ctx) { if (rf & 1) {
|
|
254
264
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
255
|
-
i0.ɵɵelementStart(0, "div",
|
|
256
|
-
i0.ɵɵlistener("click", function
|
|
265
|
+
i0.ɵɵelementStart(0, "div", 41)(1, "div", 46)(2, "div", 47);
|
|
266
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_76_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptTime")); });
|
|
257
267
|
i0.ɵɵelementStart(3, "h3");
|
|
258
|
-
i0.ɵɵelement(4, "i",
|
|
268
|
+
i0.ɵɵelement(4, "i", 79);
|
|
259
269
|
i0.ɵɵtext(5, " Average Execution Time by Prompt");
|
|
260
270
|
i0.ɵɵelementEnd();
|
|
261
|
-
i0.ɵɵelementStart(6, "button",
|
|
262
|
-
i0.ɵɵelement(7, "i",
|
|
271
|
+
i0.ɵɵelementStart(6, "button", 49);
|
|
272
|
+
i0.ɵɵelement(7, "i", 50);
|
|
263
273
|
i0.ɵɵelementEnd()();
|
|
264
|
-
i0.ɵɵelementStart(8, "div",
|
|
265
|
-
i0.ɵɵelement(10, "div",
|
|
274
|
+
i0.ɵɵelementStart(8, "div", 51)(9, "div", 52);
|
|
275
|
+
i0.ɵɵelement(10, "div", 80, 6);
|
|
266
276
|
i0.ɵɵelementEnd()()();
|
|
267
|
-
i0.ɵɵelementStart(12, "div",
|
|
268
|
-
i0.ɵɵlistener("click", function
|
|
277
|
+
i0.ɵɵelementStart(12, "div", 46)(13, "div", 47);
|
|
278
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_76_Template_div_click_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptToken")); });
|
|
269
279
|
i0.ɵɵelementStart(14, "h3");
|
|
270
|
-
i0.ɵɵelement(15, "i",
|
|
280
|
+
i0.ɵɵelement(15, "i", 81);
|
|
271
281
|
i0.ɵɵtext(16, " Token Usage by Prompt");
|
|
272
282
|
i0.ɵɵelementEnd();
|
|
273
|
-
i0.ɵɵelementStart(17, "button",
|
|
274
|
-
i0.ɵɵelement(18, "i",
|
|
283
|
+
i0.ɵɵelementStart(17, "button", 49);
|
|
284
|
+
i0.ɵɵelement(18, "i", 50);
|
|
275
285
|
i0.ɵɵelementEnd()();
|
|
276
|
-
i0.ɵɵelementStart(19, "div",
|
|
277
|
-
i0.ɵɵelement(21, "div",
|
|
286
|
+
i0.ɵɵelementStart(19, "div", 51)(20, "div", 52);
|
|
287
|
+
i0.ɵɵelement(21, "div", 82, 7);
|
|
278
288
|
i0.ɵɵelementEnd()()();
|
|
279
|
-
i0.ɵɵelementStart(23, "div",
|
|
280
|
-
i0.ɵɵlistener("click", function
|
|
289
|
+
i0.ɵɵelementStart(23, "div", 46)(24, "div", 47);
|
|
290
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_76_Template_div_click_24_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCost")); });
|
|
281
291
|
i0.ɵɵelementStart(25, "h3");
|
|
282
|
-
i0.ɵɵelement(26, "i",
|
|
292
|
+
i0.ɵɵelement(26, "i", 68);
|
|
283
293
|
i0.ɵɵtext(27, " Cost Distribution by Prompt");
|
|
284
294
|
i0.ɵɵelementEnd();
|
|
285
|
-
i0.ɵɵelementStart(28, "button",
|
|
286
|
-
i0.ɵɵelement(29, "i",
|
|
295
|
+
i0.ɵɵelementStart(28, "button", 49);
|
|
296
|
+
i0.ɵɵelement(29, "i", 50);
|
|
287
297
|
i0.ɵɵelementEnd()();
|
|
288
|
-
i0.ɵɵelementStart(30, "div",
|
|
289
|
-
i0.ɵɵelement(32, "div",
|
|
298
|
+
i0.ɵɵelementStart(30, "div", 51)(31, "div", 52);
|
|
299
|
+
i0.ɵɵelement(32, "div", 83, 8);
|
|
290
300
|
i0.ɵɵelementEnd()()();
|
|
291
|
-
i0.ɵɵelementStart(34, "div",
|
|
292
|
-
i0.ɵɵlistener("click", function
|
|
301
|
+
i0.ɵɵelementStart(34, "div", 46)(35, "div", 47);
|
|
302
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_76_Template_div_click_35_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("promptCount")); });
|
|
293
303
|
i0.ɵɵelementStart(36, "h3");
|
|
294
|
-
i0.ɵɵelement(37, "i",
|
|
304
|
+
i0.ɵɵelement(37, "i", 84);
|
|
295
305
|
i0.ɵɵtext(38, " Prompt Execution Count");
|
|
296
306
|
i0.ɵɵelementEnd();
|
|
297
|
-
i0.ɵɵelementStart(39, "button",
|
|
298
|
-
i0.ɵɵelement(40, "i",
|
|
307
|
+
i0.ɵɵelementStart(39, "button", 49);
|
|
308
|
+
i0.ɵɵelement(40, "i", 50);
|
|
299
309
|
i0.ɵɵelementEnd()();
|
|
300
|
-
i0.ɵɵelementStart(41, "div",
|
|
301
|
-
i0.ɵɵelement(43, "div",
|
|
310
|
+
i0.ɵɵelementStart(41, "div", 51)(42, "div", 52);
|
|
311
|
+
i0.ɵɵelement(43, "div", 85, 9);
|
|
302
312
|
i0.ɵɵelementEnd()()()();
|
|
303
313
|
} if (rf & 2) {
|
|
304
314
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -327,7 +337,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Template(rf,
|
|
|
327
337
|
i0.ɵɵadvance();
|
|
328
338
|
i0.ɵɵproperty("ngClass", ctx_r1.expandedCharts["promptCount"] ? "fa-compress" : "fa-expand");
|
|
329
339
|
} }
|
|
330
|
-
function
|
|
340
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_81_For_16_Template(rf, ctx) { if (rf & 1) {
|
|
331
341
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
332
342
|
i0.ɵɵtext(2);
|
|
333
343
|
i0.ɵɵelementEnd();
|
|
@@ -340,7 +350,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_80_For_16_Templa
|
|
|
340
350
|
i0.ɵɵelementStart(7, "td");
|
|
341
351
|
i0.ɵɵtext(8);
|
|
342
352
|
i0.ɵɵelementEnd();
|
|
343
|
-
i0.ɵɵelementStart(9, "td")(10, "span",
|
|
353
|
+
i0.ɵɵelementStart(9, "td")(10, "span", 86);
|
|
344
354
|
i0.ɵɵtext(11);
|
|
345
355
|
i0.ɵɵelementEnd()()();
|
|
346
356
|
} if (rf & 2) {
|
|
@@ -357,8 +367,8 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_80_For_16_Templa
|
|
|
357
367
|
i0.ɵɵadvance(3);
|
|
358
368
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.calculatePromptSuccessRate(prompt_r8.key), "% ");
|
|
359
369
|
} }
|
|
360
|
-
function
|
|
361
|
-
i0.ɵɵelementStart(0, "div",
|
|
370
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_81_Template(rf, ctx) { if (rf & 1) {
|
|
371
|
+
i0.ɵɵelementStart(0, "div", 45)(1, "table")(2, "thead")(3, "tr")(4, "th");
|
|
362
372
|
i0.ɵɵtext(5, "Prompt Name");
|
|
363
373
|
i0.ɵɵelementEnd();
|
|
364
374
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -374,7 +384,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_80_Template(rf,
|
|
|
374
384
|
i0.ɵɵtext(13, "Success Rate");
|
|
375
385
|
i0.ɵɵelementEnd()()();
|
|
376
386
|
i0.ɵɵelementStart(14, "tbody");
|
|
377
|
-
i0.ɵɵrepeaterCreate(15,
|
|
387
|
+
i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_81_For_16_Template, 12, 5, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
378
388
|
i0.ɵɵpipe(17, "keyvalue");
|
|
379
389
|
i0.ɵɵelementEnd()()();
|
|
380
390
|
} if (rf & 2) {
|
|
@@ -382,11 +392,11 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_80_Template(rf,
|
|
|
382
392
|
i0.ɵɵadvance(15);
|
|
383
393
|
i0.ɵɵrepeater(i0.ɵɵpipeBind1(17, 0, ctx_r1.promptMetrics.byPrompt));
|
|
384
394
|
} }
|
|
385
|
-
function
|
|
395
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_83_Template(rf, ctx) { if (rf & 1) {
|
|
386
396
|
i0.ɵɵelement(0, "i", 28);
|
|
387
397
|
i0.ɵɵtext(1, " Action Analytics ");
|
|
388
398
|
} }
|
|
389
|
-
function
|
|
399
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_112_For_16_Template(rf, ctx) { if (rf & 1) {
|
|
390
400
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
391
401
|
i0.ɵɵtext(2);
|
|
392
402
|
i0.ɵɵelementEnd();
|
|
@@ -396,7 +406,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_111_For_16_Templ
|
|
|
396
406
|
i0.ɵɵelementStart(5, "td");
|
|
397
407
|
i0.ɵɵtext(6);
|
|
398
408
|
i0.ɵɵelementEnd();
|
|
399
|
-
i0.ɵɵelementStart(7, "td")(8, "span",
|
|
409
|
+
i0.ɵɵelementStart(7, "td")(8, "span", 86);
|
|
400
410
|
i0.ɵɵtext(9);
|
|
401
411
|
i0.ɵɵelementEnd()();
|
|
402
412
|
i0.ɵɵelementStart(10, "td");
|
|
@@ -418,8 +428,8 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_111_For_16_Templ
|
|
|
418
428
|
i0.ɵɵadvance(2);
|
|
419
429
|
i0.ɵɵtextInterpolate(ctx_r1.getActionType(action_r9.key));
|
|
420
430
|
} }
|
|
421
|
-
function
|
|
422
|
-
i0.ɵɵelementStart(0, "div",
|
|
431
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_112_Template(rf, ctx) { if (rf & 1) {
|
|
432
|
+
i0.ɵɵelementStart(0, "div", 45)(1, "table")(2, "thead")(3, "tr")(4, "th");
|
|
423
433
|
i0.ɵɵtext(5, "Action Name");
|
|
424
434
|
i0.ɵɵelementEnd();
|
|
425
435
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -435,7 +445,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_111_Template(rf,
|
|
|
435
445
|
i0.ɵɵtext(13, "Type");
|
|
436
446
|
i0.ɵɵelementEnd()()();
|
|
437
447
|
i0.ɵɵelementStart(14, "tbody");
|
|
438
|
-
i0.ɵɵrepeaterCreate(15,
|
|
448
|
+
i0.ɵɵrepeaterCreate(15, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_112_For_16_Template, 12, 11, "tr", null, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
439
449
|
i0.ɵɵpipe(17, "keyvalue");
|
|
440
450
|
i0.ɵɵelementEnd()()();
|
|
441
451
|
} if (rf & 2) {
|
|
@@ -443,11 +453,11 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_111_Template(rf,
|
|
|
443
453
|
i0.ɵɵadvance(15);
|
|
444
454
|
i0.ɵɵrepeater(i0.ɵɵpipeBind1(17, 0, ctx_r1.actionMetrics.byAction));
|
|
445
455
|
} }
|
|
446
|
-
function
|
|
447
|
-
i0.ɵɵelementStart(0, "div",
|
|
456
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_114_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
457
|
+
i0.ɵɵelementStart(0, "div", 90)(1, "span", 91);
|
|
448
458
|
i0.ɵɵtext(2);
|
|
449
459
|
i0.ɵɵelementEnd();
|
|
450
|
-
i0.ɵɵelementStart(3, "span",
|
|
460
|
+
i0.ɵɵelementStart(3, "span", 92);
|
|
451
461
|
i0.ɵɵtext(4);
|
|
452
462
|
i0.ɵɵelementEnd()();
|
|
453
463
|
} if (rf & 2) {
|
|
@@ -457,30 +467,30 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_113_For_8_Templa
|
|
|
457
467
|
i0.ɵɵadvance(2);
|
|
458
468
|
i0.ɵɵtextInterpolate(error_r10.message);
|
|
459
469
|
} }
|
|
460
|
-
function
|
|
461
|
-
i0.ɵɵelementStart(0, "div",
|
|
462
|
-
i0.ɵɵelement(2, "i",
|
|
470
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_114_Template(rf, ctx) { if (rf & 1) {
|
|
471
|
+
i0.ɵɵelementStart(0, "div", 57)(1, "h3");
|
|
472
|
+
i0.ɵɵelement(2, "i", 87);
|
|
463
473
|
i0.ɵɵtext(3, " Common Errors ");
|
|
464
474
|
i0.ɵɵelementEnd();
|
|
465
|
-
i0.ɵɵelementStart(4, "p",
|
|
475
|
+
i0.ɵɵelementStart(4, "p", 88);
|
|
466
476
|
i0.ɵɵtext(5, " This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention. ");
|
|
467
477
|
i0.ɵɵelementEnd();
|
|
468
|
-
i0.ɵɵelementStart(6, "div",
|
|
469
|
-
i0.ɵɵrepeaterCreate(7,
|
|
478
|
+
i0.ɵɵelementStart(6, "div", 89);
|
|
479
|
+
i0.ɵɵrepeaterCreate(7, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_114_For_8_Template, 5, 2, "div", 90, i0.ɵɵcomponentInstance().trackByErrorMessage, true);
|
|
470
480
|
i0.ɵɵelementEnd()();
|
|
471
481
|
} if (rf & 2) {
|
|
472
482
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
473
483
|
i0.ɵɵadvance(7);
|
|
474
484
|
i0.ɵɵrepeater(ctx_r1.getTopErrors());
|
|
475
485
|
} }
|
|
476
|
-
function
|
|
477
|
-
i0.ɵɵelement(0, "mj-empty-state",
|
|
486
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_Conditional_115_Template(rf, ctx) { if (rf & 1) {
|
|
487
|
+
i0.ɵɵelement(0, "mj-empty-state", 58);
|
|
478
488
|
} }
|
|
479
|
-
function
|
|
480
|
-
i0.ɵɵelement(0, "i",
|
|
489
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_117_Template(rf, ctx) { if (rf & 1) {
|
|
490
|
+
i0.ɵɵelement(0, "i", 93);
|
|
481
491
|
i0.ɵɵtext(1, " Model Performance Comparison ");
|
|
482
492
|
} }
|
|
483
|
-
function
|
|
493
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_For_141_Template(rf, ctx) { if (rf & 1) {
|
|
484
494
|
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
485
495
|
i0.ɵɵtext(2);
|
|
486
496
|
i0.ɵɵelementEnd();
|
|
@@ -527,20 +537,20 @@ function AIAgentRunAnalyticsComponent_Conditional_3_For_140_Template(rf, ctx) {
|
|
|
527
537
|
i0.ɵɵadvance(3);
|
|
528
538
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(18, 11, model_r11.outputTokens, "1.0-0"));
|
|
529
539
|
} }
|
|
530
|
-
function
|
|
531
|
-
i0.ɵɵelement(0, "i",
|
|
540
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_ng_template_143_Template(rf, ctx) { if (rf & 1) {
|
|
541
|
+
i0.ɵɵelement(0, "i", 94);
|
|
532
542
|
i0.ɵɵtext(1, " Execution Timeline Analysis ");
|
|
533
543
|
} }
|
|
534
|
-
function
|
|
535
|
-
i0.ɵɵelementStart(0, "div",
|
|
536
|
-
i0.ɵɵelement(1, "i",
|
|
537
|
-
i0.ɵɵelementStart(2, "span",
|
|
544
|
+
function AIAgentRunAnalyticsComponent_Conditional_3_For_171_Template(rf, ctx) { if (rf & 1) {
|
|
545
|
+
i0.ɵɵelementStart(0, "div", 66);
|
|
546
|
+
i0.ɵɵelement(1, "i", 44);
|
|
547
|
+
i0.ɵɵelementStart(2, "span", 95);
|
|
538
548
|
i0.ɵɵtext(3);
|
|
539
549
|
i0.ɵɵelementEnd();
|
|
540
|
-
i0.ɵɵelementStart(4, "span",
|
|
550
|
+
i0.ɵɵelementStart(4, "span", 96);
|
|
541
551
|
i0.ɵɵtext(5);
|
|
542
552
|
i0.ɵɵelementEnd();
|
|
543
|
-
i0.ɵɵelementStart(6, "span",
|
|
553
|
+
i0.ɵɵelementStart(6, "span", 97);
|
|
544
554
|
i0.ɵɵtext(7);
|
|
545
555
|
i0.ɵɵelementEnd()();
|
|
546
556
|
} if (rf & 2) {
|
|
@@ -603,148 +613,149 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf &
|
|
|
603
613
|
i0.ɵɵelementEnd();
|
|
604
614
|
i0.ɵɵconditionalCreate(41, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_41_Template, 3, 3, "span");
|
|
605
615
|
i0.ɵɵconditionalCreate(42, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_42_Template, 2, 2, "span");
|
|
606
|
-
i0.ɵɵconditionalCreate(43, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_43_Template,
|
|
616
|
+
i0.ɵɵconditionalCreate(43, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_43_Template, 2, 1, "span", 32);
|
|
617
|
+
i0.ɵɵconditionalCreate(44, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_44_Template, 3, 5, "span", 25);
|
|
607
618
|
i0.ɵɵelementEnd()()();
|
|
608
|
-
i0.ɵɵelementStart(
|
|
609
|
-
i0.ɵɵelement(
|
|
619
|
+
i0.ɵɵelementStart(45, "div", 19)(46, "div", 33);
|
|
620
|
+
i0.ɵɵelement(47, "i", 34);
|
|
610
621
|
i0.ɵɵelementEnd();
|
|
611
|
-
i0.ɵɵelementStart(
|
|
612
|
-
i0.ɵɵtext(
|
|
622
|
+
i0.ɵɵelementStart(48, "div", 22)(49, "h3");
|
|
623
|
+
i0.ɵɵtext(50, "Prompt Cache");
|
|
613
624
|
i0.ɵɵelementEnd();
|
|
614
|
-
i0.ɵɵelementStart(
|
|
615
|
-
i0.ɵɵtext(
|
|
616
|
-
i0.ɵɵpipe(
|
|
625
|
+
i0.ɵɵelementStart(51, "div", 23);
|
|
626
|
+
i0.ɵɵtext(52);
|
|
627
|
+
i0.ɵɵpipe(53, "number");
|
|
617
628
|
i0.ɵɵelementEnd();
|
|
618
|
-
i0.ɵɵelementStart(
|
|
619
|
-
i0.ɵɵtext(
|
|
629
|
+
i0.ɵɵelementStart(54, "div", 31)(55, "span");
|
|
630
|
+
i0.ɵɵtext(56, "tokens read from cache");
|
|
620
631
|
i0.ɵɵelementEnd();
|
|
621
|
-
i0.ɵɵconditionalCreate(
|
|
622
|
-
i0.ɵɵconditionalCreate(
|
|
632
|
+
i0.ɵɵconditionalCreate(57, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_57_Template, 3, 3, "span");
|
|
633
|
+
i0.ɵɵconditionalCreate(58, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_58_Template, 3, 4, "span");
|
|
623
634
|
i0.ɵɵelementEnd()()();
|
|
624
|
-
i0.ɵɵelementStart(
|
|
625
|
-
i0.ɵɵelement(
|
|
635
|
+
i0.ɵɵelementStart(59, "div", 19)(60, "div", 35);
|
|
636
|
+
i0.ɵɵelement(61, "i", 36);
|
|
626
637
|
i0.ɵɵelementEnd();
|
|
627
|
-
i0.ɵɵelementStart(
|
|
628
|
-
i0.ɵɵtext(
|
|
638
|
+
i0.ɵɵelementStart(62, "div", 22)(63, "h3");
|
|
639
|
+
i0.ɵɵtext(64, "Execution Time");
|
|
629
640
|
i0.ɵɵelementEnd();
|
|
630
|
-
i0.ɵɵelementStart(
|
|
631
|
-
i0.ɵɵtext(
|
|
641
|
+
i0.ɵɵelementStart(65, "div", 23);
|
|
642
|
+
i0.ɵɵtext(66);
|
|
632
643
|
i0.ɵɵelementEnd();
|
|
633
|
-
i0.ɵɵelementStart(
|
|
634
|
-
i0.ɵɵtext(
|
|
644
|
+
i0.ɵɵelementStart(67, "div", 24)(68, "span");
|
|
645
|
+
i0.ɵɵtext(69);
|
|
635
646
|
i0.ɵɵelementEnd()()()()()();
|
|
636
|
-
i0.ɵɵelementStart(
|
|
637
|
-
i0.ɵɵtemplate(
|
|
638
|
-
i0.ɵɵelementStart(
|
|
639
|
-
i0.ɵɵconditionalCreate(
|
|
640
|
-
i0.ɵɵconditionalCreate(
|
|
641
|
-
i0.ɵɵconditionalCreate(
|
|
642
|
-
i0.ɵɵconditionalCreate(
|
|
643
|
-
i0.ɵɵelementStart(
|
|
644
|
-
i0.ɵɵlistener("click", function
|
|
645
|
-
i0.ɵɵelement(
|
|
646
|
-
i0.ɵɵtext(
|
|
647
|
-
i0.ɵɵelementEnd();
|
|
648
|
-
i0.ɵɵconditionalCreate(
|
|
647
|
+
i0.ɵɵelementStart(70, "mj-accordion-panel", 16);
|
|
648
|
+
i0.ɵɵtemplate(71, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_71_Template, 2, 0, "ng-template", 17);
|
|
649
|
+
i0.ɵɵelementStart(72, "div", 37);
|
|
650
|
+
i0.ɵɵconditionalCreate(73, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_73_Template, 4, 2, "div", 38);
|
|
651
|
+
i0.ɵɵconditionalCreate(74, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_74_Template, 1, 0, "mj-empty-state", 39);
|
|
652
|
+
i0.ɵɵconditionalCreate(75, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_75_Template, 48, 18, "div", 40);
|
|
653
|
+
i0.ɵɵconditionalCreate(76, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_76_Template, 45, 16, "div", 41);
|
|
654
|
+
i0.ɵɵelementStart(77, "div", 42)(78, "button", 43);
|
|
655
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_button_click_78_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.promptDetailsExpanded = !ctx_r1.promptDetailsExpanded); });
|
|
656
|
+
i0.ɵɵelement(79, "i", 44);
|
|
657
|
+
i0.ɵɵtext(80, " Detailed Prompt Metrics ");
|
|
658
|
+
i0.ɵɵelementEnd();
|
|
659
|
+
i0.ɵɵconditionalCreate(81, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_81_Template, 18, 2, "div", 45);
|
|
649
660
|
i0.ɵɵelementEnd()()();
|
|
650
|
-
i0.ɵɵelementStart(
|
|
651
|
-
i0.ɵɵtemplate(
|
|
652
|
-
i0.ɵɵelementStart(
|
|
653
|
-
i0.ɵɵlistener("click", function
|
|
654
|
-
i0.ɵɵelementStart(
|
|
655
|
-
i0.ɵɵelement(
|
|
656
|
-
i0.ɵɵtext(
|
|
657
|
-
i0.ɵɵelementEnd();
|
|
658
|
-
i0.ɵɵelementStart(
|
|
659
|
-
i0.ɵɵelement(
|
|
661
|
+
i0.ɵɵelementStart(82, "mj-accordion-panel", 16);
|
|
662
|
+
i0.ɵɵtemplate(83, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_83_Template, 2, 0, "ng-template", 17);
|
|
663
|
+
i0.ɵɵelementStart(84, "div", 37)(85, "div", 40)(86, "div", 46)(87, "div", 47);
|
|
664
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_div_click_87_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("actionSuccess")); });
|
|
665
|
+
i0.ɵɵelementStart(88, "h3");
|
|
666
|
+
i0.ɵɵelement(89, "i", 48);
|
|
667
|
+
i0.ɵɵtext(90, " Action Success Rate");
|
|
668
|
+
i0.ɵɵelementEnd();
|
|
669
|
+
i0.ɵɵelementStart(91, "button", 49);
|
|
670
|
+
i0.ɵɵelement(92, "i", 50);
|
|
660
671
|
i0.ɵɵelementEnd()();
|
|
661
|
-
i0.ɵɵelementStart(
|
|
662
|
-
i0.ɵɵelement(
|
|
672
|
+
i0.ɵɵelementStart(93, "div", 51)(94, "div", 52);
|
|
673
|
+
i0.ɵɵelement(95, "div", 53, 0);
|
|
663
674
|
i0.ɵɵelementEnd()()();
|
|
664
|
-
i0.ɵɵelementStart(
|
|
665
|
-
i0.ɵɵlistener("click", function
|
|
666
|
-
i0.ɵɵelementStart(
|
|
667
|
-
i0.ɵɵelement(
|
|
668
|
-
i0.ɵɵtext(
|
|
669
|
-
i0.ɵɵelementEnd();
|
|
670
|
-
i0.ɵɵelementStart(
|
|
671
|
-
i0.ɵɵelement(
|
|
675
|
+
i0.ɵɵelementStart(97, "div", 46)(98, "div", 47);
|
|
676
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_div_click_98_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleChartExpansion("stepType")); });
|
|
677
|
+
i0.ɵɵelementStart(99, "h3");
|
|
678
|
+
i0.ɵɵelement(100, "i", 54);
|
|
679
|
+
i0.ɵɵtext(101, " Step Type Distribution");
|
|
680
|
+
i0.ɵɵelementEnd();
|
|
681
|
+
i0.ɵɵelementStart(102, "button", 49);
|
|
682
|
+
i0.ɵɵelement(103, "i", 50);
|
|
672
683
|
i0.ɵɵelementEnd()();
|
|
673
|
-
i0.ɵɵelementStart(
|
|
674
|
-
i0.ɵɵelement(
|
|
684
|
+
i0.ɵɵelementStart(104, "div", 51)(105, "div", 52);
|
|
685
|
+
i0.ɵɵelement(106, "div", 55, 1);
|
|
675
686
|
i0.ɵɵelementEnd()()()();
|
|
676
|
-
i0.ɵɵelementStart(
|
|
677
|
-
i0.ɵɵlistener("click", function
|
|
678
|
-
i0.ɵɵelement(
|
|
679
|
-
i0.ɵɵtext(
|
|
687
|
+
i0.ɵɵelementStart(108, "div", 42)(109, "button", 43);
|
|
688
|
+
i0.ɵɵlistener("click", function AIAgentRunAnalyticsComponent_Conditional_3_Template_button_click_109_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.actionDetailsExpanded = !ctx_r1.actionDetailsExpanded); });
|
|
689
|
+
i0.ɵɵelement(110, "i", 44);
|
|
690
|
+
i0.ɵɵtext(111, " Detailed Action Metrics ");
|
|
680
691
|
i0.ɵɵelementEnd();
|
|
681
|
-
i0.ɵɵconditionalCreate(
|
|
692
|
+
i0.ɵɵconditionalCreate(112, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_112_Template, 18, 2, "div", 45);
|
|
682
693
|
i0.ɵɵelementEnd();
|
|
683
|
-
i0.ɵɵelementStart(
|
|
684
|
-
i0.ɵɵconditionalCreate(
|
|
685
|
-
i0.ɵɵconditionalCreate(
|
|
694
|
+
i0.ɵɵelementStart(113, "div", 56);
|
|
695
|
+
i0.ɵɵconditionalCreate(114, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_114_Template, 9, 0, "div", 57);
|
|
696
|
+
i0.ɵɵconditionalCreate(115, AIAgentRunAnalyticsComponent_Conditional_3_Conditional_115_Template, 1, 0, "mj-empty-state", 58);
|
|
686
697
|
i0.ɵɵelementEnd()()();
|
|
687
|
-
i0.ɵɵelementStart(
|
|
688
|
-
i0.ɵɵtemplate(
|
|
689
|
-
i0.ɵɵelementStart(
|
|
690
|
-
i0.ɵɵtext(
|
|
698
|
+
i0.ɵɵelementStart(116, "mj-accordion-panel", 16);
|
|
699
|
+
i0.ɵɵtemplate(117, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_117_Template, 2, 0, "ng-template", 17);
|
|
700
|
+
i0.ɵɵelementStart(118, "div", 37)(119, "div", 59)(120, "table")(121, "thead")(122, "tr")(123, "th");
|
|
701
|
+
i0.ɵɵtext(124, "Model");
|
|
691
702
|
i0.ɵɵelementEnd();
|
|
692
|
-
i0.ɵɵelementStart(
|
|
693
|
-
i0.ɵɵtext(
|
|
703
|
+
i0.ɵɵelementStart(125, "th");
|
|
704
|
+
i0.ɵɵtext(126, "Vendor");
|
|
694
705
|
i0.ɵɵelementEnd();
|
|
695
|
-
i0.ɵɵelementStart(
|
|
696
|
-
i0.ɵɵtext(
|
|
706
|
+
i0.ɵɵelementStart(127, "th");
|
|
707
|
+
i0.ɵɵtext(128, "Prompts");
|
|
697
708
|
i0.ɵɵelementEnd();
|
|
698
|
-
i0.ɵɵelementStart(
|
|
699
|
-
i0.ɵɵtext(
|
|
709
|
+
i0.ɵɵelementStart(129, "th");
|
|
710
|
+
i0.ɵɵtext(130, "Avg Time");
|
|
700
711
|
i0.ɵɵelementEnd();
|
|
701
|
-
i0.ɵɵelementStart(
|
|
702
|
-
i0.ɵɵtext(
|
|
712
|
+
i0.ɵɵelementStart(131, "th");
|
|
713
|
+
i0.ɵɵtext(132, "Total Cost");
|
|
703
714
|
i0.ɵɵelementEnd();
|
|
704
|
-
i0.ɵɵelementStart(
|
|
705
|
-
i0.ɵɵtext(
|
|
715
|
+
i0.ɵɵelementStart(133, "th");
|
|
716
|
+
i0.ɵɵtext(134, "Avg Cost/Prompt");
|
|
706
717
|
i0.ɵɵelementEnd();
|
|
707
|
-
i0.ɵɵelementStart(
|
|
708
|
-
i0.ɵɵtext(
|
|
718
|
+
i0.ɵɵelementStart(135, "th");
|
|
719
|
+
i0.ɵɵtext(136, "Input Tokens");
|
|
709
720
|
i0.ɵɵelementEnd();
|
|
710
|
-
i0.ɵɵelementStart(
|
|
711
|
-
i0.ɵɵtext(
|
|
721
|
+
i0.ɵɵelementStart(137, "th");
|
|
722
|
+
i0.ɵɵtext(138, "Output Tokens");
|
|
712
723
|
i0.ɵɵelementEnd()()();
|
|
713
|
-
i0.ɵɵelementStart(
|
|
714
|
-
i0.ɵɵrepeaterCreate(
|
|
724
|
+
i0.ɵɵelementStart(139, "tbody");
|
|
725
|
+
i0.ɵɵrepeaterCreate(140, AIAgentRunAnalyticsComponent_Conditional_3_For_141_Template, 19, 14, "tr", null, i0.ɵɵcomponentInstance().trackByModelName, true);
|
|
715
726
|
i0.ɵɵelementEnd()()()()();
|
|
716
|
-
i0.ɵɵelementStart(
|
|
717
|
-
i0.ɵɵtemplate(
|
|
718
|
-
i0.ɵɵelementStart(
|
|
719
|
-
i0.ɵɵtext(
|
|
727
|
+
i0.ɵɵelementStart(142, "mj-accordion-panel", 16);
|
|
728
|
+
i0.ɵɵtemplate(143, AIAgentRunAnalyticsComponent_Conditional_3_ng_template_143_Template, 2, 0, "ng-template", 17);
|
|
729
|
+
i0.ɵɵelementStart(144, "div", 37)(145, "div", 60)(146, "div", 61)(147, "span", 62);
|
|
730
|
+
i0.ɵɵtext(148, "Total Steps");
|
|
720
731
|
i0.ɵɵelementEnd();
|
|
721
|
-
i0.ɵɵelementStart(
|
|
722
|
-
i0.ɵɵtext(
|
|
732
|
+
i0.ɵɵelementStart(149, "span", 63);
|
|
733
|
+
i0.ɵɵtext(150);
|
|
723
734
|
i0.ɵɵelementEnd()();
|
|
724
|
-
i0.ɵɵelementStart(
|
|
725
|
-
i0.ɵɵtext(
|
|
735
|
+
i0.ɵɵelementStart(151, "div", 61)(152, "span", 62);
|
|
736
|
+
i0.ɵɵtext(153, "Parallel Executions");
|
|
726
737
|
i0.ɵɵelementEnd();
|
|
727
|
-
i0.ɵɵelementStart(
|
|
728
|
-
i0.ɵɵtext(
|
|
738
|
+
i0.ɵɵelementStart(154, "span", 63);
|
|
739
|
+
i0.ɵɵtext(155);
|
|
729
740
|
i0.ɵɵelementEnd()();
|
|
730
|
-
i0.ɵɵelementStart(
|
|
731
|
-
i0.ɵɵtext(
|
|
741
|
+
i0.ɵɵelementStart(156, "div", 61)(157, "span", 62);
|
|
742
|
+
i0.ɵɵtext(158, "Max Nesting Depth");
|
|
732
743
|
i0.ɵɵelementEnd();
|
|
733
|
-
i0.ɵɵelementStart(
|
|
734
|
-
i0.ɵɵtext(
|
|
744
|
+
i0.ɵɵelementStart(159, "span", 63);
|
|
745
|
+
i0.ɵɵtext(160);
|
|
735
746
|
i0.ɵɵelementEnd()();
|
|
736
|
-
i0.ɵɵelementStart(
|
|
737
|
-
i0.ɵɵtext(
|
|
747
|
+
i0.ɵɵelementStart(161, "div", 61)(162, "span", 62);
|
|
748
|
+
i0.ɵɵtext(163, "Sub-Agent Runs");
|
|
738
749
|
i0.ɵɵelementEnd();
|
|
739
|
-
i0.ɵɵelementStart(
|
|
740
|
-
i0.ɵɵtext(
|
|
750
|
+
i0.ɵɵelementStart(164, "span", 63);
|
|
751
|
+
i0.ɵɵtext(165);
|
|
741
752
|
i0.ɵɵelementEnd()()();
|
|
742
|
-
i0.ɵɵelementStart(
|
|
743
|
-
i0.ɵɵtext(
|
|
753
|
+
i0.ɵɵelementStart(166, "div", 64)(167, "h3");
|
|
754
|
+
i0.ɵɵtext(168, "Steps by Type");
|
|
744
755
|
i0.ɵɵelementEnd();
|
|
745
|
-
i0.ɵɵelementStart(
|
|
746
|
-
i0.ɵɵrepeaterCreate(
|
|
747
|
-
i0.ɵɵpipe(
|
|
756
|
+
i0.ɵɵelementStart(169, "div", 65);
|
|
757
|
+
i0.ɵɵrepeaterCreate(170, AIAgentRunAnalyticsComponent_Conditional_3_For_171_Template, 8, 4, "div", 66, i0.ɵɵcomponentInstance().trackByKey, true);
|
|
758
|
+
i0.ɵɵpipe(172, "keyvalue");
|
|
748
759
|
i0.ɵɵelementEnd()()()()();
|
|
749
760
|
} if (rf & 2) {
|
|
750
761
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -767,19 +778,21 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf &
|
|
|
767
778
|
i0.ɵɵadvance();
|
|
768
779
|
i0.ɵɵconditional(ctx_r1.HasDispatchedWork ? 36 : -1);
|
|
769
780
|
i0.ɵɵadvance(3);
|
|
770
|
-
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(40,
|
|
781
|
+
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(40, 45, ctx_r1.totalTokensProcessed), " tokens");
|
|
771
782
|
i0.ɵɵadvance(2);
|
|
772
783
|
i0.ɵɵconditional(ctx_r1.promptMetrics.tokenUsage.totalCacheRead > 0 || ctx_r1.promptMetrics.tokenUsage.totalCacheWrite > 0 ? 41 : -1);
|
|
773
784
|
i0.ɵɵadvance();
|
|
774
785
|
i0.ɵɵconditional(ctx_r1.inputCost > 0 || ctx_r1.outputCost > 0 ? 42 : -1);
|
|
775
786
|
i0.ɵɵadvance();
|
|
776
|
-
i0.ɵɵconditional(ctx_r1.
|
|
787
|
+
i0.ɵɵconditional(ctx_r1.AvatarVideoCost > 0 ? 43 : -1);
|
|
788
|
+
i0.ɵɵadvance();
|
|
789
|
+
i0.ɵɵconditional(ctx_r1.cacheSavings > 0 ? 44 : -1);
|
|
777
790
|
i0.ɵɵadvance(8);
|
|
778
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(
|
|
791
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(53, 47, ctx_r1.promptMetrics.tokenUsage.totalCacheRead));
|
|
779
792
|
i0.ɵɵadvance(5);
|
|
780
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.tokenUsage.totalCacheWrite > 0 ?
|
|
793
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.tokenUsage.totalCacheWrite > 0 ? 57 : -1);
|
|
781
794
|
i0.ɵɵadvance();
|
|
782
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.tokenUsage.totalCacheRead > 0 || ctx_r1.promptMetrics.tokenUsage.totalCacheWrite > 0 ?
|
|
795
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.tokenUsage.totalCacheRead > 0 || ctx_r1.promptMetrics.tokenUsage.totalCacheWrite > 0 ? 58 : -1);
|
|
783
796
|
i0.ɵɵadvance(8);
|
|
784
797
|
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.promptMetrics.totalExecutionTime + ctx_r1.actionMetrics.totalExecutionTime));
|
|
785
798
|
i0.ɵɵadvance(3);
|
|
@@ -787,17 +800,17 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf &
|
|
|
787
800
|
i0.ɵɵadvance();
|
|
788
801
|
i0.ɵɵproperty("Expanded", true);
|
|
789
802
|
i0.ɵɵadvance(3);
|
|
790
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ?
|
|
803
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 73 : -1);
|
|
791
804
|
i0.ɵɵadvance();
|
|
792
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount === 0 ?
|
|
793
|
-
i0.ɵɵadvance();
|
|
794
|
-
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 74 : -1);
|
|
805
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount === 0 ? 74 : -1);
|
|
795
806
|
i0.ɵɵadvance();
|
|
796
807
|
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 75 : -1);
|
|
808
|
+
i0.ɵɵadvance();
|
|
809
|
+
i0.ɵɵconditional(ctx_r1.promptMetrics.totalCount > 0 ? 76 : -1);
|
|
797
810
|
i0.ɵɵadvance(3);
|
|
798
811
|
i0.ɵɵproperty("ngClass", ctx_r1.promptDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
799
812
|
i0.ɵɵadvance(2);
|
|
800
|
-
i0.ɵɵconditional(ctx_r1.promptDetailsExpanded ?
|
|
813
|
+
i0.ɵɵconditional(ctx_r1.promptDetailsExpanded ? 81 : -1);
|
|
801
814
|
i0.ɵɵadvance();
|
|
802
815
|
i0.ɵɵproperty("Expanded", true);
|
|
803
816
|
i0.ɵɵadvance(4);
|
|
@@ -815,11 +828,11 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf &
|
|
|
815
828
|
i0.ɵɵadvance(7);
|
|
816
829
|
i0.ɵɵproperty("ngClass", ctx_r1.actionDetailsExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
817
830
|
i0.ɵɵadvance(2);
|
|
818
|
-
i0.ɵɵconditional(ctx_r1.actionDetailsExpanded ?
|
|
831
|
+
i0.ɵɵconditional(ctx_r1.actionDetailsExpanded ? 112 : -1);
|
|
819
832
|
i0.ɵɵadvance(2);
|
|
820
|
-
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size > 0 ?
|
|
833
|
+
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size > 0 ? 114 : -1);
|
|
821
834
|
i0.ɵɵadvance();
|
|
822
|
-
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size === 0 ?
|
|
835
|
+
i0.ɵɵconditional(ctx_r1.actionMetrics.errorAnalysis.size === 0 ? 115 : -1);
|
|
823
836
|
i0.ɵɵadvance();
|
|
824
837
|
i0.ɵɵproperty("Expanded", true);
|
|
825
838
|
i0.ɵɵadvance(24);
|
|
@@ -835,7 +848,7 @@ function AIAgentRunAnalyticsComponent_Conditional_3_Template(rf, ctx) { if (rf &
|
|
|
835
848
|
i0.ɵɵadvance(5);
|
|
836
849
|
i0.ɵɵtextInterpolate(ctx_r1.subAgentRuns.length);
|
|
837
850
|
i0.ɵɵadvance(5);
|
|
838
|
-
i0.ɵɵrepeater(i0.ɵɵpipeBind1(
|
|
851
|
+
i0.ɵɵrepeater(i0.ɵɵpipeBind1(172, 49, ctx_r1.timelineMetrics.stepsByType));
|
|
839
852
|
} }
|
|
840
853
|
export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
841
854
|
/**
|
|
@@ -1350,7 +1363,7 @@ export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
|
1350
1363
|
byVendor: new Map(),
|
|
1351
1364
|
byPrompt: new Map(),
|
|
1352
1365
|
statusBreakdown: { success: 0, failed: 0, timeout: 0 },
|
|
1353
|
-
costBreakdown: { totalCost: 0, byModel: new Map(), byVendor: new Map(), inputCost: 0, outputCost: 0, savings: 0, unratedCost: 0 },
|
|
1366
|
+
costBreakdown: { totalCost: 0, byModel: new Map(), byVendor: new Map(), inputCost: 0, outputCost: 0, savings: 0, avatarVideoCost: 0, unratedCost: 0 },
|
|
1354
1367
|
tokenUsage: { totalInput: 0, totalOutput: 0, totalCacheRead: 0, totalCacheWrite: 0, byModel: new Map() }
|
|
1355
1368
|
};
|
|
1356
1369
|
}
|
|
@@ -1423,10 +1436,10 @@ export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
|
1423
1436
|
}
|
|
1424
1437
|
const input = (row.InputPricePerUnit ?? 0) / divisor;
|
|
1425
1438
|
this.cacheRates.set(this.rateKey(row.ModelID, row.VendorID), {
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1439
|
+
InputRate: input,
|
|
1440
|
+
OutputRate: (row.OutputPricePerUnit ?? 0) / divisor,
|
|
1441
|
+
CacheReadRate: (row.CacheReadPricePerUnit ?? row.InputPricePerUnit ?? 0) / divisor,
|
|
1442
|
+
CacheWriteRate: (row.CacheWritePricePerUnit ?? row.InputPricePerUnit ?? 0) / divisor
|
|
1430
1443
|
});
|
|
1431
1444
|
}
|
|
1432
1445
|
}
|
|
@@ -1488,12 +1501,16 @@ export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
|
1488
1501
|
metrics.tokenUsage.totalCacheWrite += cacheWriteTokens;
|
|
1489
1502
|
// Rate-derived cost split + cache savings. inputCost folds uncached + cache read + cache write
|
|
1490
1503
|
// (each at its own rate); savings = the discount vs. pricing all input at the full input rate.
|
|
1491
|
-
//
|
|
1504
|
+
// An avatar call's video is priced on its own line: its cost comes from the run's cost lines,
|
|
1505
|
+
// and its tokens are not output at the text rate. Runs whose model+vendor has no rate row are
|
|
1506
|
+
// tracked separately so the split isn't silently off.
|
|
1492
1507
|
const rate = this.cacheRates.get(this.rateKey(promptRun.ModelID, promptRun.VendorID));
|
|
1493
1508
|
if (rate) {
|
|
1494
|
-
|
|
1495
|
-
metrics.costBreakdown.
|
|
1496
|
-
metrics.costBreakdown.
|
|
1509
|
+
const split = SplitPromptRunCost(promptRun, rate);
|
|
1510
|
+
metrics.costBreakdown.inputCost += split.InputCost;
|
|
1511
|
+
metrics.costBreakdown.outputCost += split.OutputCost;
|
|
1512
|
+
metrics.costBreakdown.savings += split.Savings;
|
|
1513
|
+
metrics.costBreakdown.avatarVideoCost += split.AvatarVideoCost;
|
|
1497
1514
|
}
|
|
1498
1515
|
else {
|
|
1499
1516
|
metrics.costBreakdown.unratedCost += cost;
|
|
@@ -1701,6 +1718,8 @@ export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
|
1701
1718
|
}
|
|
1702
1719
|
/** Rate-derived output dollars. */
|
|
1703
1720
|
get OutputCost() { return this.PromptMetrics.costBreakdown.outputCost; }
|
|
1721
|
+
/** Avatar video dollars, from the runs' cost lines (priced per minute, apart from the output tokens). */
|
|
1722
|
+
get AvatarVideoCost() { return this.PromptMetrics.costBreakdown.avatarVideoCost; }
|
|
1704
1723
|
/** @deprecated Use {@link OutputCost}. */
|
|
1705
1724
|
get outputCost() {
|
|
1706
1725
|
return this.OutputCost;
|
|
@@ -2680,11 +2699,11 @@ export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
|
2680
2699
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.PromptTokenDistributionChart = _t.first);
|
|
2681
2700
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.PromptCostDistributionChart = _t.first);
|
|
2682
2701
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.PromptCountByNameChart = _t.first);
|
|
2683
|
-
} }, inputs: { agentRunId: "agentRunId", RunTree: "RunTree" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [["actionSuccessRateChart", ""], ["stepTypeChart", ""], ["modelDistributionChart", ""], ["executionTimeChart", ""], ["costByVendorChart", ""], ["tokenUsageChart", ""], ["promptTimeDistributionChart", ""], ["promptTokenDistributionChart", ""], ["promptCostDistributionChart", ""], ["promptCountByNameChart", ""], [1, "analytics-container"], [1, "loading-state"], ["Variant", "error", "ActionText", "Retry", "ActionIcon", "fa-solid fa-arrows-rotate", 3, "Message"], [1, "analytics-content"], [1, "fas", "fa-spinner", "fa-spin", "fa-2x"], ["Variant", "error", "ActionText", "Retry", "ActionIcon", "fa-solid fa-arrows-rotate", 3, "Action", "Message"], [3, "Expanded"], ["mjAccordionTitle", ""], [1, "summary-cards"], [1, "summary-card"], [1, "card-icon", "prompts"], [1, "fas", "fa-microchip"], [1, "card-content"], [1, "metric-value"], [1, "metric-detail"], [1, "success"], [1, "failed"], [1, "card-icon", "actions"], [1, "fas", "fa-cog"], [1, "card-icon", "cost"], [1, "fas", "fa-dollar-sign"], [1, "metric-detail", "cache-detail"], [1, "card-icon", "cache"], [1, "fas", "fa-bolt"], [1, "card-icon", "time"], [1, "fas", "fa-clock"], [1, "analytics-panel"], [1, "view-mode-toggle"], ["Icon", "fa-solid fa-circle-info", "Title", "No prompt executions found in this agent run.", "Message", "This agent run may have only executed actions without any AI prompts."], [1, "charts-grid"], [1, "charts-grid", 2, "margin-top", "20px"], [1, "detailed-metrics"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fas", 3, "ngClass"], [1, "metrics-table"], [1, "chart-card"], [1, "chart-card-header", 3, "click"], [1, "fas", "fa-chart-bar"], [1, "expand-btn"], ["aria-hidden", "true", 1, "fas", 3, "ngClass"], [1, "chart-card-body"], [1, "chart-container"], ["id", "actionSuccessRateChart"], [1, "fas", "fa-layer-group"], ["id", "stepTypeChart"], [1, "error-analysis-section"], [1, "error-analysis"], ["Variant", "success", "Message", "No action errors detected in this run. All actions completed successfully!"], [1, "model-comparison"], [1, "timeline-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "step-breakdown"], [1, "step-type-list"], [1, "step-type-item"], [1, "fas", "fa-tachometer-alt"], [1, "fas", "fa-chart-pie"], ["id", "modelDistributionChart"], [1, "chart-legend"], ["id", "executionTimeChart"], ["id", "costByVendorChart"], [1, "chart-total"], [1, "fas", "fa-coins"], ["id", "tokenUsageChart"], [1, "legend-item"], [1, "legend-color"], [1, "legend-label"], [1, "fas", "fa-hourglass-half"], ["id", "promptTimeDistributionChart"], [1, "fas", "fa-database"], ["id", "promptTokenDistributionChart"], ["id", "promptCostDistributionChart"], [1, "fas", "fa-list-ol"], ["id", "promptCountByNameChart"], [1, "success-rate"], [1, "fas", "fa-exclamation-triangle"], [1, "error-analysis-description"], [1, "error-list"], [1, "error-item"], [1, "error-count"], [1, "error-message"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-stream"], [1, "type-name"], [1, "type-count"], [1, "type-percentage"]], template: function AIAgentRunAnalyticsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2702
|
+
} }, inputs: { agentRunId: "agentRunId", RunTree: "RunTree" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [["actionSuccessRateChart", ""], ["stepTypeChart", ""], ["modelDistributionChart", ""], ["executionTimeChart", ""], ["costByVendorChart", ""], ["tokenUsageChart", ""], ["promptTimeDistributionChart", ""], ["promptTokenDistributionChart", ""], ["promptCostDistributionChart", ""], ["promptCountByNameChart", ""], [1, "analytics-container"], [1, "loading-state"], ["Variant", "error", "ActionText", "Retry", "ActionIcon", "fa-solid fa-arrows-rotate", 3, "Message"], [1, "analytics-content"], [1, "fas", "fa-spinner", "fa-spin", "fa-2x"], ["Variant", "error", "ActionText", "Retry", "ActionIcon", "fa-solid fa-arrows-rotate", 3, "Action", "Message"], [3, "Expanded"], ["mjAccordionTitle", ""], [1, "summary-cards"], [1, "summary-card"], [1, "card-icon", "prompts"], [1, "fas", "fa-microchip"], [1, "card-content"], [1, "metric-value"], [1, "metric-detail"], [1, "success"], [1, "failed"], [1, "card-icon", "actions"], [1, "fas", "fa-cog"], [1, "card-icon", "cost"], [1, "fas", "fa-dollar-sign"], [1, "metric-detail", "cache-detail"], [1, "avatar-video-cost"], [1, "card-icon", "cache"], [1, "fas", "fa-bolt"], [1, "card-icon", "time"], [1, "fas", "fa-clock"], [1, "analytics-panel"], [1, "view-mode-toggle"], ["Icon", "fa-solid fa-circle-info", "Title", "No prompt executions found in this agent run.", "Message", "This agent run may have only executed actions without any AI prompts."], [1, "charts-grid"], [1, "charts-grid", 2, "margin-top", "20px"], [1, "detailed-metrics"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fas", 3, "ngClass"], [1, "metrics-table"], [1, "chart-card"], [1, "chart-card-header", 3, "click"], [1, "fas", "fa-chart-bar"], [1, "expand-btn"], ["aria-hidden", "true", 1, "fas", 3, "ngClass"], [1, "chart-card-body"], [1, "chart-container"], ["id", "actionSuccessRateChart"], [1, "fas", "fa-layer-group"], ["id", "stepTypeChart"], [1, "error-analysis-section"], [1, "error-analysis"], ["Variant", "success", "Message", "No action errors detected in this run. All actions completed successfully!"], [1, "model-comparison"], [1, "timeline-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "step-breakdown"], [1, "step-type-list"], [1, "step-type-item"], [1, "fas", "fa-tachometer-alt"], [1, "fas", "fa-chart-pie"], ["id", "modelDistributionChart"], [1, "chart-legend"], ["id", "executionTimeChart"], ["id", "costByVendorChart"], [1, "chart-total"], [1, "fas", "fa-coins"], ["id", "tokenUsageChart"], [1, "legend-item"], [1, "legend-color"], [1, "legend-label"], [1, "fas", "fa-hourglass-half"], ["id", "promptTimeDistributionChart"], [1, "fas", "fa-database"], ["id", "promptTokenDistributionChart"], ["id", "promptCostDistributionChart"], [1, "fas", "fa-list-ol"], ["id", "promptCountByNameChart"], [1, "success-rate"], [1, "fas", "fa-exclamation-triangle"], [1, "error-analysis-description"], [1, "error-list"], [1, "error-item"], [1, "error-count"], [1, "error-message"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-stream"], [1, "type-name"], [1, "type-count"], [1, "type-percentage"]], template: function AIAgentRunAnalyticsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2684
2703
|
i0.ɵɵelementStart(0, "div", 10);
|
|
2685
2704
|
i0.ɵɵconditionalCreate(1, AIAgentRunAnalyticsComponent_Conditional_1_Template, 4, 0, "div", 11);
|
|
2686
2705
|
i0.ɵɵconditionalCreate(2, AIAgentRunAnalyticsComponent_Conditional_2_Template, 1, 1, "mj-empty-state", 12);
|
|
2687
|
-
i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_Template,
|
|
2706
|
+
i0.ɵɵconditionalCreate(3, AIAgentRunAnalyticsComponent_Conditional_3_Template, 173, 51, "div", 13);
|
|
2688
2707
|
i0.ɵɵelementEnd();
|
|
2689
2708
|
} if (rf & 2) {
|
|
2690
2709
|
i0.ɵɵadvance();
|
|
@@ -2697,7 +2716,7 @@ export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
|
2697
2716
|
}
|
|
2698
2717
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunAnalyticsComponent, [{
|
|
2699
2718
|
type: Component,
|
|
2700
|
-
args: [{ standalone: false, selector: 'mj-ai-agent-run-analytics', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"analytics-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin fa-2x\"></i>\n <p>Loading analytics data...</p>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <mj-empty-state\n Variant=\"error\"\n [Message]=\"error\"\n ActionText=\"Retry\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n (Action)=\"loadData()\" />\n }\n\n <!-- Analytics Content -->\n @if (!isLoading && !error) {\n <div class=\"analytics-content\">\n <!-- Summary Cards -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tachometer-alt\"></i> Overview\n </ng-template>\n <div class=\"summary-cards\">\n <div class=\"summary-card\">\n <div class=\"card-icon prompts\">\n <i class=\"fas fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Prompts</h3>\n <div class=\"metric-value\">{{ promptMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ promptMetrics.statusBreakdown.success }} successful</span>\n @if (promptMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ promptMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon actions\">\n <i class=\"fas fa-cog\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Actions</h3>\n <div class=\"metric-value\">{{ actionMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ actionMetrics.statusBreakdown.success }} successful</span>\n @if (actionMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ actionMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cost\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Cost</h3>\n <!-- The run's OWN spend plus anything it dispatched. A workflow's cost lives on\n Task rows and the prompt runs those tasks produced, which the run's step list\n cannot reach \u2014 so before this the headline figure silently omitted the most\n expensive thing many runs do. -->\n <div class=\"metric-value\">\n {{ formatCost(promptMetrics.costBreakdown.totalCost + DispatchedCost.Cost) }}\n </div>\n @if (HasDispatchedWork) {\n <div class=\"metric-detail cache-detail\">\n <span>{{ formatCost(promptMetrics.costBreakdown.totalCost) }} this run</span>\n <span>+ {{ formatCost(DispatchedCost.Cost) }} across\n {{ DispatchedCost.NodeCount }} workflow step{{ DispatchedCost.NodeCount === 1 ? '' : 's' }}</span>\n </div>\n }\n <div class=\"metric-detail cache-detail\">\n <span>{{ totalTokensProcessed | number }} tokens</span>\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>incl. {{ (promptMetrics.tokenUsage.totalCacheRead + promptMetrics.tokenUsage.totalCacheWrite) | number }} cached</span>\n }\n @if (inputCost > 0 || outputCost > 0) {\n <span>input {{ formatCost(inputCost) }} · output {{ formatCost(outputCost) }}</span>\n }\n @if (cacheSavings > 0) {\n <span class=\"success\">saved {{ formatCost(cacheSavings) }} ({{ cacheSavingsPct | number:'1.0-0' }}%) via cache</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cache\">\n <i class=\"fas fa-bolt\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Prompt Cache</h3>\n <div class=\"metric-value\">{{ promptMetrics.tokenUsage.totalCacheRead | number }}</div>\n <div class=\"metric-detail cache-detail\">\n <span>tokens read from cache</span>\n @if (promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ promptMetrics.tokenUsage.totalCacheWrite | number }} written</span>\n }\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ cacheHitRatePct | number:'1.0-0' }}% hit rate</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon time\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Execution Time</h3>\n <div class=\"metric-value\">{{ formatDuration(promptMetrics.totalExecutionTime + actionMetrics.totalExecutionTime) }}</div>\n <div class=\"metric-detail\">\n <span>{{ timelineMetrics.totalSteps }} total steps</span>\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prompt Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-microchip\"></i> Prompt Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <!-- View Mode Toggle -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"view-mode-toggle\">\n <button mjButton\n variant=\"flat\"\n (click)=\"toggleViewMode()\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-expand-arrows-alt' : 'fa-compress-arrows-alt'\"></i>\n {{ viewMode === 'grid' ? 'Expand All' : 'Collapse All' }}\n </button>\n </div>\n }\n <!-- No prompts message -->\n @if (promptMetrics.totalCount === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No prompt executions found in this agent run.\"\n Message=\"This agent run may have only executed actions without any AI prompts.\" />\n }\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\">\n <!-- Model Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['modelDistribution']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('modelDistribution')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Prompts by Model</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['modelDistribution'] ? 'Collapse Model Distribution chart' : 'Expand Model Distribution chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['modelDistribution'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"modelDistributionChart\" #modelDistributionChart></div>\n @if (promptMetrics.byModel.size > 0) {\n <div class=\"chart-legend\">\n @for (item of promptMetrics.byModel | keyvalue; track trackByKey($index, item)) {\n <div class=\"legend-item\">\n <span class=\"legend-color\" [style.backgroundColor]=\"getModelColor(item.key)\"></span>\n <span class=\"legend-label\">{{ item.key }}: {{ item.value.count }} ({{ (item.value.count / promptMetrics.totalCount * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Execution Time by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['executionTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('executionTime')\">\n <h3><i class=\"fas fa-clock\"></i> Average Execution Time by Vendor</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['executionTime'] ? 'Collapse Average Execution Time by Vendor chart' : 'Expand Average Execution Time by Vendor chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['executionTime'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"executionTimeChart\" #executionTimeChart></div>\n </div>\n </div>\n </div>\n <!-- Cost by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['costByVendor']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('costByVendor')\">\n <h3><i class=\"fas fa-dollar-sign\"></i> Cost Distribution by Vendor</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['costByVendor'] ? 'Collapse Cost Distribution by Vendor chart' : 'Expand Cost Distribution by Vendor chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['costByVendor'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"costByVendorChart\" #costByVendorChart></div>\n <div class=\"chart-total\">Total: {{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n </div>\n </div>\n </div>\n <!-- Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['tokenUsage']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('tokenUsage')\">\n <h3><i class=\"fas fa-coins\"></i> Token Usage by Model</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['tokenUsage'] ? 'Collapse Token Usage by Model chart' : 'Expand Token Usage by Model chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['tokenUsage'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"tokenUsageChart\" #tokenUsageChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Additional Prompt Analytics Charts -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\" style=\"margin-top: 20px;\">\n <!-- Prompt Execution Time Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptTime')\">\n <h3><i class=\"fas fa-hourglass-half\"></i> Average Execution Time by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptTime'] ? 'Collapse Average Execution Time by Prompt chart' : 'Expand Average Execution Time by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptTime'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTimeDistributionChart\" #promptTimeDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptToken']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptToken')\">\n <h3><i class=\"fas fa-database\"></i> Token Usage by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptToken'] ? 'Collapse Token Usage by Prompt chart' : 'Expand Token Usage by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptToken'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTokenDistributionChart\" #promptTokenDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Cost Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCost']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCost')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Cost Distribution by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptCost'] ? 'Collapse Cost Distribution by Prompt chart' : 'Expand Cost Distribution by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCost'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCostDistributionChart\" #promptCostDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Count by Name -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCount']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCount')\">\n <h3><i class=\"fas fa-list-ol\"></i> Prompt Execution Count</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptCount'] ? 'Collapse Prompt Execution Count chart' : 'Expand Prompt Execution Count chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCount'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCountByNameChart\" #promptCountByNameChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Detailed Prompt Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"promptDetailsExpanded = !promptDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"promptDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Prompt Metrics\n </button>\n @if (promptDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Prompt Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Total Time</th>\n <th>Success Rate</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of promptMetrics.byPrompt | keyvalue; track trackByKey($index, prompt)) {\n <tr>\n <td>{{ prompt.key }}</td>\n <td>{{ prompt.value.count }}</td>\n <td>{{ formatDuration(prompt.value.avgTime) }}</td>\n <td>{{ formatDuration(prompt.value.totalTime) }}</td>\n <td>\n <span class=\"success-rate\">\n <!-- Calculate success rate for this prompt -->\n {{ calculatePromptSuccessRate(prompt.key) }}%\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Action Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cog\"></i> Action Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"charts-grid\">\n <!-- Action Success Rate -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['actionSuccess']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('actionSuccess')\">\n <h3><i class=\"fas fa-chart-bar\"></i> Action Success Rate</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['actionSuccess'] ? 'Collapse Action Success Rate chart' : 'Expand Action Success Rate chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['actionSuccess'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"actionSuccessRateChart\" #actionSuccessRateChart></div>\n </div>\n </div>\n </div>\n <!-- Step Type Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['stepType']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('stepType')\">\n <h3><i class=\"fas fa-layer-group\"></i> Step Type Distribution</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['stepType'] ? 'Collapse Step Type Distribution chart' : 'Expand Step Type Distribution chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['stepType'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"stepTypeChart\" #stepTypeChart></div>\n </div>\n </div>\n </div>\n </div>\n <!-- Detailed Action Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"actionDetailsExpanded = !actionDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"actionDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Action Metrics\n </button>\n @if (actionDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Action Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Success Rate</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n @for (action of actionMetrics.byAction | keyvalue; track trackByKey($index, action)) {\n <tr>\n <td>{{ action.key }}</td>\n <td>{{ action.value.count }}</td>\n <td>{{ formatDuration(action.value.avgTime) }}</td>\n <td>\n <span class=\"success-rate\" [class.high]=\"action.value.successRate > 0.9\"\n [class.medium]=\"action.value.successRate > 0.7 && action.value.successRate <= 0.9\"\n [class.low]=\"action.value.successRate <= 0.7\">\n {{ (action.value.successRate * 100).toFixed(1) }}%\n </span>\n </td>\n <td>{{ getActionType(action.key) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <!-- Error Analysis -->\n <div class=\"error-analysis-section\">\n @if (actionMetrics.errorAnalysis.size > 0) {\n <div class=\"error-analysis\">\n <h3>\n <i class=\"fas fa-exclamation-triangle\"></i>\n Common Errors\n </h3>\n <p class=\"error-analysis-description\">\n This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention.\n </p>\n <div class=\"error-list\">\n @for (error of getTopErrors(); track trackByErrorMessage($index, error)) {\n <div class=\"error-item\">\n <span class=\"error-count\">{{ error.count }}x</span>\n <span class=\"error-message\">{{ error.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (actionMetrics.errorAnalysis.size === 0) {\n <mj-empty-state\n Variant=\"success\"\n Message=\"No action errors detected in this run. All actions completed successfully!\" />\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Model Performance Comparison -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-chart-line\"></i> Model Performance Comparison\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"model-comparison\">\n <table>\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th>Prompts</th>\n <th>Avg Time</th>\n <th>Total Cost</th>\n <th>Avg Cost/Prompt</th>\n <th>Input Tokens</th>\n <th>Output Tokens</th>\n </tr>\n </thead>\n <tbody>\n @for (model of getModelPerformanceData(); track trackByModelName($index, model)) {\n <tr>\n <td>{{ model.name }}</td>\n <td>{{ model.vendor }}</td>\n <td>{{ model.count }}</td>\n <td>{{ formatDuration(model.avgTime) }}</td>\n <td>{{ formatCost(model.totalCost) }}</td>\n <td>{{ formatCost(model.avgCost) }}</td>\n <td>{{ model.inputTokens | number:'1.0-0' }}</td>\n <td>{{ model.outputTokens | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Timeline Analysis -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-stream\"></i> Execution Timeline Analysis\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"timeline-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Steps</span>\n <span class=\"stat-value\">{{ timelineMetrics.totalSteps }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Parallel Executions</span>\n <span class=\"stat-value\">{{ timelineMetrics.parallelExecutions }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Max Nesting Depth</span>\n <span class=\"stat-value\">{{ timelineMetrics.deepestNesting }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Sub-Agent Runs</span>\n <span class=\"stat-value\">{{ subAgentRuns.length }}</span>\n </div>\n </div>\n <div class=\"step-breakdown\">\n <h3>Steps by Type</h3>\n <div class=\"step-type-list\">\n @for (type of timelineMetrics.stepsByType | keyvalue; track trackByKey($index, type)) {\n <div class=\"step-type-item\">\n <i class=\"fas\" [ngClass]=\"getStepTypeIcon(type.key)\"></i>\n <span class=\"type-name\">{{ type.key }}</span>\n <span class=\"type-count\">{{ type.value }}</span>\n <span class=\"type-percentage\">({{ (type.value / timelineMetrics.totalSteps * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n </div>\n }\n</div>", styles: [".analytics-container {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Loading State */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i {\n margin-bottom: 15px;\n}\n\n/* Summary Cards */\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost {\n background: var(--mj-status-success);\n}\n\n.card-icon.time {\n background: var(--mj-status-warning);\n}\n\n.card-icon.cache {\n background: var(--mj-status-info);\n}\n\n.card-content h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail .success {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail .failed {\n color: var(--mj-status-error);\n}\n\n/* Cache card stacks its facts (caption / written / hit rate) one per line. */\n.metric-detail.cache-detail span {\n display: block;\n}\n\n/* Analytics Panels */\n.analytics-panel {\n padding: 15px;\n}\n\n/* Accordion Panel Styling */\n.analytics-content mj-accordion-panel {\n display: block;\n margin-bottom: 12px;\n}\n\n/* Charts */\n.charts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n/* Chart Cards */\n.chart-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded {\n grid-column: 1 / -1;\n}\n\n.chart-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header h3 i {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded .chart-card-body {\n padding: 24px;\n}\n\n.chart-card.expanded .chart-container > div {\n min-height: 400px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle button {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container {\n position: relative;\n}\n\n.chart-container h3 {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container > div {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Ensure SVG charts are centered */\n.chart-container svg {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n/* Detailed Metrics */\n.detailed-metrics {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics button {\n margin-bottom: 15px;\n}\n\n.detailed-metrics button i {\n margin-right: 8px;\n}\n\n.metrics-table {\n overflow-x: auto;\n}\n\n.metrics-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate {\n font-weight: 500;\n}\n\n.success-rate.high {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low {\n color: var(--mj-status-error);\n}\n\n/* Error Analysis */\n.error-analysis {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis h3 {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n/* Model Comparison Table */\n.model-comparison {\n overflow-x: auto;\n}\n\n.model-comparison table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Timeline Analysis */\n.timeline-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown h3 {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item i {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .summary-cards {\n grid-template-columns: 1fr;\n }\n \n .charts-grid {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}"] }]
|
|
2719
|
+
args: [{ standalone: false, selector: 'mj-ai-agent-run-analytics', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"analytics-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin fa-2x\"></i>\n <p>Loading analytics data...</p>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <mj-empty-state\n Variant=\"error\"\n [Message]=\"error\"\n ActionText=\"Retry\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n (Action)=\"loadData()\" />\n }\n\n <!-- Analytics Content -->\n @if (!isLoading && !error) {\n <div class=\"analytics-content\">\n <!-- Summary Cards -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tachometer-alt\"></i> Overview\n </ng-template>\n <div class=\"summary-cards\">\n <div class=\"summary-card\">\n <div class=\"card-icon prompts\">\n <i class=\"fas fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Prompts</h3>\n <div class=\"metric-value\">{{ promptMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ promptMetrics.statusBreakdown.success }} successful</span>\n @if (promptMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ promptMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon actions\">\n <i class=\"fas fa-cog\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Actions</h3>\n <div class=\"metric-value\">{{ actionMetrics.totalCount }}</div>\n <div class=\"metric-detail\">\n <span class=\"success\">{{ actionMetrics.statusBreakdown.success }} successful</span>\n @if (actionMetrics.statusBreakdown.failed > 0) {\n <span class=\"failed\">{{ actionMetrics.statusBreakdown.failed }} failed</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cost\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Total Cost</h3>\n <!-- The run's OWN spend plus anything it dispatched. A workflow's cost lives on\n Task rows and the prompt runs those tasks produced, which the run's step list\n cannot reach \u2014 so before this the headline figure silently omitted the most\n expensive thing many runs do. -->\n <div class=\"metric-value\">\n {{ formatCost(promptMetrics.costBreakdown.totalCost + DispatchedCost.Cost) }}\n </div>\n @if (HasDispatchedWork) {\n <div class=\"metric-detail cache-detail\">\n <span>{{ formatCost(promptMetrics.costBreakdown.totalCost) }} this run</span>\n <span>+ {{ formatCost(DispatchedCost.Cost) }} across\n {{ DispatchedCost.NodeCount }} workflow step{{ DispatchedCost.NodeCount === 1 ? '' : 's' }}</span>\n </div>\n }\n <div class=\"metric-detail cache-detail\">\n <span>{{ totalTokensProcessed | number }} tokens</span>\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>incl. {{ (promptMetrics.tokenUsage.totalCacheRead + promptMetrics.tokenUsage.totalCacheWrite) | number }} cached</span>\n }\n @if (inputCost > 0 || outputCost > 0) {\n <span>input {{ formatCost(inputCost) }} · output {{ formatCost(outputCost) }}</span>\n }\n <!-- Priced per minute on its own line, so it is not part of the output figure above. -->\n @if (AvatarVideoCost > 0) {\n <span class=\"avatar-video-cost\">avatar video {{ FormatCost(AvatarVideoCost) }}</span>\n }\n @if (cacheSavings > 0) {\n <span class=\"success\">saved {{ formatCost(cacheSavings) }} ({{ cacheSavingsPct | number:'1.0-0' }}%) via cache</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon cache\">\n <i class=\"fas fa-bolt\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Prompt Cache</h3>\n <div class=\"metric-value\">{{ promptMetrics.tokenUsage.totalCacheRead | number }}</div>\n <div class=\"metric-detail cache-detail\">\n <span>tokens read from cache</span>\n @if (promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ promptMetrics.tokenUsage.totalCacheWrite | number }} written</span>\n }\n @if (promptMetrics.tokenUsage.totalCacheRead > 0 || promptMetrics.tokenUsage.totalCacheWrite > 0) {\n <span>{{ cacheHitRatePct | number:'1.0-0' }}% hit rate</span>\n }\n </div>\n </div>\n </div>\n <div class=\"summary-card\">\n <div class=\"card-icon time\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"card-content\">\n <h3>Execution Time</h3>\n <div class=\"metric-value\">{{ formatDuration(promptMetrics.totalExecutionTime + actionMetrics.totalExecutionTime) }}</div>\n <div class=\"metric-detail\">\n <span>{{ timelineMetrics.totalSteps }} total steps</span>\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prompt Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-microchip\"></i> Prompt Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <!-- View Mode Toggle -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"view-mode-toggle\">\n <button mjButton\n variant=\"flat\"\n (click)=\"toggleViewMode()\">\n <i class=\"fas\" [ngClass]=\"viewMode === 'grid' ? 'fa-expand-arrows-alt' : 'fa-compress-arrows-alt'\"></i>\n {{ viewMode === 'grid' ? 'Expand All' : 'Collapse All' }}\n </button>\n </div>\n }\n <!-- No prompts message -->\n @if (promptMetrics.totalCount === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No prompt executions found in this agent run.\"\n Message=\"This agent run may have only executed actions without any AI prompts.\" />\n }\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\">\n <!-- Model Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['modelDistribution']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('modelDistribution')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Prompts by Model</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['modelDistribution'] ? 'Collapse Model Distribution chart' : 'Expand Model Distribution chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['modelDistribution'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"modelDistributionChart\" #modelDistributionChart></div>\n @if (promptMetrics.byModel.size > 0) {\n <div class=\"chart-legend\">\n @for (item of promptMetrics.byModel | keyvalue; track trackByKey($index, item)) {\n <div class=\"legend-item\">\n <span class=\"legend-color\" [style.backgroundColor]=\"getModelColor(item.key)\"></span>\n <span class=\"legend-label\">{{ item.key }}: {{ item.value.count }} ({{ (item.value.count / promptMetrics.totalCount * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Execution Time by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['executionTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('executionTime')\">\n <h3><i class=\"fas fa-clock\"></i> Average Execution Time by Vendor</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['executionTime'] ? 'Collapse Average Execution Time by Vendor chart' : 'Expand Average Execution Time by Vendor chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['executionTime'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"executionTimeChart\" #executionTimeChart></div>\n </div>\n </div>\n </div>\n <!-- Cost by Vendor -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['costByVendor']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('costByVendor')\">\n <h3><i class=\"fas fa-dollar-sign\"></i> Cost Distribution by Vendor</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['costByVendor'] ? 'Collapse Cost Distribution by Vendor chart' : 'Expand Cost Distribution by Vendor chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['costByVendor'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"costByVendorChart\" #costByVendorChart></div>\n <div class=\"chart-total\">Total: {{ formatCost(promptMetrics.costBreakdown.totalCost) }}</div>\n </div>\n </div>\n </div>\n <!-- Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['tokenUsage']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('tokenUsage')\">\n <h3><i class=\"fas fa-coins\"></i> Token Usage by Model</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['tokenUsage'] ? 'Collapse Token Usage by Model chart' : 'Expand Token Usage by Model chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['tokenUsage'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"tokenUsageChart\" #tokenUsageChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Additional Prompt Analytics Charts -->\n @if (promptMetrics.totalCount > 0) {\n <div class=\"charts-grid\" style=\"margin-top: 20px;\">\n <!-- Prompt Execution Time Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptTime']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptTime')\">\n <h3><i class=\"fas fa-hourglass-half\"></i> Average Execution Time by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptTime'] ? 'Collapse Average Execution Time by Prompt chart' : 'Expand Average Execution Time by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptTime'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTimeDistributionChart\" #promptTimeDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Token Usage -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptToken']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptToken')\">\n <h3><i class=\"fas fa-database\"></i> Token Usage by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptToken'] ? 'Collapse Token Usage by Prompt chart' : 'Expand Token Usage by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptToken'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptTokenDistributionChart\" #promptTokenDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Cost Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCost']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCost')\">\n <h3><i class=\"fas fa-chart-pie\"></i> Cost Distribution by Prompt</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptCost'] ? 'Collapse Cost Distribution by Prompt chart' : 'Expand Cost Distribution by Prompt chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCost'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCostDistributionChart\" #promptCostDistributionChart></div>\n </div>\n </div>\n </div>\n <!-- Prompt Count by Name -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['promptCount']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('promptCount')\">\n <h3><i class=\"fas fa-list-ol\"></i> Prompt Execution Count</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['promptCount'] ? 'Collapse Prompt Execution Count chart' : 'Expand Prompt Execution Count chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['promptCount'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"promptCountByNameChart\" #promptCountByNameChart></div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Detailed Prompt Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"promptDetailsExpanded = !promptDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"promptDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Prompt Metrics\n </button>\n @if (promptDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Prompt Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Total Time</th>\n <th>Success Rate</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of promptMetrics.byPrompt | keyvalue; track trackByKey($index, prompt)) {\n <tr>\n <td>{{ prompt.key }}</td>\n <td>{{ prompt.value.count }}</td>\n <td>{{ formatDuration(prompt.value.avgTime) }}</td>\n <td>{{ formatDuration(prompt.value.totalTime) }}</td>\n <td>\n <span class=\"success-rate\">\n <!-- Calculate success rate for this prompt -->\n {{ calculatePromptSuccessRate(prompt.key) }}%\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Action Analytics -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cog\"></i> Action Analytics\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"charts-grid\">\n <!-- Action Success Rate -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['actionSuccess']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('actionSuccess')\">\n <h3><i class=\"fas fa-chart-bar\"></i> Action Success Rate</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['actionSuccess'] ? 'Collapse Action Success Rate chart' : 'Expand Action Success Rate chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['actionSuccess'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"actionSuccessRateChart\" #actionSuccessRateChart></div>\n </div>\n </div>\n </div>\n <!-- Step Type Distribution -->\n <div class=\"chart-card\" [class.expanded]=\"expandedCharts['stepType']\">\n <div class=\"chart-card-header\" (click)=\"toggleChartExpansion('stepType')\">\n <h3><i class=\"fas fa-layer-group\"></i> Step Type Distribution</h3>\n <button class=\"expand-btn\" [attr.aria-label]=\"expandedCharts['stepType'] ? 'Collapse Step Type Distribution chart' : 'Expand Step Type Distribution chart'\">\n <i class=\"fas\" [ngClass]=\"expandedCharts['stepType'] ? 'fa-compress' : 'fa-expand'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"chart-card-body\">\n <div class=\"chart-container\">\n <div id=\"stepTypeChart\" #stepTypeChart></div>\n </div>\n </div>\n </div>\n </div>\n <!-- Detailed Action Metrics -->\n <div class=\"detailed-metrics\">\n <button mjButton\n variant=\"flat\"\n (click)=\"actionDetailsExpanded = !actionDetailsExpanded\">\n <i class=\"fas\" [ngClass]=\"actionDetailsExpanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n Detailed Action Metrics\n </button>\n @if (actionDetailsExpanded) {\n <div class=\"metrics-table\">\n <table>\n <thead>\n <tr>\n <th>Action Name</th>\n <th>Count</th>\n <th>Avg Time</th>\n <th>Success Rate</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n @for (action of actionMetrics.byAction | keyvalue; track trackByKey($index, action)) {\n <tr>\n <td>{{ action.key }}</td>\n <td>{{ action.value.count }}</td>\n <td>{{ formatDuration(action.value.avgTime) }}</td>\n <td>\n <span class=\"success-rate\" [class.high]=\"action.value.successRate > 0.9\"\n [class.medium]=\"action.value.successRate > 0.7 && action.value.successRate <= 0.9\"\n [class.low]=\"action.value.successRate <= 0.7\">\n {{ (action.value.successRate * 100).toFixed(1) }}%\n </span>\n </td>\n <td>{{ getActionType(action.key) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <!-- Error Analysis -->\n <div class=\"error-analysis-section\">\n @if (actionMetrics.errorAnalysis.size > 0) {\n <div class=\"error-analysis\">\n <h3>\n <i class=\"fas fa-exclamation-triangle\"></i>\n Common Errors\n </h3>\n <p class=\"error-analysis-description\">\n This section shows the most frequent error messages from failed actions, helping identify systemic issues that may need attention.\n </p>\n <div class=\"error-list\">\n @for (error of getTopErrors(); track trackByErrorMessage($index, error)) {\n <div class=\"error-item\">\n <span class=\"error-count\">{{ error.count }}x</span>\n <span class=\"error-message\">{{ error.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (actionMetrics.errorAnalysis.size === 0) {\n <mj-empty-state\n Variant=\"success\"\n Message=\"No action errors detected in this run. All actions completed successfully!\" />\n }\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Model Performance Comparison -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-chart-line\"></i> Model Performance Comparison\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"model-comparison\">\n <table>\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th>Prompts</th>\n <th>Avg Time</th>\n <th>Total Cost</th>\n <th>Avg Cost/Prompt</th>\n <th>Input Tokens</th>\n <th>Output Tokens</th>\n </tr>\n </thead>\n <tbody>\n @for (model of getModelPerformanceData(); track trackByModelName($index, model)) {\n <tr>\n <td>{{ model.name }}</td>\n <td>{{ model.vendor }}</td>\n <td>{{ model.count }}</td>\n <td>{{ formatDuration(model.avgTime) }}</td>\n <td>{{ formatCost(model.totalCost) }}</td>\n <td>{{ formatCost(model.avgCost) }}</td>\n <td>{{ model.inputTokens | number:'1.0-0' }}</td>\n <td>{{ model.outputTokens | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Timeline Analysis -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-stream\"></i> Execution Timeline Analysis\n </ng-template>\n <div class=\"analytics-panel\">\n <div class=\"timeline-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Steps</span>\n <span class=\"stat-value\">{{ timelineMetrics.totalSteps }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Parallel Executions</span>\n <span class=\"stat-value\">{{ timelineMetrics.parallelExecutions }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Max Nesting Depth</span>\n <span class=\"stat-value\">{{ timelineMetrics.deepestNesting }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Sub-Agent Runs</span>\n <span class=\"stat-value\">{{ subAgentRuns.length }}</span>\n </div>\n </div>\n <div class=\"step-breakdown\">\n <h3>Steps by Type</h3>\n <div class=\"step-type-list\">\n @for (type of timelineMetrics.stepsByType | keyvalue; track trackByKey($index, type)) {\n <div class=\"step-type-item\">\n <i class=\"fas\" [ngClass]=\"getStepTypeIcon(type.key)\"></i>\n <span class=\"type-name\">{{ type.key }}</span>\n <span class=\"type-count\">{{ type.value }}</span>\n <span class=\"type-percentage\">({{ (type.value / timelineMetrics.totalSteps * 100).toFixed(1) }}%)</span>\n </div>\n }\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n </div>\n }\n</div>", styles: [".analytics-container {\n padding: 20px;\n height: 100%;\n overflow-y: auto;\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Loading State */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i {\n margin-bottom: 15px;\n}\n\n/* Summary Cards */\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.summary-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.summary-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.card-icon {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 20px;\n font-size: 24px;\n color: var(--mj-text-inverse);\n}\n\n.card-icon.prompts {\n background: var(--mj-brand-primary);\n}\n\n.card-icon.actions {\n background: var(--mj-status-error);\n}\n\n.card-icon.cost {\n background: var(--mj-status-success);\n}\n\n.card-icon.time {\n background: var(--mj-status-warning);\n}\n\n.card-icon.cache {\n background: var(--mj-status-info);\n}\n\n.card-content h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.metric-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.metric-detail .success {\n color: var(--mj-status-success);\n margin-right: 10px;\n}\n\n.metric-detail .failed {\n color: var(--mj-status-error);\n}\n\n/* Cache card stacks its facts (caption / written / hit rate) one per line. */\n.metric-detail.cache-detail span {\n display: block;\n}\n\n/* Analytics Panels */\n.analytics-panel {\n padding: 15px;\n}\n\n/* Accordion Panel Styling */\n.analytics-content mj-accordion-panel {\n display: block;\n margin-bottom: 12px;\n}\n\n/* Charts */\n.charts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n/* Chart Cards */\n.chart-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.chart-card.expanded {\n grid-column: 1 / -1;\n}\n\n.chart-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n}\n\n.chart-card-header:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.chart-card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.chart-card-header h3 i {\n font-size: 16px;\n color: var(--mj-text-muted);\n}\n\n.expand-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.expand-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.chart-card-body {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n}\n\n.chart-card.expanded .chart-card-body {\n padding: 24px;\n}\n\n.chart-card.expanded .chart-container > div {\n min-height: 400px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.view-mode-toggle button {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.chart-container {\n position: relative;\n}\n\n.chart-container h3 {\n margin: 0 0 10px 0;\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.chart-container > div {\n min-height: 220px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Ensure SVG charts are centered */\n.chart-container svg {\n display: block;\n margin: 0 auto;\n}\n\n.chart-legend {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.legend-color {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n}\n\n.chart-total {\n text-align: center;\n margin-top: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n/* Detailed Metrics */\n.detailed-metrics {\n margin-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 20px;\n}\n\n.detailed-metrics button {\n margin-bottom: 15px;\n}\n\n.detailed-metrics button i {\n margin-right: 8px;\n}\n\n.metrics-table {\n overflow-x: auto;\n}\n\n.metrics-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.metrics-table th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n}\n\n.metrics-table td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.metrics-table tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.success-rate {\n font-weight: 500;\n}\n\n.success-rate.high {\n color: var(--mj-status-success);\n}\n\n.success-rate.medium {\n color: var(--mj-status-warning);\n}\n\n.success-rate.low {\n color: var(--mj-status-error);\n}\n\n/* Error Analysis */\n.error-analysis {\n margin-top: 30px;\n padding: 20px;\n background-color: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n}\n\n.error-analysis h3 {\n margin: 0 0 15px 0;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.error-analysis-description {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n.error-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.error-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px;\n background-color: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 14px;\n}\n\n.error-count {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.error-message {\n flex: 1;\n color: var(--mj-text-secondary);\n}\n\n/* Model Comparison Table */\n.model-comparison {\n overflow-x: auto;\n}\n\n.model-comparison table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.model-comparison th {\n background-color: var(--mj-bg-surface-sunken);\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n border-bottom: 2px solid var(--mj-border-strong);\n white-space: nowrap;\n}\n\n.model-comparison td {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.model-comparison tr:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Timeline Analysis */\n.timeline-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.stat-label {\n font-size: 14px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.stat-value {\n font-size: 32px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.step-breakdown h3 {\n margin: 0 0 15px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.step-type-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.step-type-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.step-type-item i {\n width: 30px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.type-name {\n flex: 1;\n font-weight: 500;\n}\n\n.type-count {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.type-percentage {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: 5px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .summary-cards {\n grid-template-columns: 1fr;\n }\n \n .charts-grid {\n grid-template-columns: 1fr;\n }\n \n .timeline-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}"] }]
|
|
2701
2720
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.AIAgentRunCostService }], { agentRunId: [{
|
|
2702
2721
|
type: Input
|
|
2703
2722
|
}], RunTree: [{
|
|
@@ -2733,5 +2752,5 @@ export class AIAgentRunAnalyticsComponent extends BaseAngularComponent {
|
|
|
2733
2752
|
type: ViewChild,
|
|
2734
2753
|
args: ['promptCountByNameChart', { static: false }]
|
|
2735
2754
|
}] }); })();
|
|
2736
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunAnalyticsComponent, { className: "AIAgentRunAnalyticsComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-analytics.component.ts", lineNumber:
|
|
2755
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunAnalyticsComponent, { className: "AIAgentRunAnalyticsComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-analytics.component.ts", lineNumber: 87 }); })();
|
|
2737
2756
|
//# sourceMappingURL=ai-agent-run-analytics.component.js.map
|