Skip to content

Commit 4557781

Browse files
google-genai-botcopybara-github
authored andcommitted
ADK changes
PiperOrigin-RevId: 812476207
1 parent 3f7be43 commit 4557781

File tree

14 files changed

+111
-22
lines changed

14 files changed

+111
-22
lines changed

src/app/components/chat/chat.component.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import {EVAL_SERVICE, EvalService} from '../../core/services/eval.service';
5353
import {EVENT_SERVICE, EventService} from '../../core/services/event.service';
5454
import {FEATURE_FLAG_SERVICE, FeatureFlagService} from '../../core/services/feature-flag.service';
5555
import {GRAPH_SERVICE, GraphService} from '../../core/services/graph.service';
56-
import {SAFE_VALUES_SERVICE} from '../../core/services/interfaces/safevalues';
56+
import {SAFE_VALUES_SERVICE, SafeValuesService} from '../../core/services/interfaces/safevalues';
5757
import {STRING_TO_COLOR_SERVICE} from '../../core/services/interfaces/string-to-color';
5858
import {SESSION_SERVICE, SessionService} from '../../core/services/session.service';
5959
import {TRACE_SERVICE, TraceService} from '../../core/services/trace.service';
@@ -271,7 +271,6 @@ export class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
271271
hoveredEventMessageIndices: number[] = [];
272272

273273
constructor(
274-
private sanitizer: DomSanitizer,
275274
@Inject(SESSION_SERVICE) private sessionService: SessionService,
276275
@Inject(ARTIFACT_SERVICE) private artifactService: ArtifactService,
277276
@Inject(AUDIO_SERVICE) private audioService: AudioService,
@@ -951,7 +950,8 @@ export class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
951950
const graphSrc = res.dotSrc;
952951
const svg = await this.graphService.render(graphSrc);
953952
this.rawSvgString = svg;
954-
this.renderedEventGraph = this.sanitizer.bypassSecurityTrustHtml(svg);
953+
this.renderedEventGraph =
954+
this.safeValuesService.bypassSecurityTrustHtml(svg);
955955
});
956956
}
957957

@@ -1405,7 +1405,8 @@ export class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
14051405
}
14061406
const svg = await this.graphService.render(res.dotSrc);
14071407
this.rawSvgString = svg;
1408-
this.renderedEventGraph = this.sanitizer.bypassSecurityTrustHtml(svg);
1408+
this.renderedEventGraph =
1409+
this.safeValuesService.bypassSecurityTrustHtml(svg);
14091410
});
14101411
}
14111412

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* @license
3+
* Copyright 2025 Google LLC
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import {CommonModule} from '@angular/common';
19+
import {Component, input} from '@angular/core';
20+
21+
import {MarkdownComponentInterface} from '../markdown.component.interface';
22+
23+
/**
24+
* Mock markdown component for testing.
25+
*/
26+
@Component({
27+
selector: 'app-markdown',
28+
imports: [CommonModule],
29+
template: `
30+
<div class="mock-markdown-content">
31+
<span [ngStyle]="{
32+
'font-style': thought() ? 'italic' : 'normal',
33+
'color': thought() ? '#9aa0a6' : 'white'
34+
}">
35+
{{ text() }}
36+
</span>
37+
</div>
38+
`,
39+
standalone: true,
40+
})
41+
export class MockMarkdownComponent implements MarkdownComponentInterface {
42+
text = input<string>('');
43+
thought = input<boolean>(false);
44+
}

src/app/components/side-panel/side-panel.component.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ import {EVENT_SERVICE, EventService} from '../../core/services/event.service';
3535
import {FEATURE_FLAG_SERVICE, FeatureFlagService,} from '../../core/services/feature-flag.service';
3636
import {SAFE_VALUES_SERVICE} from '../../core/services/interfaces/safevalues';
3737
import {SESSION_SERVICE, SessionService,} from '../../core/services/session.service';
38-
import {TRACE_SERVICE, TraceService} from '../../core/services/trace.service';
38+
import {MockFeatureFlagService} from '../../core/services/testing/mock-feature-flag.service';
3939
import {MockSafeValuesService} from '../../core/services/testing/mock-safevalues.service';
40+
import {TRACE_SERVICE, TraceService} from '../../core/services/trace.service';
4041
import {VIDEO_SERVICE, VideoService} from '../../core/services/video.service';
4142
import {WEBSOCKET_SERVICE, WebSocketService,} from '../../core/services/websocket.service';
4243

@@ -71,7 +72,7 @@ describe('SidePanelComponent', () => {
7172
let mockEvalService: jasmine.SpyObj<EvalService>;
7273
let mockTraceService: jasmine.SpyObj<TraceService>;
7374
let mockAgentService: jasmine.SpyObj<AgentService>;
74-
let mockFeatureFlagService: jasmine.SpyObj<FeatureFlagService>;
75+
let mockFeatureFlagService: MockFeatureFlagService;
7576
let mockDialog: jasmine.SpyObj<MatDialog>;
7677
let mockSnackBar: jasmine.SpyObj<MatSnackBar>;
7778
let mockRouter: jasmine.SpyObj<Router>;
@@ -135,10 +136,7 @@ describe('SidePanelComponent', () => {
135136
'AgentService',
136137
['listApps', 'getApp', 'getLoadingState', 'setApp', 'runSse'],
137138
);
138-
mockFeatureFlagService = jasmine.createSpyObj(
139-
'FeatureFlagService',
140-
['isImportSessionEnabled', 'isEditFunctionArgsEnabled'],
141-
);
139+
mockFeatureFlagService = new MockFeatureFlagService();
142140
mockDialog = jasmine.createSpyObj('MatDialog', ['open']);
143141
mockSnackBar = jasmine.createSpyObj('MatSnackBar', ['open']);
144142
mockRouter = jasmine.createSpyObj('Router', ['navigate']);
@@ -154,6 +152,8 @@ describe('SidePanelComponent', () => {
154152
mockEvalService.listEvalResults.and.returnValue(of([]));
155153
mockFeatureFlagService.isEditFunctionArgsEnabled.and.returnValue(of(false));
156154
mockFeatureFlagService.isImportSessionEnabled.and.returnValue(of(false));
155+
mockFeatureFlagService.isAlwaysOnSidePanelEnabled.and.returnValue(
156+
of(false));
157157
mockEvalService.getEvalResult.and.returnValue(of({}));
158158

159159
await TestBed

src/app/components/trace-tab/trace-event/trace-event.component.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ describe('TraceEventComponent', () => {
6969
traceService.eventData$.next(
7070
new Map<string, any>([[EVENT_ID, EVENT_DATA]]));
7171
eventService.getEventTraceResponse.next({
72+
name: 'test-span',
73+
trace_id: 'trace-id',
74+
span_id: 'span-id',
75+
start_time: 1,
76+
end_time: 2,
7277
'gcp.vertex.agent.llm_request': '{"data": "request"}',
7378
'gcp.vertex.agent.llm_response': '{"data": "response"}',
7479
});

src/app/components/trace-tab/trace-tree/trace-tree.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@
3636
<span
3737
class="material-symbols-outlined"
3838
style="margin-right: 8px"
39-
[ngStyle]="{ color: isEventRow(node)? '#8AB4F8' : 'white' }"
39+
[class.is-event-row]="isEventRow(node)"
4040
>
4141
{{ getSpanIcon(node.span.name) }}
4242
</span>
4343
<div
4444
class="trace-label"
4545
[style.width.px]="400 - node.level * 20"
46-
[ngStyle]="{ color: isEventRow(node)? '#8AB4F8' : 'white' }"
46+
[class.is-event-row]="isEventRow(node)"
4747
>
4848
{{ node.span.name }}
4949
</div>
@@ -58,7 +58,7 @@
5858
</div>
5959
@if (getRelativeWidth(node.span) < 10) {
6060
<span
61-
style="position: absolute; color: #8dabbf"
61+
class="short-trace-bar-duration"
6262
[style.left.%]="getRelativeStart(node.span) + 5"
6363
>{{ (toMs(node.span.end_time) - toMs(node.span.start_time)).toFixed(2) }}ms</span
6464
>

src/app/components/trace-tab/trace-tree/trace-tree.component.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@
5252
font-family: 'Google Sans';
5353
}
5454

55+
.short-trace-bar-duration {
56+
position: absolute;
57+
color: #8dabbf;
58+
}
59+
5560
.trace-duration {
5661
color: #888;
5762
font-weight: normal;
@@ -124,3 +129,12 @@
124129
.invocation-id {
125130
font-family: 'Google Sans Mono', monospace;
126131
}
132+
133+
.trace-row-left span,
134+
.trace-row-left div {
135+
color: white;
136+
}
137+
138+
.trace-row-left .is-event-row {
139+
color: #8ab4f8;
140+
}

src/app/core/models/Session.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ export interface Session {
3232
userId?: string;
3333
state?: SessionState;
3434
events?: Event[];
35+
lastUpdateTime?: number;
3536
}

src/app/core/models/Trace.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ export interface Span {
2323
trace_id: string;
2424
attributes?: any;
2525
children?: Span[];
26+
// For backward compatibility.
27+
'gcp.vertex.agent.llm_request'?: string;
28+
'gcp.vertex.agent.llm_response'?: string;
2629
}
2730

2831
export interface SpanNode extends Span {

src/app/core/services/interfaces/safevalues.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
import {InjectionToken} from '@angular/core';
19+
import {SafeHtml} from '@angular/platform-browser';
1920

2021
export const SAFE_VALUES_SERVICE = new InjectionToken<SafeValuesService>(
2122
'SafeValuesService',
@@ -37,6 +38,8 @@ export abstract class SafeValuesService {
3738

3839
abstract setAnchorHref(a: HTMLAnchorElement, url: string): void;
3940

41+
abstract bypassSecurityTrustHtml(value: string): SafeHtml;
42+
4043
openBase64InNewTab(dataUrl: string, mimeType: string) {
4144
try {
4245
if (!dataUrl) {

src/app/core/services/safevalues.service.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
* limitations under the License.
1616
*/
1717

18-
import {Injectable} from '@angular/core';
18+
import {inject, Injectable} from '@angular/core';
19+
import {DomSanitizer, SafeHtml} from '@angular/platform-browser';
1920

2021
import {SafeValuesService} from './interfaces/safevalues';
2122

@@ -27,6 +28,8 @@ import {SafeValuesService} from './interfaces/safevalues';
2728
providedIn: 'root',
2829
})
2930
export class SafeValuesServiceImpl extends SafeValuesService {
31+
private sanitizer = inject(DomSanitizer);
32+
3033
windowOpen(window: Window,
3134
url: string,
3235
target?: string,
@@ -47,4 +50,8 @@ export class SafeValuesServiceImpl extends SafeValuesService {
4750
setAnchorHref(a: HTMLAnchorElement, url: string) {
4851
a.href = url;
4952
}
53+
54+
bypassSecurityTrustHtml(content: string): SafeHtml {
55+
return this.sanitizer.bypassSecurityTrustHtml(content);
56+
}
5057
}

0 commit comments

Comments
 (0)