diff --git a/browsers/profiles.mdx b/browsers/profiles.mdx new file mode 100644 index 0000000..30961a0 --- /dev/null +++ b/browsers/profiles.mdx @@ -0,0 +1,126 @@ +--- +title: "Profiles" +description: "Persist and reuse browser session state (cookies, local storage) across sessions" +--- + +Kernel Profiles let you capture browser state created during a session — cookies and local storage — and reuse it in later sessions. This is useful for persisting login state or other site preferences across runs. + +## 1. Create a profile + +The first step in using profiles is to create one, optionally giving it a meaningful `name` that is unique within your organization. + + + +```typescript Typescript/Javascript +import { ConflictError, Kernel } from "@onkernel/sdk"; + +const kernel = new Kernel(); + +try { + await kernel.profiles.create({ name: "profiles-demo" }); +} catch (err) { + if (err instanceof ConflictError) { + // Profile already exists; continue + } else { + throw err; + } +} +``` + +```python Python +from kernel import AsyncKernel, ConflictError + +kernel = AsyncKernel() + +try: + await kernel.profiles.create(name="profiles-demo") +except ConflictError: + pass +``` + + + +## 2. Start a browser session using the profile and save changes + +After creating the profile, you can reference it by its `name` or `id` when creating a browser. +Set `save_changes` to true to persist any state created during this session back into the profile when the browser is closed. + + + +```typescript Typescript/Javascript +const kernelBrowser = await kernel.browsers.create({ + profile: { + name: "profiles-demo", + // or + // id: profile.id, + save_changes: true, + }, +}); +``` + +```python Python +kernel_browser = await kernel.browsers.create( + profile={ + "name": "profiles-demo", + // or + // "id": profile.id, + "save_changes": True, + } +) +``` + + + +## 3. Use the browser, then close it to persist the state + +After using a browser with `save_changes: true`, closing the browser will save cookies and local storage into the profile. + + + +```typescript Typescript/Javascript +console.log("Live view:", kernelBrowser.browser_live_view_url); +// Navigate and create login state ... +await kernel.browsers.deleteByID(kernelBrowser.session_id); +``` + +```python Python +print("Live view:", kernel_browser.browser_live_view_url) +# Navigate and create login state ... +await kernel.browsers.delete_by_id(kernel_browser.session_id) +``` + + + +## 4. Start a new session with the saved profile (read-only) + +Create another browser using the same profile name. Omitting `save_changes` leaves the stored profile untouched. + + + +```typescript Typescript/Javascript +const kernelBrowser2 = await kernel.browsers.create({ + profile: { name: "profiles-demo" }, +}); +console.log("Live view:", kernelBrowser2.browser_live_view_url); +``` + +```python Python +kernel_browser2 = await kernel.browsers.create( + profile={"name": "profiles-demo"} +) +print("Live view:", kernel_browser2.browser_live_view_url) +``` + + + +### Other ways to use profiles + +The API and SDKs support listing, deleting, and downloading profile data as JSON. See the [API reference](/api-reference/profiles/list-profiles) for more details. + +### Notes + +- A profile's `name` must be unique within your organization. +- Profiles store cookies and local storage. Start the session with `save_changes: true` to write changes back when the browser is closed. +- To keep a profile immutable for a run, omit `save_changes` (default) when creating the browser. +- You can spin up multiple browsers in parallel using the same profile. +- Profile data is encrypted end to end using a per-organization key. diff --git a/docs.json b/docs.json index 1e5d4a6..4a1019b 100644 --- a/docs.json +++ b/docs.json @@ -62,7 +62,8 @@ "browsers/termination", "browsers/file-io", "browsers/live-view", - "browsers/replays" + "browsers/replays", + "browsers/profiles" ] }, { diff --git a/snippets/openapi/delete-profiles-id_or_name.mdx b/snippets/openapi/delete-profiles-id_or_name.mdx new file mode 100644 index 0000000..f114479 --- /dev/null +++ b/snippets/openapi/delete-profiles-id_or_name.mdx @@ -0,0 +1,23 @@ + +```typescript Typescript/Javascript +import Kernel from '@onkernel/sdk'; + +const client = new Kernel({ + apiKey: 'My API Key', +}); + +await client.profiles.delete('id_or_name'); +``` + + +```python Python +from kernel import Kernel + +client = Kernel( + api_key="My API Key", +) +client.profiles.delete( + "id_or_name", +) +``` + diff --git a/snippets/openapi/get-profiles-id_or_name-download.mdx b/snippets/openapi/get-profiles-id_or_name-download.mdx new file mode 100644 index 0000000..c6307bd --- /dev/null +++ b/snippets/openapi/get-profiles-id_or_name-download.mdx @@ -0,0 +1,31 @@ + +```typescript Typescript/Javascript +import Kernel from '@onkernel/sdk'; + +const client = new Kernel({ + apiKey: 'My API Key', +}); + +const response = await client.profiles.download('id_or_name'); + +console.log(response); + +const content = await response.blob(); +console.log(content); +``` + + +```python Python +from kernel import Kernel + +client = Kernel( + api_key="My API Key", +) +response = client.profiles.download( + "id_or_name", +) +print(response) +content = response.read() +print(content) +``` + diff --git a/snippets/openapi/get-profiles-id_or_name.mdx b/snippets/openapi/get-profiles-id_or_name.mdx new file mode 100644 index 0000000..4941e43 --- /dev/null +++ b/snippets/openapi/get-profiles-id_or_name.mdx @@ -0,0 +1,26 @@ + +```typescript Typescript/Javascript +import Kernel from '@onkernel/sdk'; + +const client = new Kernel({ + apiKey: 'My API Key', +}); + +const profile = await client.profiles.retrieve('id_or_name'); + +console.log(profile.id); +``` + + +```python Python +from kernel import Kernel + +client = Kernel( + api_key="My API Key", +) +profile = client.profiles.retrieve( + "id_or_name", +) +print(profile.id) +``` + diff --git a/snippets/openapi/get-profiles.mdx b/snippets/openapi/get-profiles.mdx new file mode 100644 index 0000000..4dfc0ae --- /dev/null +++ b/snippets/openapi/get-profiles.mdx @@ -0,0 +1,24 @@ + +```typescript Typescript/Javascript +import Kernel from '@onkernel/sdk'; + +const client = new Kernel({ + apiKey: 'My API Key', +}); + +const profiles = await client.profiles.list(); + +console.log(profiles); +``` + + +```python Python +from kernel import Kernel + +client = Kernel( + api_key="My API Key", +) +profiles = client.profiles.list() +print(profiles) +``` + diff --git a/snippets/openapi/post-profiles.mdx b/snippets/openapi/post-profiles.mdx new file mode 100644 index 0000000..5f13419 --- /dev/null +++ b/snippets/openapi/post-profiles.mdx @@ -0,0 +1,24 @@ + +```typescript Typescript/Javascript +import Kernel from '@onkernel/sdk'; + +const client = new Kernel({ + apiKey: 'My API Key', +}); + +const profile = await client.profiles.create(); + +console.log(profile.id); +``` + + +```python Python +from kernel import Kernel + +client = Kernel( + api_key="My API Key", +) +profile = client.profiles.create() +print(profile.id) +``` +