Profile Seeding And Import
There are three ways a profile starts with useful context.
Configure Link
The easiest user-present path is Configure Link. The user can verify identity, review what the agent can access, connect apps, and seed the profile before your backend performs the first approved read.
html
<script src="https://configure.dev/js/configure.js"></script>
<button
data-configure-link
data-publishable-key="pk_..."
data-agent="your-agent">
Personalize
</button>After Link emits configure:linked, send the token to your backend and create a runtime handle:
ts
const profile = configure.profile({ token });
const read = await profile.read();This is the preferred path for existing agents because the user controls federation, consent, and app connection setup.
Server-Side Users
For app-local users who have not linked Configure yet, pass a stable externalId to the SDK or send X-User-Id over HTTP. This creates a developer-scoped profile.
ts
const configure = new Configure({
apiKey: process.env.CONFIGURE_API_KEY,
agent: process.env.CONFIGURE_AGENT,
});
const profile = configure.profile({ externalId: "customer-123" });
await profile.remember("User prefers concise support replies.");Developer-scoped profiles are not federated across developers until the user links a Configure identity.
Bulk Import / Backfill
Use configure.importProfiles() when you already have historical dialogue or existing profile artifacts and want Configure to create or enrich many developer-scoped profiles.
ts
const job = await configure.importProfiles({
mode: "backfill",
idempotencyKey: "migration-2026-05-11",
users: [
{
externalId: "customer-123",
profile: {
summary: "Longtime traveler based in SF.",
preferences: ["Prefers window seats."],
},
conversations: [
{
id: "thread-1",
messages: [
{ role: "user", content: "I usually fly out of SFO." },
{ role: "assistant", content: "Got it." },
],
},
],
},
],
});
const status = await configure.importJobs.get(job.id);Import is a server-side operation and requires a secret key (sk_). Do not call it from browser code. It is not a model-facing tool and it is not part of the runtime profile.tools() set.
Import is also separate from runtime write-back:
| Primitive | Use it for |
|---|---|
profile.remember() | One explicit fact or preference. |
profile.commit() | Live turn write-back after profile reads. |
configure.importProfiles() | Historical/onboarding backfill from raw dialogue or profile artifacts. |
Raw dialogue is source material for extraction. It is not returned as default portable profile memory. Import writes typed memories under the acting agent namespace:
txt
/agents/{resolved-agent}/memories/{YYYY-MM-DD}/{mem_id}.json
/agents/{resolved-agent}/imports/{import_job_id}/...Configure resolves {resolved-agent} from the API key and agent configuration. Request bodies cannot set storage paths, source, written_by, timestamps, or memory IDs. Imported memories include safe provenance such as import_job_id and input_conversation_id.
Import does not write root profile files:
txt
/identity.json
/preferences.md
/user.md
/context.mdProfile-like hints stay in the acting agent namespace as typed memories or import records. Root profile promotion is a separate, stricter workflow.
Connectors
Users can connect Gmail, Calendar, Drive, or Notion through Configure hosted surfaces. Connector data can seed profile context and power explicitly enabled connector model tools.
ts
const tools = profile.tools({ connectors: ["gmail", "calendar"] });