From e9913e1336e9100172ac7c49c59cee9a2e43651b Mon Sep 17 00:00:00 2001 From: Maxwell Calkin Date: Mon, 9 Mar 2026 00:02:43 -0400 Subject: [PATCH] fix: add missing X-Access-Token header to context management methods The async Python SDK and JS SDK both omit the X-Access-Token authentication header from createCodeContext, removeCodeContext, listCodeContexts, and restartCodeContext. The runCode method already includes it, but the context methods were missed. On sandboxes with access tokens configured, this causes context management operations to fail with authentication errors while code execution works fine. This PR was authored by an AI (Claude Opus 4.6, Anthropic). See https://maxcalkin.com/career for details. Co-Authored-By: Claude Opus 4.6 --- js/src/sandbox.ts | 12 ++++++++++++ .../e2b_code_interpreter/code_interpreter_async.py | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/js/src/sandbox.ts b/js/src/sandbox.ts index a02b9d9e..4018c64d 100644 --- a/js/src/sandbox.ts +++ b/js/src/sandbox.ts @@ -307,6 +307,9 @@ export class Sandbox extends BaseSandbox { if (this.trafficAccessToken) { headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken } + if (this.envdAccessToken) { + headers['X-Access-Token'] = this.envdAccessToken + } const res = await fetch(`${this.jupyterUrl}/contexts`, { method: 'POST', @@ -347,6 +350,9 @@ export class Sandbox extends BaseSandbox { if (this.trafficAccessToken) { headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken } + if (this.envdAccessToken) { + headers['X-Access-Token'] = this.envdAccessToken + } const res = await fetch(`${this.jupyterUrl}/contexts/${id}`, { method: 'DELETE', @@ -380,6 +386,9 @@ export class Sandbox extends BaseSandbox { if (this.trafficAccessToken) { headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken } + if (this.envdAccessToken) { + headers['X-Access-Token'] = this.envdAccessToken + } const res = await fetch(`${this.jupyterUrl}/contexts`, { method: 'GET', @@ -418,6 +427,9 @@ export class Sandbox extends BaseSandbox { if (this.trafficAccessToken) { headers['E2B-Traffic-Access-Token'] = this.trafficAccessToken } + if (this.envdAccessToken) { + headers['X-Access-Token'] = this.envdAccessToken + } const res = await fetch(`${this.jupyterUrl}/contexts/${id}/restart`, { method: 'POST', diff --git a/python/e2b_code_interpreter/code_interpreter_async.py b/python/e2b_code_interpreter/code_interpreter_async.py index de938240..ed14f032 100644 --- a/python/e2b_code_interpreter/code_interpreter_async.py +++ b/python/e2b_code_interpreter/code_interpreter_async.py @@ -260,6 +260,8 @@ async def create_code_context( headers = { "Content-Type": "application/json", } + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token if self.traffic_access_token: headers["E2B-Traffic-Access-Token"] = self.traffic_access_token @@ -296,6 +298,8 @@ async def remove_code_context( headers = { "Content-Type": "application/json", } + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token if self.traffic_access_token: headers["E2B-Traffic-Access-Token"] = self.traffic_access_token @@ -321,6 +325,8 @@ async def list_code_contexts(self) -> List[Context]: headers = { "Content-Type": "application/json", } + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token if self.traffic_access_token: headers["E2B-Traffic-Access-Token"] = self.traffic_access_token @@ -355,6 +361,8 @@ async def restart_code_context( headers = { "Content-Type": "application/json", } + if self._envd_access_token: + headers["X-Access-Token"] = self._envd_access_token if self.traffic_access_token: headers["E2B-Traffic-Access-Token"] = self.traffic_access_token