How to Use Builder.io with Agent-Native: Complete Integration Guide
Agent-Native automatically enables Builder.io file uploads when you set the BUILDER_API_KEY and BUILDER_PRIVATE_KEY environment variables, exposing storage capabilities through the @agent-native/core/file-upload module.
Integrating Builder.io with Agent-Native provides a managed CDN for images and assets without manual configuration. The BuilderIO/agent-native repository ships with a built-in provider that handles authentication, signed URLs, and upload retries automatically. This guide covers the architecture, setup steps, and code implementations needed to leverage Builder.io storage in your Agent-Native applications.
Architecture Overview
Agent-Native treats Builder.io as the default file-upload provider when credentials are present. The system uses a registry pattern to manage providers, with Builder.io serving as the automatic fallback.
Automatic Provider Registration
When the environment variables BUILDER_API_KEY and BUILDER_PRIVATE_KEY are detected, the core module automatically registers the Builder.io provider. According to the source code in packages/core/src/file-upload/registry.ts, the registry maintains a priority list where the first registered provider handles all upload operations.
If you need to override this with custom storage (S3, R2, GCS), call registerFileUploadProvider() before the app initializes:
import { registerFileUploadProvider } from "@agent-native/core/file-upload";
import { s3FileUploadProvider } from "./my-s3-provider";
registerFileUploadProvider(s3FileUploadProvider);
Place this registration in a server-side plugin such as templates/content/server/plugins/onboarding.ts to ensure it loads before any upload actions execute.
Connection Flow and OAuth
The connection UI lives in Settings → File uploads and renders a "Connect Builder.io" card. This card is generated by the connect-builder tool defined in packages/core/src/server/agent-chat-plugin.ts.
When a user clicks the card, Builder.io's OAuth flow initiates and stores credentials in the app's secret store. The useBuilderStatus hook in packages/core/src/client/settings/useBuilderStatus.ts exposes the connection state (connected, not-connected, or error) and provides a connect() method to trigger this flow programmatically.
Upload Actions and the Registry
The upload-image action in packages/core/src/file-upload/actions/upload-image.ts serves as the public API for file storage. This action posts files to the currently configured provider and returns a CDN URL. If no provider is available, the action throws an error at line 136 with the message: "Connect or reconnect Builder.io in Settings → File uploads…".
The concrete implementation in packages/core/src/file-upload/builder.ts handles the signed-URL flow and retry logic specific to Builder.io's infrastructure.
Setting Up Builder.io Authentication
Before uploading files, configure your environment variables:
BUILDER_API_KEY=your_public_api_key
BUILDER_PRIVATE_KEY=your_private_key
With these variables set, Agent-Native automatically instantiates the Builder.io provider at runtime. No additional configuration is required to start uploading files through the default registry.
Uploading Files with the Builder.io Provider
Basic Image Upload Example
Import the uploadImage action from the core package to handle file uploads:
import { uploadImage } from "@agent-native/core/file-upload/actions";
import { useState } from "react";
export default function ImageUploader() {
const [url, setUrl] = useState("");
const handleFile = async (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (!file) return;
try {
const result = await uploadImage({ file });
setUrl(result.url); // Returns Builder.io CDN URL
} catch (err) {
console.error("Upload failed:", err);
}
};
return (
<>
<input type="file" accept="image/*" onChange={handleFile} />
{url && <img src={url} alt="Uploaded" />}
</>
);
}
The uploadImage function internally queries the registry established in packages/core/src/file-upload/registry.ts and routes the request to the Builder.io implementation.
Handling Connection Errors
When Builder.io is not configured, the pre-upload-attachments.ts helper displays a "Connect Builder.io" suggestion at line 292. Your UI should catch upload errors and guide users to the Settings page:
try {
const result = await uploadImage({ file });
} catch (err) {
if (err.message.includes("Connect or reconnect Builder.io")) {
// Redirect to Settings → File uploads
openSettingsPage();
}
}
Implementing Custom File Upload Providers
While Builder.io works automatically, you can register alternative storage solutions. The registry in packages/core/src/file-upload/registry.ts accepts custom providers that implement the file-upload interface:
import { registerFileUploadProvider } from "@agent-native/core/file-upload";
const customProvider = {
upload: async (file: File) => {
// Your custom upload logic
return { url: "https://your-cdn.com/file.jpg" };
}
};
registerFileUploadProvider(customProvider);
Once registered, all calls to uploadImage automatically use your custom provider instead of Builder.io.
Monitoring Connection Status in the UI
Surface the Builder.io connection state to users with the useBuilderStatus hook:
import { useBuilderStatus } from "@agent-native/core/client/settings/useBuilderStatus";
export function BuilderStatusPanel() {
const { status, connect } = useBuilderStatus();
return (
<div>
{status === "connected" ? (
<p>Builder.io is connected.</p>
) : (
<button onClick={connect}>Connect Builder.io</button>
)}
</div>
);
}
The connect function triggers the connect-builder tool from packages/core/src/server/agent-chat-plugin.ts, opening the OAuth card without manual navigation.
Summary
- Agent-Native automatically configures Builder.io as the file-upload provider when
BUILDER_API_KEYandBUILDER_PRIVATE_KEYenvironment variables are present. - The file-upload registry in
packages/core/src/file-upload/registry.tsmanages provider selection and can be overridden with custom storage viaregisterFileUploadProvider(). - Use the
uploadImageaction frompackages/core/src/file-upload/actions/upload-image.tsto upload files and receive CDN URLs. - Implement the
useBuilderStatushook to display connection states and trigger the OAuth flow programmatically. - The Builder.io provider implementation in
packages/core/src/file-upload/builder.tshandles signed URLs, retries, and CDN distribution automatically.
Frequently Asked Questions
How do I switch from Builder.io to AWS S3 for file uploads?
Register your S3 provider using registerFileUploadProvider() before the app initializes. Place this call in a server-side plugin such as templates/content/server/plugins/onboarding.ts. Once registered, the upload action in packages/core/src/file-upload/actions/upload-image.ts automatically routes files to your S3 implementation instead of Builder.io.
What happens if Builder.io credentials are missing or invalid?
If the BUILDER_API_KEY or BUILDER_PRIVATE_KEY variables are missing, the Builder.io provider remains unregistered. When attempting to upload, the uploadImage action throws an error at line 136 guiding users to "Connect or reconnect Builder.io in Settings → File uploads." The pre-upload-attachments.ts helper also surfaces a connection suggestion in the UI.
Can I use Builder.io alongside other storage providers?
Agent-Native supports only one active provider at a time per the registry pattern in packages/core/src/file-upload/registry.ts. While you cannot use Builder.io and S3 simultaneously for the same upload action, you can register different providers for different environments (Builder.io for production, custom S3 for staging) by conditionalizing the registerFileUploadProvider() call based on environment variables.
How do I check if Builder.io is properly connected from my React component?
Import useBuilderStatus from @agent-native/core/client/settings/useBuilderStatus. This hook returns a status string (connected, not-connected, or error) and a connect function that launches the Builder.io OAuth card. The hook reads from the same secret store used by the connect-builder tool in packages/core/src/server/agent-chat-plugin.ts.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →