Skip to content

Commit 1bf20dc

Browse files
jackfranklinDevtools-frontend LUCI CQ
authored andcommitted
AI: make AI formatters take unit formatters as input
So they can be reused in the future outside of this repo, we want to reduce the amount of DevTools they pull in. DISABLE_SPELLCHECKER=finding issues in test data that we do not control Bug: 441265851 Change-Id: I394ab89c05c0c039a98e4ee012c4a3e276100dba Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6905368 Reviewed-by: Alex Rudenko <[email protected]> Commit-Queue: Alex Rudenko <[email protected]> Auto-Submit: Jack Franklin <[email protected]>
1 parent 587c5f4 commit 1bf20dc

14 files changed

+411
-356
lines changed

config/gni/devtools_grd_files.gni

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,7 @@ grd_files_unbundled_sources = [
10221022
"front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js",
10231023
"front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js",
10241024
"front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js",
1025+
"front_end/models/ai_assistance/data_formatters/Types.js",
10251026
"front_end/models/ai_assistance/debug.js",
10261027
"front_end/models/ai_assistance/injected.js",
10271028
"front_end/models/ai_code_completion/AiCodeCompletion.js",

front_end/models/ai_assistance/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ devtools_module("ai_assistance") {
2727
"data_formatters/NetworkRequestFormatter.ts",
2828
"data_formatters/PerformanceInsightFormatter.ts",
2929
"data_formatters/PerformanceTraceFormatter.ts",
30+
"data_formatters/Types.ts",
3031
"debug.ts",
3132
"injected.ts",
3233
]

front_end/models/ai_assistance/agents/PerformanceAgent.test.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import * as Trace from '../../trace/trace.js';
2020
import {
2121
type ActionResponse,
2222
ConversationType,
23+
PERF_AGENT_UNIT_FORMATTERS,
2324
PerformanceAgent,
2425
PerformanceInsightFormatter,
2526
PerformanceTraceContext,
@@ -350,7 +351,9 @@ code
350351
}]])
351352
});
352353

353-
const expectedDetailText = new PerformanceInsightFormatter(FAKE_PARSED_TRACE, FAKE_LCP_MODEL).formatInsight();
354+
const expectedDetailText =
355+
new PerformanceInsightFormatter(PERF_AGENT_UNIT_FORMATTERS, FAKE_PARSED_TRACE, FAKE_LCP_MODEL)
356+
.formatInsight();
354357

355358
const responses = await Array.fromAsync(agent.run('test', {selected: context}));
356359
assert.deepEqual(responses, [
@@ -388,7 +391,9 @@ code
388391
});
389392

390393
const context = PerformanceTraceContext.fromInsight(FAKE_PARSED_TRACE, FAKE_LCP_MODEL, FAKE_INSIGHT_SET_BOUNDS);
391-
const extraContext = new PerformanceInsightFormatter(FAKE_PARSED_TRACE, FAKE_LCP_MODEL).formatInsight();
394+
const extraContext =
395+
new PerformanceInsightFormatter(PERF_AGENT_UNIT_FORMATTERS, FAKE_PARSED_TRACE, FAKE_LCP_MODEL)
396+
.formatInsight();
392397

393398
const finalQuery = await agent.enhanceQuery('What is this?', context);
394399
const expected = `${extraContext}
@@ -461,7 +466,8 @@ Help me understand?`;
461466
return match;
462467
});
463468

464-
const expectedRequestsOutput = TraceEventFormatter.networkRequests(requests, parsedTrace);
469+
const expectedRequestsOutput =
470+
TraceEventFormatter.networkRequests(PERF_AGENT_UNIT_FORMATTERS, requests, parsedTrace);
465471

466472
const expectedBytesSize = Platform.StringUtilities.countWtf8Bytes(expectedRequestsOutput);
467473
sinon.assert.calledWith(metricsSpy, expectedBytesSize);
@@ -505,7 +511,8 @@ Help me understand?`;
505511
const request = parsedTrace.NetworkRequests.byTime.find(r => r.args.data.url === requestUrl);
506512
assert.isOk(request);
507513

508-
const expectedRequestOutput = TraceEventFormatter.networkRequests([request], parsedTrace, {verbose: true});
514+
const expectedRequestOutput =
515+
TraceEventFormatter.networkRequests(PERF_AGENT_UNIT_FORMATTERS, [request], parsedTrace, {verbose: true});
509516
const expectedOutput = JSON.stringify({request: expectedRequestOutput});
510517

511518
const expectedBytesSize = Platform.StringUtilities.countWtf8Bytes(expectedRequestOutput);

front_end/models/ai_assistance/agents/PerformanceAgent.ts

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ import * as TimelineUtils from '../../../panels/timeline/utils/utils.js';
1414
import {html, type TemplateResult} from '../../../ui/lit/lit.js';
1515
import * as Trace from '../../trace/trace.js';
1616
import {ConversationType} from '../AiHistoryStorage.js';
17-
import {PerformanceInsightFormatter, TraceEventFormatter} from '../data_formatters/PerformanceInsightFormatter.js';
17+
import {
18+
PerformanceInsightFormatter,
19+
TraceEventFormatter,
20+
} from '../data_formatters/PerformanceInsightFormatter.js';
1821
import {PerformanceTraceFormatter} from '../data_formatters/PerformanceTraceFormatter.js';
22+
import type {UnitFormatters} from '../data_formatters/Types.js';
1923
import {debugLog} from '../debug.js';
2024

2125
import {
@@ -284,6 +288,19 @@ enum ScorePriority {
284288
DEFAULT = 1,
285289
}
286290

291+
export const PERF_AGENT_UNIT_FORMATTERS: UnitFormatters = {
292+
micros(x) {
293+
const milli = Trace.Helpers.Timing.microToMilli(x as Trace.Types.Timing.Micro);
294+
return PERF_AGENT_UNIT_FORMATTERS.millis(milli);
295+
},
296+
millis(x) {
297+
return i18n.TimeUtilities.preciseMillisToString(x, 1, ' ');
298+
},
299+
bytes(x) {
300+
return i18n.ByteUtilities.bytesToString(x);
301+
},
302+
};
303+
287304
export class PerformanceTraceContext extends ConversationContext<TimelineUtils.AIContext.AgentFocus> {
288305
static full(
289306
parsedTrace: Trace.Handlers.Types.ParsedTrace, insights: Trace.Insights.Types.TraceInsightSets,
@@ -393,7 +410,8 @@ export class PerformanceTraceContext extends ConversationContext<TimelineUtils.A
393410
return;
394411
}
395412

396-
return new PerformanceInsightFormatter(focus.parsedTrace, focus.insight).getSuggestions();
413+
return new PerformanceInsightFormatter(PERF_AGENT_UNIT_FORMATTERS, focus.parsedTrace, focus.insight)
414+
.getSuggestions();
397415
}
398416
}
399417

@@ -538,7 +556,8 @@ export class PerformanceAgent extends AiAgent<TimelineUtils.AIContext.AgentFocus
538556
}
539557

540558
if (focus.data.type === 'insight') {
541-
const formatter = new PerformanceInsightFormatter(focus.data.parsedTrace, focus.data.insight);
559+
const formatter =
560+
new PerformanceInsightFormatter(PERF_AGENT_UNIT_FORMATTERS, focus.data.parsedTrace, focus.data.insight);
542561
return formatter.formatInsight();
543562
}
544563

@@ -782,7 +801,7 @@ export class PerformanceAgent extends AiAgent<TimelineUtils.AIContext.AgentFocus
782801
this.addFact(this.#networkDataDescriptionFact);
783802

784803
if (!this.#traceFacts.length) {
785-
this.#formatter = new PerformanceTraceFormatter(focus, this.#eventsSerializer);
804+
this.#formatter = new PerformanceTraceFormatter(PERF_AGENT_UNIT_FORMATTERS, focus, this.#eventsSerializer);
786805
this.#createFactForTraceSummary(focus);
787806
this.#createFactForCriticalRequests();
788807
this.#createFactForMainThreadBottomUpSummary();
@@ -847,7 +866,8 @@ export class PerformanceAgent extends AiAgent<TimelineUtils.AIContext.AgentFocus
847866
return {error: 'No insight available'};
848867
}
849868

850-
const details = new PerformanceInsightFormatter(parsedTrace, insight).formatInsight();
869+
const details =
870+
new PerformanceInsightFormatter(PERF_AGENT_UNIT_FORMATTERS, parsedTrace, insight).formatInsight();
851871

852872
const key = `getInsightDetails('${params.insightName}')`;
853873
this.#cacheFunctionResult(focus, key, details);
@@ -1122,7 +1142,7 @@ export class PerformanceAgent extends AiAgent<TimelineUtils.AIContext.AgentFocus
11221142
insightSetBounds,
11231143
parsedTrace,
11241144
);
1125-
const formatted = TraceEventFormatter.networkRequests(requests, parsedTrace);
1145+
const formatted = TraceEventFormatter.networkRequests(PERF_AGENT_UNIT_FORMATTERS, requests, parsedTrace);
11261146

11271147
const byteCount = Platform.StringUtilities.countWtf8Bytes(formatted);
11281148
Host.userMetrics.performanceAINetworkSummaryResponseSize(byteCount);
@@ -1179,7 +1199,8 @@ export class PerformanceAgent extends AiAgent<TimelineUtils.AIContext.AgentFocus
11791199
if (!request) {
11801200
return {error: 'Request not found'};
11811201
}
1182-
const formatted = TraceEventFormatter.networkRequests([request], parsedTrace, {verbose: true});
1202+
const formatted =
1203+
TraceEventFormatter.networkRequests(PERF_AGENT_UNIT_FORMATTERS, [request], parsedTrace, {verbose: true});
11831204

11841205
const byteCount = Platform.StringUtilities.countWtf8Bytes(formatted);
11851206
Host.userMetrics.performanceAINetworkRequestDetailResponseSize(byteCount);

front_end/models/ai_assistance/ai_assistance.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ export * from './data_formatters/FileFormatter.js';
2020
export * from './data_formatters/NetworkRequestFormatter.js';
2121
export * from './data_formatters/PerformanceInsightFormatter.js';
2222
export * from './data_formatters/PerformanceTraceFormatter.js';
23+
export * from './data_formatters/Types.js';
2324
export * from './ConversationHandler.js';

0 commit comments

Comments
 (0)