Plugins
13 plugin interfaces. 25+ provider implementations. All swappable via adapter pattern.
Available Plugins
| Plugin Interface | Auto-Registered Tools | Default Providers |
|---|---|---|
FileStoragePlugin | list_files, upload_file, read_file, delete_file | Aimform Files, Cloudflare R2, In-Memory |
FileConversionPlugin | convert_file | Cloudflare Workers AI |
TranslationPlugin | translate_file | Gemini, DeepSeek |
VisionPlugin | analyze_image | Gemini, OpenAI |
OCRPlugin | extract_text_from_image | Cloudflare Workers AI |
FileTransformPlugin | resize_image | Cloudflare Images |
WebSearchPlugin | web_search, fetch_web_page | Tavily, Brave |
BrowserPlugin | browse_page | Cloudflare Browser Rendering |
ImageGenPlugin | generate_image | Cloudflare Flux, DALL-E |
CodeGenPlugin | generate_code | DeepSeek Coder, GPT-4o |
CodeCompletionPlugin | complete_code | DeepSeek, OpenAI |
IPRotationPlugin | — (internal) | Residential Proxy, Direct |
EmbeddingPlugin | — (internal) | Interface ready |
Configuration
const ai = new AI({
plugins: {
files: new AimformFilesPlugin({ uploadFile, listFiles, getFile, deleteFile }),
fileConversion: new CloudflareFileConverter(env.AI),
translation: new GeminiTranslationPlugin(env.GEMINI_API_KEY),
vision: new GeminiVisionPlugin(env.GEMINI_API_KEY),
ocr: new CloudflareOCRPlugin(env.AI),
transform: new CloudflareImagesPlugin(accountId, token),
webSearch: new TavilySearchPlugin(env.TAVILY_API_KEY),
browser: new CloudflareBrowserPlugin(env.BROWSER),
imageGen: new CloudflareAIPlugin(env.AI),
codeGen: new DeepSeekCodePlugin(env.DEEPSEEK_API_KEY),
codeCompletion: new DeepSeekCompletionPlugin(env.DEEPSEEK_API_KEY),
ipRotation: new ResidentialProxyPlugin("https://proxy.example.com"),
},
});
File Processing Pipeline
Files go through a multi-step pipeline:
Upload (Word/PDF/DOCX) → Convert to Markdown → Optional Translation → Store
// Upload a file — the AI can call upload_file
await ai.plugins.files.upload({
name: "report.pdf",
mimeType: "application/pdf",
data: fileBuffer,
});
// Convert to Markdown — the AI can call convert_file
const result = await ai.plugins.fileConversion.toMarkdown({
data: fileBuffer,
mimeType: "application/pdf",
});
console.log(result.markdown); // Clean markdown
// Translate to another language — the AI can call translate_file
const translated = await ai.plugins.translation.translateMarkdown(
result.markdown, "en", "ja"
);
Building a Custom Plugin
Implement any interface and plug it in:
import type { WebSearchPlugin, WebSearchResult } from "@aimform/ai";
class DuckDuckGoPlugin implements WebSearchPlugin {
readonly provider = "duckduckgo";
async search(query: string): Promise<WebSearchResult[]> {
const res = await fetch(`https://api.duckduckgo.com/?q=${encodeURIComponent(query)}&format=json`);
const data = await res.json();
return data.Results.map((r: any) => ({
title: r.Text, url: r.FirstURL, snippet: r.Text,
}));
}
async fetchPage(url: string) {
const res = await fetch(url);
return { content: await res.text(), mimeType: "text/html" };
}
}
// Use it
const ai = new AI({
plugins: { webSearch: new DuckDuckGoPlugin() },
});