mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-10-11 03:37:56 +00:00
Rewrites 339 TypeScript calls across 50 pages from the rc.5 `method({ namespace, body })` form to the shipped `method(namespace, { ... })` form, and aligns field names with the live v5 spec: `attach` to `include`, `authUrl` to `authorization`, `lastSync` to `latestRun`, `deletedCount` to `count`, and the paginated `namespaces.list()`.
Renames container tags to namespaces across concepts, connectors, integrations and snippets. The namespace pages keep container tag in the description, search keywords and a rename note so old searches still land, and the v3 reference page points at v5.
The migration guide's SDK table now covers both 5.0.0 SDKs, and the SDK integration page uses the real client options (`baseUrl`, `timeoutInSeconds`, `maxRetries`) and error classes.
266 lines
7.6 KiB
Text
266 lines
7.6 KiB
Text
---
|
|
title: 'Managing Connector Selection'
|
|
sidebarTitle: 'Managing Resources'
|
|
description: 'Choose what a connector syncs with the hosted picker or a direct selection update'
|
|
icon: 'folder-sync'
|
|
---
|
|
|
|
<Note>
|
|
**Selectable connectors:** GitHub (repositories), Gmail (labels) and Google Drive (files and folders) let you choose what to sync. Other connectors sync everything and return `selection: null`.
|
|
</Note>
|
|
|
|
Some connectors let you select which resources to sync. v5 exposes this through two calls on the connector itself: read it with `include: "picker"` to get a hosted picker URL, or send the ids directly with `connectors.update`.
|
|
|
|
## Open the Hosted Picker
|
|
|
|
`GET /ns/{namespace}/connectors/{id}?include=picker`
|
|
|
|
Returns a one-time picker URL. Send the user there; Supermemory lists their resources, saves the selection and starts a sync. Pass `returnUrl` to choose where the picker sends the user when they finish.
|
|
|
|
<CodeGroup>
|
|
```typescript Typescript
|
|
import { Supermemory } from "supermemory"
|
|
|
|
const supermemory = new Supermemory({ apiKey: process.env.SUPERMEMORY_API_KEY })
|
|
|
|
const connector = await supermemory.connectors.get("user-123", connectorId, {
|
|
include: "picker",
|
|
returnUrl: "https://yourapp.com/settings/integrations"
|
|
})
|
|
|
|
console.log("Picker URL:", connector.picker?.url)
|
|
console.log("Expires at:", connector.picker?.expiresAt)
|
|
console.log("Selectable:", connector.capabilities.selectable)
|
|
```
|
|
|
|
```python Python
|
|
from supermemory import Supermemory
|
|
import os
|
|
|
|
client = Supermemory(api_key=os.environ.get("SUPERMEMORY_API_KEY"))
|
|
|
|
connector = client.connectors.get(
|
|
"user-123",
|
|
connector_id,
|
|
include=["picker"],
|
|
return_url="https://yourapp.com/settings/integrations",
|
|
)
|
|
|
|
print(f"Picker URL: {connector.picker.url if connector.picker else None}")
|
|
print(f"Expires at: {connector.picker.expires_at if connector.picker else None}")
|
|
print(f"Selectable: {connector.capabilities.selectable}")
|
|
```
|
|
|
|
```bash cURL
|
|
curl "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}?include=picker&returnUrl=https%3A%2F%2Fyourapp.com%2Fsettings%2Fintegrations" \
|
|
-H "Authorization: Bearer $SUPERMEMORY_API_KEY"
|
|
```
|
|
</CodeGroup>
|
|
|
|
### Query parameters
|
|
|
|
- `include`: `picker` for the hosted picker URL, `syncs` for recent sync runs, or `syncs,picker` for both
|
|
- `returnUrl`: Optional. Where the hosted picker sends the user when they finish
|
|
|
|
### Response
|
|
|
|
```json
|
|
{
|
|
"id": "PTzGiUYei7pgzg5buzZHgA",
|
|
"provider": "github",
|
|
"namespace": "user-123",
|
|
"capabilities": { "selectable": true, "webhooks": true },
|
|
"selection": {
|
|
"repos": [
|
|
{ "id": "123456789", "name": "your-org/documentation" }
|
|
]
|
|
},
|
|
"picker": {
|
|
"url": "https://...",
|
|
"expiresAt": "2024-01-15T11:30:00.000Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
<Note>
|
|
The picker link works once, in any browser. `picker` is `null` for connectors that sync everything.
|
|
</Note>
|
|
|
|
## Set the Selection Directly
|
|
|
|
`PATCH /ns/{namespace}/connectors/{id}`
|
|
|
|
Send the ids to sync, grouped by kind. The new selection replaces the current one and starts a sync. Webhooks are registered for the selected resources.
|
|
|
|
<CodeGroup>
|
|
```typescript Typescript
|
|
import { Supermemory } from "supermemory"
|
|
|
|
const supermemory = new Supermemory({ apiKey: process.env.SUPERMEMORY_API_KEY })
|
|
|
|
const connector = await supermemory.connectors.update("user-123", connectorId, {
|
|
selection: {
|
|
repos: ["123456789", "987654321"],
|
|
},
|
|
})
|
|
|
|
console.log("Selection:", connector.selection)
|
|
console.log("Last sync:", connector.latestRun?.system.status)
|
|
```
|
|
|
|
```python Python
|
|
from supermemory import Supermemory
|
|
import os
|
|
|
|
client = Supermemory(api_key=os.environ.get("SUPERMEMORY_API_KEY"))
|
|
|
|
connector = client.connectors.update(
|
|
"user-123",
|
|
connector_id,
|
|
selection={"repos": ["123456789", "987654321"]},
|
|
)
|
|
|
|
print(f"Selection: {connector.selection}")
|
|
print(f"Last sync: {connector.latest_run.system.status}")
|
|
```
|
|
|
|
```bash cURL
|
|
curl -X PATCH "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}" \
|
|
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"selection": {
|
|
"repos": ["123456789", "987654321"]
|
|
}
|
|
}'
|
|
```
|
|
</CodeGroup>
|
|
|
|
### Request body
|
|
|
|
```json
|
|
{
|
|
"selection": {
|
|
"repos": ["123456789"]
|
|
}
|
|
}
|
|
```
|
|
|
|
The selection key depends on the provider:
|
|
- GitHub: `repos` (repository ids)
|
|
- Gmail: `labels` (label ids, for example `INBOX`)
|
|
- Google Drive: `files` and `folders` (Drive ids)
|
|
|
|
You can send `documentLimit` in the same body. Each call must include `selection`, `documentLimit`, or both.
|
|
|
|
### Response
|
|
|
|
The updated connector object, including the saved `selection` as `{ id, name }` pairs.
|
|
|
|
```json
|
|
{
|
|
"id": "PTzGiUYei7pgzg5buzZHgA",
|
|
"provider": "github",
|
|
"selection": {
|
|
"repos": [
|
|
{ "id": "123456789", "name": "your-org/documentation" },
|
|
{ "id": "987654321", "name": "your-org/api-docs" }
|
|
]
|
|
},
|
|
"latestRun": { "errorCode": null, "error": null, "system": { "status": "running", "startedAt": "...", "completedAt": null } }
|
|
}
|
|
```
|
|
|
|
### Error Responses
|
|
|
|
- `400`: Connector does not support selection
|
|
- `401`: Unauthorized
|
|
- `404`: Connector not found
|
|
|
|
<Note>
|
|
**Automatic Sync:** After a selection is saved, a sync starts for the connector. You don't need to call `connectors.sync` afterwards.
|
|
</Note>
|
|
|
|
## Example: GitHub repository selection
|
|
|
|
Here's a complete example for GitHub:
|
|
|
|
<CodeGroup>
|
|
```typescript Typescript
|
|
// 1. Create the connector
|
|
const created = await supermemory.connectors.create("user-123", {
|
|
provider: "github",
|
|
redirectUrl: "https://yourapp.com/callback"
|
|
})
|
|
|
|
// 2. Send the user to GitHub; the connector becomes visible once they authorize
|
|
if (created.authorization) window.location.href = created.authorization.url
|
|
|
|
// 3. After the callback, open the hosted picker so the user chooses repositories
|
|
const connector = await supermemory.connectors.get("user-123", created.id, {
|
|
include: "picker",
|
|
returnUrl: "https://yourapp.com/settings/integrations"
|
|
})
|
|
if (connector.picker) window.location.href = connector.picker.url
|
|
|
|
// 4. Or, if you already know the repository ids, set them directly
|
|
await supermemory.connectors.update("user-123", created.id, {
|
|
selection: { repos: selectedRepositoryIds },
|
|
})
|
|
```
|
|
|
|
```python Python
|
|
# 1. Create the connector
|
|
created = client.connectors.create(
|
|
"user-123",
|
|
request={
|
|
"provider": "github",
|
|
"redirectUrl": "https://yourapp.com/callback",
|
|
},
|
|
)
|
|
|
|
# 2. Send the user to GitHub; the connector becomes visible once they authorize
|
|
print(f"Redirect to: {created.authorization.url}")
|
|
|
|
# 3. After the callback, open the hosted picker so the user chooses repositories
|
|
connector = client.connectors.get(
|
|
"user-123",
|
|
created.id,
|
|
include=["picker"],
|
|
return_url="https://yourapp.com/settings/integrations",
|
|
)
|
|
if connector.picker:
|
|
print(f"Redirect to: {connector.picker.url}")
|
|
|
|
# 4. Or, if you already know the repository ids, set them directly
|
|
client.connectors.update(
|
|
"user-123",
|
|
created.id,
|
|
selection={"repos": selected_repository_ids},
|
|
)
|
|
```
|
|
|
|
```bash cURL
|
|
# 1. Create the connector
|
|
curl -X POST "https://api.supermemory.ai/ns/user-123/connectors" \
|
|
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"provider": "github", "redirectUrl": "https://yourapp.com/callback"}'
|
|
|
|
# 2. ... (user authorizes at authorization.url) ...
|
|
|
|
# 3. Get a one-time hosted picker URL
|
|
curl "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}?include=picker" \
|
|
-H "Authorization: Bearer $SUPERMEMORY_API_KEY"
|
|
|
|
# 4. Or set the repositories directly
|
|
curl -X PATCH "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}" \
|
|
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"selection": {
|
|
"repos": ["123456789"]
|
|
}
|
|
}'
|
|
```
|
|
</CodeGroup>
|