Profile Seeding
Profiles start empty. When a user authenticates for the first time, their profile contains a phone number and nothing else. Your agent will greet them generically — "Hello! How can I help you?" — because it has nothing to work with.
Seeding fills the profile with real data before the first conversation. The richer the seed, the more personal the first interaction. Connect Gmail and your agent knows the user's name, occupation, interests, and recent activity within 10 seconds. Import chat history and your agent inherits context from the user's other AI conversations.
Without seeding, profiles build organically from conversations over days or weeks. With seeding, your agent recognizes users from the very first message.
The difference
What your LLM sees in the system prompt — before and after seeding.
Before seeding — profile.format() returns:
User:
Phone: ...1234The LLM has nothing to personalize with. It says "Hello! How can I help you?"
After connecting Gmail (~10 seconds) — profile.format() returns:
User:
Name: Alex Rivera
Email: alex@example.com
Occupation: Product Lead
Location: Austin, TX
Interests: AI tools, team workflows
Connected: gmail
About this user:
Leads an AI product team. Recently coordinating onboarding research and
planning a Japan trip this summer.
CONFIGURE GUIDELINES — handling personal data responsibly
...The LLM sees a real person. It says "Hey Alex — I see you're working on AI product workflows in Austin. How can I help?"
Seeding patterns
1. Tool Connect
The richest source. User connects Gmail, Calendar, Drive, or Notion. Configure syncs and analyzes their data automatically.
Frontend (recommended):
html
<div id="tools"></div>
<script src="https://configure.dev/js/configure.js"></script>
<script>
Configure.connections({
el: "#tools",
publishableKey: "pk_...",
token: TOKEN,
userId: USER_ID,
agent: "my-agent",
tools: "gmail,calendar,drive,notion"
});
document.addEventListener("configure:tool-connect", (e) => {
console.log(`Connected: ${e.detail.tool}`);
});
</script>Server-side alternative:
typescript
const { url } = await client.tools.connect(token, 'gmail');
// Redirect user to `url` for OAuth
// After OAuth completes:
await client.tools.sync(token, 'gmail');What each tool produces:
| Tool | Data | Time |
|---|---|---|
| Gmail | Identity synthesis (name, occupation, interests), ranked emails, key contacts | ~10 seconds |
| Calendar | Upcoming events, schedule patterns | ~10 seconds |
| Drive | Searchable files, document context | ~15 seconds |
| Notion | Searchable pages, workspace content | ~15 seconds |
Gmail is the richest source by far. If the developer adds one seeding mechanism, it should be this.
2. Memory Import
User-driven. User exports their chat history from ChatGPT, Claude, or Gemini and pastes it into the hosted import surface. Configure extracts memories from the imported content.
html
<div id="import"></div>
<script src="https://configure.dev/js/configure.js"></script>
<script>
Configure.memoryImport({
el: "#import",
publishableKey: "pk_...",
token: TOKEN,
userId: USER_ID,
agent: "my-agent"
});
document.addEventListener("configure:import-complete", (e) => {
console.log(`Imported from: ${e.detail.provider}`);
});
</script>This makes profiles interoperable. What the user told ChatGPT about their preferences, your agent now knows. Time: ~30 seconds (user action + extraction).
3. Conversation Ingest
Programmatic. Send past conversations and Configure extracts memories.
typescript
// Fire-and-forget — returns immediately
await client.profile.ingest(token, userId, [
{ role: 'user', content: 'I prefer window seats and fly United' },
{ role: 'assistant', content: 'Noted! I\'ll keep that in mind for flight searches.' },
]);
// With memory criteria — focus extraction on specific topics
await client.profile.ingest(token, userId, messages, {
memoryCriteria: 'dietary preferences, travel style, budget range',
});
// Synchronous — blocks until extraction completes
await client.profile.ingest(token, userId, messages, { sync: true });Use this for migration (importing conversations from another system) or for seeding from the current session's messages.
4. Batch Seed
Developer has existing user data. Import profiles from a CRM, database, or another system — up to 50 users at once.
typescript
// Batch mode — multiple users
await client.profile.ingest([
{
userId: 'user-1',
messages: [{ role: 'user', content: 'I work in finance, based in NYC. Vegetarian.' }],
},
{
userId: 'user-2',
messages: [{ role: 'user', content: 'Software engineer in Austin. Loves hiking.' }],
},
]);
// Text mode — freeform text for a single user
await client.profile.ingest(token, userId, {
text: 'Senior designer at Stripe. Prefers dark mode. Frequent traveler, pescatarian.',
});The migration pattern. Bring existing user knowledge into Configure so profiles are rich from day one.
5. Manual Remember
Precise and instant. Save a single fact about the user.
typescript
await client.profile.remember(token, userId, 'Prefers dark mode');
await client.profile.remember(token, userId, 'Allergic to shellfish');
await client.profile.remember(token, userId, 'Working on a startup in AI infrastructure');Facts appear in the profile immediately. Use for precision. Not for bulk seeding.
Choosing a pattern
| Scenario | Best approach | Why |
|---|---|---|
| Frontend with auth UI | Tool Connect + Memory Import | Richest data, user-driven |
| Migrating from another system | Batch Seed | Bring existing knowledge |
| Backend-only, no frontend | Conversation Ingest or Manual | No UI needed |
| MVP, ship fast | Organic (just use ingest() after each turn) | Already in the quick-start, zero extra code |
| Enterprise with CRM data | Batch Seed + Tool Connect | Migrate first, then enrich |
Try it
- Start your app and authenticate with your phone number
- Connect Gmail (or import chat history)
- Wait 10-30 seconds for the data to process
- Send a message: "What do you know about me?"
Your agent should respond with specific details — your name, what you do, what you've been working on — drawn entirely from your connected data. Not "Hello! How can I help you today?" Something that proves it knows who you are.
That's what your users will experience. The first impression is no longer generic.
Troubleshooting
If the greeting is still generic after seeding, call profile.get() directly and check the response. If identity fields are empty, the sync may not have completed — wait a few more seconds and try again. If profile.format() returns data but the agent ignores it, verify the formatted string is actually in the system prompt.
Next steps
- Connected Tools — Detailed guide on tool connections, OAuth flow, and search operations
- Profiles & Memory — Deep dive on memory extraction, batch ingestion, and profile structure
- Atlas Reference Agent — Complete working agent demonstrating all seeding patterns