AI API
The AI API provides access to Trae IDE's artificial intelligence capabilities, enabling intelligent code generation, analysis, and assistance features in your extensions.
Overview
The AI API allows you to:
- Generate code using AI models
- Analyze code for patterns and issues
- Provide intelligent suggestions and completions
- Integrate with chat-based AI assistance
- Customize AI behavior for specific use cases
Core Interfaces
AIProvider
Main interface for accessing AI capabilities.
typescript
interface AIProvider {
readonly models: readonly AIModel[];
readonly isAvailable: boolean;
generateCode(request: CodeGenerationRequest): Promise<CodeGenerationResponse>;
analyzeCode(request: CodeAnalysisRequest): Promise<CodeAnalysisResponse>;
chat(request: ChatRequest): Promise<ChatResponse>;
complete(request: CompletionRequest): Promise<CompletionResponse>;
explain(request: ExplanationRequest): Promise<ExplanationResponse>;
}AIModel
Represents an available AI model.
typescript
interface AIModel {
readonly id: string;
readonly name: string;
readonly description: string;
readonly capabilities: AICapability[];
readonly maxTokens: number;
readonly supportedLanguages: string[];
}
enum AICapability {
CodeGeneration = 'code-generation',
CodeAnalysis = 'code-analysis',
Chat = 'chat',
Completion = 'completion',
Explanation = 'explanation',
Translation = 'translation',
Refactoring = 'refactoring'
}Getting Started
Accessing the AI Provider
typescript
import { TraeAPI } from '@trae/api';
// Get the AI provider
const aiProvider = TraeAPI.ai.getProvider();
if (aiProvider.isAvailable) {
console.log('AI is available');
console.log('Available models:', aiProvider.models.map(m => m.name));
} else {
console.log('AI is not available');
}Checking Model Capabilities
typescript
function findModelWithCapability(capability: AICapability): AIModel | undefined {
return aiProvider.models.find(model =>
model.capabilities.includes(capability)
);
}
// Find a model that can generate code
const codeGenModel = findModelWithCapability(AICapability.CodeGeneration);
if (codeGenModel) {
console.log(`Using ${codeGenModel.name} for code generation`);
}Code Generation
Basic Code Generation
typescript
interface CodeGenerationRequest {
prompt: string;
language: string;
context?: CodeContext;
model?: string;
maxTokens?: number;
temperature?: number;
stopSequences?: string[];
}
interface CodeGenerationResponse {
code: string;
explanation?: string;
confidence: number;
model: string;
usage: TokenUsage;
}
// Generate a function
const request: CodeGenerationRequest = {
prompt: 'Create a function that calculates the factorial of a number',
language: 'typescript',
context: {
currentFile: editor.document.uri,
cursorPosition: editor.selection.active,
selectedText: editor.document.getText(editor.selection)
}
};
const response = await aiProvider.generateCode(request);
console.log('Generated code:', response.code);
console.log('Explanation:', response.explanation);Advanced Code Generation
typescript
// Generate code with specific requirements
const advancedRequest: CodeGenerationRequest = {
prompt: 'Create a React component for a user profile card',
language: 'typescript',
context: {
currentFile: editor.document.uri,
imports: [
'import React from "react";',
'import { User } from "./types";'
],
existingCode: editor.document.getText(),
projectStructure: await getProjectStructure()
},
maxTokens: 1000,
temperature: 0.7,
stopSequences: ['\n\n\n']
};
const response = await aiProvider.generateCode(advancedRequest);
// Insert the generated code
if (response.confidence > 0.8) {
await editor.edit(editBuilder => {
editBuilder.insert(editor.selection.active, response.code);
});
} else {
// Show the code for review
TraeAPI.window.showInformationMessage(
`Generated code (confidence: ${response.confidence})`,
'Insert', 'Review'
).then(choice => {
if (choice === 'Insert') {
editor.edit(editBuilder => {
editBuilder.insert(editor.selection.active, response.code);
});
} else if (choice === 'Review') {
showCodeReviewPanel(response);
}
});
}Code Context
typescript
interface CodeContext {
currentFile?: TraeAPI.Uri;
cursorPosition?: TraeAPI.Position;
selectedText?: string;
imports?: string[];
existingCode?: string;
projectStructure?: ProjectStructure;
dependencies?: string[];
framework?: string;
codeStyle?: CodeStyle;
}
interface ProjectStructure {
files: string[];
directories: string[];
packageJson?: any;
tsConfig?: any;
}
interface CodeStyle {
indentation: 'spaces' | 'tabs';
indentSize: number;
quotes: 'single' | 'double';
semicolons: boolean;
trailingCommas: boolean;
}Code Analysis
Analyzing Code Quality
typescript
interface CodeAnalysisRequest {
code: string;
language: string;
analysisType: AnalysisType[];
context?: CodeContext;
}
enum AnalysisType {
Quality = 'quality',
Security = 'security',
Performance = 'performance',
Maintainability = 'maintainability',
Bugs = 'bugs',
CodeSmells = 'code-smells',
Complexity = 'complexity'
}
interface CodeAnalysisResponse {
issues: CodeIssue[];
metrics: CodeMetrics;
suggestions: CodeSuggestion[];
overallScore: number;
}
// Analyze current file
const editor = TraeAPI.window.activeTextEditor;
if (editor) {
const analysisRequest: CodeAnalysisRequest = {
code: editor.document.getText(),
language: editor.document.languageId,
analysisType: [AnalysisType.Quality, AnalysisType.Security, AnalysisType.Performance]
};
const analysis = await aiProvider.analyzeCode(analysisRequest);
// Show issues in problems panel
const diagnostics: TraeAPI.Diagnostic[] = analysis.issues.map(issue => ({
range: new TraeAPI.Range(
new TraeAPI.Position(issue.line - 1, issue.column),
new TraeAPI.Position(issue.line - 1, issue.column + issue.length)
),
message: issue.message,
severity: mapSeverity(issue.severity),
source: 'AI Analysis',
code: issue.code
}));
TraeAPI.languages.createDiagnosticCollection('ai-analysis')
.set(editor.document.uri, diagnostics);
}Code Issue Types
typescript
interface CodeIssue {
type: AnalysisType;
severity: IssueSeverity;
message: string;
line: number;
column: number;
length: number;
code?: string;
suggestion?: string;
fixable: boolean;
}
enum IssueSeverity {
Error = 'error',
Warning = 'warning',
Info = 'info',
Hint = 'hint'
}
interface CodeMetrics {
complexity: number;
maintainabilityIndex: number;
linesOfCode: number;
duplicatedLines: number;
testCoverage?: number;
}
interface CodeSuggestion {
type: 'refactor' | 'optimize' | 'simplify' | 'modernize';
description: string;
before: string;
after: string;
impact: 'low' | 'medium' | 'high';
}Chat Integration
Basic Chat
typescript
interface ChatRequest {
message: string;
context?: ChatContext;
model?: string;
conversationId?: string;
}
interface ChatContext {
currentFile?: TraeAPI.Uri;
selectedCode?: string;
projectContext?: ProjectContext;
previousMessages?: ChatMessage[];
}
interface ChatResponse {
message: string;
actions?: ChatAction[];
conversationId: string;
model: string;
}
// Start a chat conversation
const chatRequest: ChatRequest = {
message: 'How can I optimize this React component?',
context: {
currentFile: editor.document.uri,
selectedCode: editor.document.getText(editor.selection),
projectContext: {
framework: 'react',
typescript: true,
dependencies: ['react', '@types/react']
}
}
};
const chatResponse = await aiProvider.chat(chatRequest);
console.log('AI Response:', chatResponse.message);
// Handle suggested actions
chatResponse.actions?.forEach(action => {
if (action.type === 'code-edit') {
// Show code edit suggestion
showCodeEditSuggestion(action);
} else if (action.type === 'file-create') {
// Show file creation suggestion
showFileCreationSuggestion(action);
}
});Chat Actions
typescript
interface ChatAction {
type: ChatActionType;
title: string;
description?: string;
data: any;
}
enum ChatActionType {
CodeEdit = 'code-edit',
FileCreate = 'file-create',
FileDelete = 'file-delete',
RunCommand = 'run-command',
InstallPackage = 'install-package',
OpenFile = 'open-file',
SearchCode = 'search-code'
}
// Handle chat actions
function handleChatAction(action: ChatAction): void {
switch (action.type) {
case ChatActionType.CodeEdit:
applyCodeEdit(action.data);
break;
case ChatActionType.FileCreate:
createFile(action.data.path, action.data.content);
break;
case ChatActionType.RunCommand:
TraeAPI.commands.executeCommand(action.data.command, ...action.data.args);
break;
case ChatActionType.InstallPackage:
installPackage(action.data.package);
break;
}
}Code Completion
Intelligent Completions
typescript
interface CompletionRequest {
document: TraeAPI.TextDocument;
position: TraeAPI.Position;
context: CompletionContext;
maxSuggestions?: number;
}
interface CompletionContext {
triggerKind: CompletionTriggerKind;
triggerCharacter?: string;
linePrefix: string;
lineSuffix: string;
}
enum CompletionTriggerKind {
Invoked = 1,
TriggerCharacter = 2,
TriggerForIncompleteCompletions = 3
}
interface CompletionResponse {
suggestions: CompletionSuggestion[];
isIncomplete: boolean;
}
interface CompletionSuggestion {
label: string;
kind: CompletionItemKind;
detail?: string;
documentation?: string;
insertText: string;
range?: TraeAPI.Range;
confidence: number;
sortText?: string;
}
// Register AI completion provider
TraeAPI.languages.registerCompletionItemProvider('typescript', {
async provideCompletionItems(
document: TraeAPI.TextDocument,
position: TraeAPI.Position,
token: TraeAPI.CancellationToken,
context: TraeAPI.CompletionContext
): Promise<TraeAPI.CompletionList> {
const line = document.lineAt(position);
const linePrefix = line.text.substring(0, position.character);
const lineSuffix = line.text.substring(position.character);
const completionRequest: CompletionRequest = {
document,
position,
context: {
triggerKind: context.triggerKind,
triggerCharacter: context.triggerCharacter,
linePrefix,
lineSuffix
},
maxSuggestions: 10
};
const response = await aiProvider.complete(completionRequest);
const items = response.suggestions.map(suggestion => {
const item = new TraeAPI.CompletionItem(suggestion.label, suggestion.kind);
item.detail = suggestion.detail;
item.documentation = suggestion.documentation;
item.insertText = suggestion.insertText;
item.range = suggestion.range;
item.sortText = suggestion.sortText || suggestion.confidence.toString();
return item;
});
return new TraeAPI.CompletionList(items, response.isIncomplete);
}
}, '.', '(', '[');Code Explanation
Explaining Code
typescript
interface ExplanationRequest {
code: string;
language: string;
explanationType: ExplanationType;
context?: CodeContext;
}
enum ExplanationType {
Overview = 'overview',
LineByLine = 'line-by-line',
Concepts = 'concepts',
Performance = 'performance',
Security = 'security'
}
interface ExplanationResponse {
explanation: string;
sections: ExplanationSection[];
relatedConcepts: string[];
suggestions: string[];
}
interface ExplanationSection {
title: string;
content: string;
codeRange?: TraeAPI.Range;
importance: 'low' | 'medium' | 'high';
}
// Explain selected code
const editor = TraeAPI.window.activeTextEditor;
if (editor && !editor.selection.isEmpty) {
const selectedCode = editor.document.getText(editor.selection);
const explanationRequest: ExplanationRequest = {
code: selectedCode,
language: editor.document.languageId,
explanationType: ExplanationType.Overview,
context: {
currentFile: editor.document.uri,
cursorPosition: editor.selection.active
}
};
const explanation = await aiProvider.explain(explanationRequest);
// Show explanation in a webview
showExplanationPanel(explanation);
}Advanced Features
Custom AI Models
typescript
// Register a custom AI model
class CustomAIModel implements AIModel {
readonly id = 'custom-model-v1';
readonly name = 'Custom Code Model';
readonly description = 'A specialized model for our codebase';
readonly capabilities = [AICapability.CodeGeneration, AICapability.CodeAnalysis];
readonly maxTokens = 4096;
readonly supportedLanguages = ['typescript', 'javascript', 'python'];
async generateCode(request: CodeGenerationRequest): Promise<CodeGenerationResponse> {
// Custom implementation
const response = await this.callCustomAPI(request);
return {
code: response.generatedCode,
explanation: response.explanation,
confidence: response.confidence,
model: this.id,
usage: response.tokenUsage
};
}
private async callCustomAPI(request: CodeGenerationRequest): Promise<any> {
// Implementation details
}
}
// Register the custom model
TraeAPI.ai.registerModel(new CustomAIModel());AI-Powered Refactoring
typescript
class AIRefactoring {
static async extractFunction(
editor: TraeAPI.TextEditor,
selection: TraeAPI.Selection
): Promise<void> {
const selectedCode = editor.document.getText(selection);
const request: CodeGenerationRequest = {
prompt: `Extract the following code into a well-named function:\n\n${selectedCode}`,
language: editor.document.languageId,
context: {
currentFile: editor.document.uri,
selectedText: selectedCode,
existingCode: editor.document.getText()
}
};
const response = await TraeAPI.ai.getProvider().generateCode(request);
// Apply the refactoring
await editor.edit(editBuilder => {
// Replace selected code with function call
editBuilder.replace(selection, response.code.functionCall);
// Insert function definition
const insertPosition = this.findBestInsertPosition(editor.document);
editBuilder.insert(insertPosition, response.code.functionDefinition);
});
}
static async renameVariable(
editor: TraeAPI.TextEditor,
position: TraeAPI.Position
): Promise<void> {
const wordRange = editor.document.getWordRangeAtPosition(position);
if (!wordRange) return;
const currentName = editor.document.getText(wordRange);
const context = this.getVariableContext(editor.document, position);
const request: CodeGenerationRequest = {
prompt: `Suggest a better name for the variable '${currentName}' based on its usage context`,
language: editor.document.languageId,
context: {
currentFile: editor.document.uri,
selectedText: currentName,
existingCode: context
}
};
const response = await TraeAPI.ai.getProvider().generateCode(request);
const suggestedName = response.code.trim();
// Show rename suggestion
const choice = await TraeAPI.window.showInformationMessage(
`Rename '${currentName}' to '${suggestedName}'?`,
'Yes', 'No'
);
if (choice === 'Yes') {
await TraeAPI.commands.executeCommand('editor.action.rename', [
editor.document.uri,
position,
suggestedName
]);
}
}
}AI Code Review
typescript
class AICodeReview {
static async reviewChanges(changes: TraeAPI.TextDocumentChangeEvent[]): Promise<void> {
for (const change of changes) {
const changedCode = this.extractChangedCode(change);
const analysisRequest: CodeAnalysisRequest = {
code: changedCode,
language: change.document.languageId,
analysisType: [
AnalysisType.Quality,
AnalysisType.Security,
AnalysisType.Performance,
AnalysisType.Bugs
]
};
const analysis = await TraeAPI.ai.getProvider().analyzeCode(analysisRequest);
// Show review comments
this.showReviewComments(change.document, analysis);
}
}
static async reviewPullRequest(files: string[]): Promise<ReviewResult> {
const reviews: FileReview[] = [];
for (const file of files) {
const document = await TraeAPI.workspace.openTextDocument(file);
const content = document.getText();
const request: CodeAnalysisRequest = {
code: content,
language: document.languageId,
analysisType: [AnalysisType.Quality, AnalysisType.Security]
};
const analysis = await TraeAPI.ai.getProvider().analyzeCode(request);
reviews.push({
file,
issues: analysis.issues,
suggestions: analysis.suggestions,
score: analysis.overallScore
});
}
return {
files: reviews,
overallScore: this.calculateOverallScore(reviews),
summary: this.generateSummary(reviews)
};
}
}
interface FileReview {
file: string;
issues: CodeIssue[];
suggestions: CodeSuggestion[];
score: number;
}
interface ReviewResult {
files: FileReview[];
overallScore: number;
summary: string;
}Configuration
AI Settings
typescript
interface AIConfiguration {
defaultModel: string;
maxTokens: number;
temperature: number;
enableCodeGeneration: boolean;
enableCodeAnalysis: boolean;
enableChat: boolean;
enableCompletion: boolean;
customModels: CustomModelConfig[];
apiKeys: Record<string, string>;
}
interface CustomModelConfig {
id: string;
name: string;
endpoint: string;
apiKey: string;
capabilities: AICapability[];
}
// Get AI configuration
const config = TraeAPI.workspace.getConfiguration('trae.ai');
const aiConfig: AIConfiguration = {
defaultModel: config.get('defaultModel', 'gpt-4'),
maxTokens: config.get('maxTokens', 2048),
temperature: config.get('temperature', 0.7),
enableCodeGeneration: config.get('enableCodeGeneration', true),
enableCodeAnalysis: config.get('enableCodeAnalysis', true),
enableChat: config.get('enableChat', true),
enableCompletion: config.get('enableCompletion', true),
customModels: config.get('customModels', []),
apiKeys: config.get('apiKeys', {})
};Error Handling
AI API Errors
typescript
enum AIErrorCode {
ModelNotAvailable = 'MODEL_NOT_AVAILABLE',
RateLimitExceeded = 'RATE_LIMIT_EXCEEDED',
InvalidRequest = 'INVALID_REQUEST',
NetworkError = 'NETWORK_ERROR',
AuthenticationError = 'AUTHENTICATION_ERROR',
TokenLimitExceeded = 'TOKEN_LIMIT_EXCEEDED'
}
class AIError extends Error {
constructor(
public code: AIErrorCode,
message: string,
public details?: any
) {
super(message);
this.name = 'AIError';
}
}
// Handle AI errors
try {
const response = await aiProvider.generateCode(request);
// Use response
} catch (error) {
if (error instanceof AIError) {
switch (error.code) {
case AIErrorCode.RateLimitExceeded:
TraeAPI.window.showWarningMessage(
'AI rate limit exceeded. Please try again later.'
);
break;
case AIErrorCode.ModelNotAvailable:
TraeAPI.window.showErrorMessage(
`AI model not available: ${error.message}`
);
break;
default:
TraeAPI.window.showErrorMessage(
`AI error: ${error.message}`
);
}
} else {
TraeAPI.window.showErrorMessage(
`Unexpected error: ${error.message}`
);
}
}Best Practices
Performance
- Cache AI responses when appropriate
- Use streaming for long responses
- Implement request debouncing for real-time features
- Monitor token usage and costs
User Experience
- Provide loading indicators for AI operations
- Allow users to cancel long-running requests
- Show confidence scores for AI suggestions
- Provide fallback options when AI is unavailable
Security
- Never send sensitive data to external AI services
- Validate AI responses before applying changes
- Implement proper authentication for AI services
- Respect user privacy preferences
Examples
AI-Powered Code Assistant
typescript
export class AICodeAssistant {
private aiProvider: AIProvider;
constructor() {
this.aiProvider = TraeAPI.ai.getProvider();
}
async suggestFix(diagnostic: TraeAPI.Diagnostic, document: TraeAPI.TextDocument): Promise<void> {
const problemCode = document.getText(diagnostic.range);
const context = this.getCodeContext(document, diagnostic.range);
const request: CodeGenerationRequest = {
prompt: `Fix this ${diagnostic.severity} issue: ${diagnostic.message}\n\nCode: ${problemCode}`,
language: document.languageId,
context
};
const response = await this.aiProvider.generateCode(request);
// Show quick fix
const action = new TraeAPI.CodeAction(
`AI Fix: ${diagnostic.message}`,
TraeAPI.CodeActionKind.QuickFix
);
action.edit = new TraeAPI.WorkspaceEdit();
action.edit.replace(document.uri, diagnostic.range, response.code);
return action;
}
async generateTests(functionRange: TraeAPI.Range, document: TraeAPI.TextDocument): Promise<string> {
const functionCode = document.getText(functionRange);
const request: CodeGenerationRequest = {
prompt: `Generate comprehensive unit tests for this function:\n\n${functionCode}`,
language: document.languageId,
context: {
currentFile: document.uri,
existingCode: document.getText()
}
};
const response = await this.aiProvider.generateCode(request);
return response.code;
}
}