Skip to content

Commit df0003d

Browse files
committed
fix(runner): correct API path construction to avoid double /api prefix
BACKEND_API_URL already includes /api, so paths should be /projects/... not /api/projects/... This was causing 404 errors: http://.../api/api/projects/... instead of http://.../api/projects/... - Updated all client methods to use /projects/... paths - Updated test assertions to match - Fixed API reference docs: endpoint headers show full paths (/api/...) but code examples use BASE_URL + /projects/... - All 20 unit tests passing
1 parent da6b43d commit df0003d

3 files changed

Lines changed: 21 additions & 21 deletions

File tree

components/runners/ambient-runner/ambient_runner/bridges/claude/backend_tools.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ async def acp_get_api_reference(args: dict) -> dict:
353353
**Example**:
354354
```javascript
355355
const response = await fetch(
356-
`${{BASE_URL}}/api/projects/${{PROJECT_NAME}}/agentic-sessions`,
356+
`${{BASE_URL}}/projects/${{PROJECT_NAME}}/agentic-sessions`,
357357
{{ headers }}
358358
);
359359
const data = await response.json();
@@ -386,7 +386,7 @@ async def acp_get_api_reference(args: dict) -> dict:
386386
```javascript
387387
const sessionName = 'my-session';
388388
const response = await fetch(
389-
`${{BASE_URL}}/api/projects/${{PROJECT_NAME}}/agentic-sessions/${{sessionName}}`,
389+
`${{BASE_URL}}/projects/${{PROJECT_NAME}}/agentic-sessions/${{sessionName}}`,
390390
{{ headers }}
391391
);
392392
const session = await response.json();
@@ -450,7 +450,7 @@ async def acp_get_api_reference(args: dict) -> dict:
450450
}};
451451
452452
const response = await fetch(
453-
`${{BASE_URL}}/api/projects/${{PROJECT_NAME}}/agentic-sessions`,
453+
`${{BASE_URL}}/projects/${{PROJECT_NAME}}/agentic-sessions`,
454454
{{
455455
method: 'POST',
456456
headers,
@@ -468,7 +468,7 @@ async def acp_get_api_reference(args: dict) -> dict:
468468
<script>
469469
async function createSession() {{
470470
const response = await fetch(
471-
'{backend_url}/api/projects/{project_name}/agentic-sessions',
471+
'{backend_url}/projects/{project_name}/agentic-sessions',
472472
{{
473473
method: 'POST',
474474
headers: {{
@@ -509,7 +509,7 @@ async def acp_get_api_reference(args: dict) -> dict:
509509
```javascript
510510
const sessionName = 'my-session';
511511
const response = await fetch(
512-
`${{BASE_URL}}/api/projects/${{PROJECT_NAME}}/agentic-sessions/${{sessionName}}/stop`,
512+
`${{BASE_URL}}/projects/${{PROJECT_NAME}}/agentic-sessions/${{sessionName}}/stop`,
513513
{{
514514
method: 'POST',
515515
headers
@@ -550,7 +550,7 @@ async def acp_get_api_reference(args: dict) -> dict:
550550
**Example**:
551551
```javascript
552552
const response = await fetch(
553-
`${{BASE_URL}}/api/projects/${{PROJECT_NAME}}/agentic-sessions/${{sessionName}}/agui/run`,
553+
`${{BASE_URL}}/projects/${{PROJECT_NAME}}/agentic-sessions/${{sessionName}}/agui/run`,
554554
{{
555555
method: 'POST',
556556
headers,
@@ -593,7 +593,7 @@ async def acp_get_api_reference(args: dict) -> dict:
593593
// Your backend proxy adds authentication
594594
app.post('/api/proxy/sessions', async (req, res) => {{
595595
const response = await fetch(
596-
`${{BACKEND_URL}}/api/projects/${{PROJECT_NAME}}/agentic-sessions`,
596+
`${{BACKEND_URL}}/projects/${{PROJECT_NAME}}/agentic-sessions`,
597597
{{
598598
method: 'POST',
599599
headers: {{
@@ -686,7 +686,7 @@ async def acp_get_api_reference(args: dict) -> dict:
686686
687687
async function loadSessions() {{
688688
const data = await API.request(
689-
`/api/projects/${{API.project}}/agentic-sessions`
689+
`/projects/${{API.project}}/agentic-sessions`
690690
);
691691
692692
document.getElementById('sessions').innerHTML =
@@ -702,7 +702,7 @@ async def acp_get_api_reference(args: dict) -> dict:
702702
async function createNewSession() {{
703703
const name = 'session-' + Date.now();
704704
await API.request(
705-
`/api/projects/${{API.project}}/agentic-sessions`,
705+
`/projects/${{API.project}}/agentic-sessions`,
706706
{{
707707
method: 'POST',
708708
body: JSON.stringify({{
@@ -717,7 +717,7 @@ async def acp_get_api_reference(args: dict) -> dict:
717717
718718
async function stopSession(name) {{
719719
await API.request(
720-
`/api/projects/${{API.project}}/agentic-sessions/${{name}}/stop`,
720+
`/projects/${{API.project}}/agentic-sessions/${{name}}/stop`,
721721
{{ method: 'POST' }}
722722
);
723723
loadSessions();
@@ -744,12 +744,12 @@ async def acp_get_api_reference(args: dict) -> dict:
744744
}}
745745
746746
def list_sessions():
747-
url = f'{{BASE_URL}}/api/projects/{{PROJECT}}/agentic-sessions'
747+
url = f'{{BASE_URL}}/projects/{{PROJECT}}/agentic-sessions'
748748
resp = requests.get(url, headers=headers)
749749
return resp.json()['sessions']
750750
751751
def create_session(name, prompt):
752-
url = f'{{BASE_URL}}/api/projects/{{PROJECT}}/agentic-sessions'
752+
url = f'{{BASE_URL}}/projects/{{PROJECT}}/agentic-sessions'
753753
data = {{
754754
'sessionName': name,
755755
'initialPrompt': prompt

components/runners/ambient-runner/ambient_runner/tools/backend_api.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def list_sessions(self, include_completed: bool = False) -> List[Dict[str, Any]]
9999
Returns:
100100
List of session objects
101101
"""
102-
path = f"/api/projects/{self.project_name}/agentic-sessions"
102+
path = f"/projects/{self.project_name}/agentic-sessions"
103103
response = self._make_request("GET", path)
104104

105105
sessions = response.get("sessions", [])
@@ -118,7 +118,7 @@ def get_session(self, session_name: str) -> Dict[str, Any]:
118118
Returns:
119119
Session object with full details
120120
"""
121-
path = f"/api/projects/{self.project_name}/agentic-sessions/{session_name}"
121+
path = f"/projects/{self.project_name}/agentic-sessions/{session_name}"
122122
return self._make_request("GET", path)
123123

124124
def create_session(
@@ -141,7 +141,7 @@ def create_session(
141141
Returns:
142142
Created session object
143143
"""
144-
path = f"/api/projects/{self.project_name}/agentic-sessions"
144+
path = f"/projects/{self.project_name}/agentic-sessions"
145145

146146
payload: Dict[str, Any] = {
147147
"sessionName": session_name,
@@ -167,7 +167,7 @@ def stop_session(self, session_name: str) -> Dict[str, Any]:
167167
Returns:
168168
Response from the backend
169169
"""
170-
path = f"/api/projects/{self.project_name}/agentic-sessions/{session_name}/stop"
170+
path = f"/projects/{self.project_name}/agentic-sessions/{session_name}/stop"
171171
return self._make_request("POST", path)
172172

173173
def send_message(
@@ -186,7 +186,7 @@ def send_message(
186186
Returns:
187187
Run metadata (runId, threadId)
188188
"""
189-
path = f"/api/projects/{self.project_name}/agentic-sessions/{session_name}/agui/run"
189+
path = f"/projects/{self.project_name}/agentic-sessions/{session_name}/agui/run"
190190

191191
payload: Dict[str, Any] = {"messages": [{"role": "user", "content": message}]}
192192
if thread_id:
@@ -212,7 +212,7 @@ def get_session_events(
212212
Returns:
213213
List of event objects
214214
"""
215-
path = f"/api/projects/{self.project_name}/agentic-sessions/{session_name}/agui/events"
215+
path = f"/projects/{self.project_name}/agentic-sessions/{session_name}/agui/events"
216216

217217
# Note: This endpoint is typically SSE-based for live streaming,
218218
# but can be called once for historical events

components/runners/ambient-runner/tests/test_backend_tools.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def test_create_session_minimal(self, mock_urlopen, monkeypatch):
156156
# Verify the request
157157
call_args = mock_urlopen.call_args
158158
request = call_args[0][0]
159-
assert "/api/projects/test-project/agentic-sessions" in request.full_url
159+
assert "/projects/test-project/agentic-sessions" in request.full_url
160160
assert request.method == "POST"
161161

162162
@patch("urllib.request.urlopen")
@@ -214,7 +214,7 @@ def test_stop_session(self, mock_urlopen, monkeypatch):
214214
call_args = mock_urlopen.call_args
215215
request = call_args[0][0]
216216
assert (
217-
"/api/projects/test-project/agentic-sessions/session-1/stop"
217+
"/projects/test-project/agentic-sessions/session-1/stop"
218218
in request.full_url
219219
)
220220
assert request.method == "POST"
@@ -242,7 +242,7 @@ def test_send_message(self, mock_urlopen, monkeypatch):
242242
call_args = mock_urlopen.call_args
243243
request = call_args[0][0]
244244
assert (
245-
"/api/projects/test-project/agentic-sessions/session-1/agui/run"
245+
"/projects/test-project/agentic-sessions/session-1/agui/run"
246246
in request.full_url
247247
)
248248
payload = json.loads(request.data.decode("utf-8"))

0 commit comments

Comments
 (0)