Skip to main content
AI agents edit files using // ... existing code ... markers instead of sending full files. Morph merges server-side at 10,500 tokens/s. Why this matters: Traditional search-replace uses 40% more tokens and takes more turns. Fast Apply is instant.

Installation

npm install @morphllm/morphsdk

Quick Start

  • Anthropic
  • OpenAI
  • Vercel AI SDK
  • Direct
import Anthropic from '@anthropic-ai/sdk';
import { createEditFileTool } from '@morphllm/morphsdk/tools/fastapply/anthropic';

const anthropic = new Anthropic();
const tool = createEditFileTool();

const response = await anthropic.messages.create({
  model: "claude-sonnet-4-5-20250929",
  max_tokens: 12000,
  tools: [tool],
  messages: [{ 
    role: "user", 
    content: "Add error handling to src/auth.ts" 
  }]
});
The instructions parameter provides crucial context for ambiguous edits, helping the apply model make correct decisions and achieve near perfect accuracy. Have the parent model generate the instructions.

How It Works

Agent outputs lazy edit:
async function login(email: string, password: string) {
  // ... existing code ...
  
  if (!user) {
    throw new Error('Invalid credentials');
  }
  
  // ... existing code ...
}
Morph merges into your actual file:
@@ -12,6 +12,10 @@
   const user = await db.findUser(email);
+  
+  if (!user) {
+    throw new Error('Invalid credentials');
+  }
   
   return createSession(user);
Key: The // ... existing code ... markers tell Morph where to insert changes without sending the full file.

Direct Usage

Use without an agent:
const result = await morph.fastApply.execute({
  target_filepath: 'src/auth.ts',
  instructions: 'I will add null check',
  code_edit: '// ... existing code ...\nif (!user) throw new Error("Not found");\n// ... existing code ...'
});

console.log(result.success); // true
console.log(`+${result.changes.linesAdded} -${result.changes.linesRemoved}`);

Configuration

import { createEditFileTool } from '@morphllm/morphsdk/tools/fastapply/anthropic';

const tool = createEditFileTool({
  baseDir: './src',       // Default: process.cwd()
  morphApiKey: 'sk-...',  // Or MORPH_API_KEY env var
  autoWrite: true,        // Auto-write files (default: true)
  generateUdiff: true     // Return diff (default: true)
});

API

Input:
{
  target_filepath: string,  // Relative to baseDir
  instructions: string,     // What the model is changing
  code_edit: string        // Code with // ... existing code ...
}
Returns:
{
  success: boolean,
  changes: { linesAdded, linesRemoved, linesModified },
  udiff?: string,
  error?: string
}

Error Handling

if (!result.success) {
  console.error(result.error);
  // "File not found" | "Invalid filepath" | "API error"
}