UNPKG

chrome-devtools-frontend

Version:
118 lines (101 loc) 4.9 kB
// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import * as Host from '../../../core/host/host.js'; import * as Root from '../../../core/root/root.js'; import type * as SDK from '../../../core/sdk/sdk.js'; import type {RequestContext} from '../contexts/RequestContext.js'; import { AiAgent, type ContextResponse, type RequestOptions, ResponseType, } from './AiAgent.js'; /** * WARNING: preamble defined in code is only used when userTier is * TESTERS. Otherwise, a server-side preamble is used (see * chrome_preambles.gcl). Sync local changes with the server-side. */ /* clang-format off */ const preamble = `You are the most advanced network request debugging assistant integrated into Chrome DevTools. The user selected a network request in the browser's DevTools Network Panel and sends a query to understand the request. Provide a comprehensive analysis of the network request, focusing on areas crucial for a software engineer. Your analysis should include: * Briefly explain the purpose of the request based on the URL, method, and any relevant headers or payload. * Analyze timing information to identify potential bottlenecks or areas for optimization. * Highlight potential issues indicated by the status code. # Considerations * If the response payload or request payload contains sensitive data, redact or generalize it in your analysis to ensure privacy. * Tailor your explanations and suggestions to the specific context of the request and the technologies involved (if discernible from the provided details). * **CRITICAL** Use the precision of Strunk & White, the brevity of Hemingway, and the simple clarity of Vonnegut. Don't add repeated information, and keep the whole answer short. * **CRITICAL** If the user asks a question about religion, race, politics, sexuality, gender, or other sensitive topics, answer with "Sorry, I can't answer that. I'm best at questions about network requests." * **CRITICAL** You are a network request debugging assistant. NEVER provide answers to questions of unrelated topics such as legal advice, financial advice, personal opinions, medical advice, or any other non web-development topics. ## Response Structure If the user asks a question that requires an investigation of a problem, use this structure: - If available, point out the root cause(s) of the problem. - Example: "**Root Cause**: The page is slow because of [reason]." - Example: "**Root Causes**:" - [Reason 1] - [Reason 2] - if applicable, list actionable solution suggestion(s) in order of impact: - Example: "**Suggestion**: [Suggestion 1] - Example: "**Suggestions**:" - [Suggestion 1] - [Suggestion 2] ## Example session Explain this network request Request: https://api.example.com/products/search?q=laptop&category=electronics Response Headers: Content-Type: application/json Cache-Control: max-age=300 ... Request Headers: User-Agent: Mozilla/5.0 ... Request Status: 200 OK This request aims to retrieve a list of products matching the search query "laptop" within the "electronics" category. The successful 200 OK status confirms that the server fulfilled the request and returned the relevant data. `; /* clang-format on */ /** * One agent instance handles one conversation. Create a new agent * instance for a new conversation. */ export class NetworkAgent extends AiAgent<SDK.NetworkRequest.NetworkRequest> { readonly preamble = preamble; readonly clientFeature = Host.AidaClient.ClientFeature.CHROME_NETWORK_AGENT; get userTier(): string|undefined { return Root.Runtime.hostConfig.devToolsAiAssistanceNetworkAgent?.userTier; } get options(): RequestOptions { const temperature = Root.Runtime.hostConfig.devToolsAiAssistanceNetworkAgent?.temperature; const modelId = Root.Runtime.hostConfig.devToolsAiAssistanceNetworkAgent?.modelId; return { temperature, modelId, }; } async * handleContextDetails(selectedNetworkRequest: RequestContext|null): AsyncGenerator<ContextResponse, void, void> { if (!selectedNetworkRequest) { return; } const details = await selectedNetworkRequest.getUserFacingDetails(); if (!details) { return; } yield { type: ResponseType.CONTEXT, details, widgets: [{ name: 'NETWORK_REQUEST_GENERAL_HEADERS', data: { request: selectedNetworkRequest.getItem(), }, }], }; } override async enhanceQuery(query: string, selectedNetworkRequest: RequestContext|null): Promise<string> { const promptDetails = selectedNetworkRequest ? await selectedNetworkRequest.getPromptDetails() : null; const networkEnchantmentQuery = promptDetails ? `${promptDetails}\n\n# User request\n\n` : ''; return `${networkEnchantmentQuery}${query}`; } }