Skip to content

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;
  }
}

Your Ultimate AI-Powered IDE Learning Guide