π fix: fixed the sandbox tools call when error should use right callback#11721
π fix: fixed the sandbox tools call when error should use right callback#11721ONLY-yours merged 1 commit intonextfrom
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Reviewer's GuideAdjusts CloudSandboxExecutionRuntime to stop throwing on sandbox tool errors and instead return structured success=true responses with error content and sensible fallback state for each tool, while extending callTool to surface error details. Sequence diagram for updated sandbox tool error handlingsequenceDiagram
participant Caller
participant CloudSandboxExecutionRuntime
participant SandboxService
Caller->>CloudSandboxExecutionRuntime: readLocalFile(args)
activate CloudSandboxExecutionRuntime
CloudSandboxExecutionRuntime->>SandboxService: callTool(readLocalFile, args)
activate SandboxService
SandboxService-->>CloudSandboxExecutionRuntime: ToolResult { success=false, error, result }
deactivate SandboxService
alt tool_error
CloudSandboxExecutionRuntime-->>Caller: { content=error.message, state=fallback_state, success=true }
else tool_success
CloudSandboxExecutionRuntime-->>Caller: { content=result.content, state=derived_state, success=true }
end
deactivate CloudSandboxExecutionRuntime
Updated class diagram for CloudSandboxExecutionRuntime tool callsclassDiagram
class CloudSandboxExecutionRuntime {
- sandboxService SandboxService
+ listLocalFiles(args ListLocalFilesArgs) SandboxResponse
+ readLocalFile(args ReadLocalFileArgs) SandboxResponse
+ writeLocalFile(args WriteLocalFileArgs) SandboxResponse
+ editLocalFile(args EditLocalFileArgs) SandboxResponse
+ searchLocalFiles(args SearchLocalFilesArgs) SandboxResponse
+ moveLocalFiles(args MoveLocalFilesArgs) SandboxResponse
+ renameLocalFile(args RenameLocalFileArgs) SandboxResponse
+ executeCode(args ExecuteCodeArgs) SandboxResponse
+ runCommand(args RunCommandArgs) SandboxResponse
+ getCommandOutput(args GetCommandOutputArgs) SandboxResponse
+ killCommand(args KillCommandArgs) SandboxResponse
+ grepContent(args GrepContentArgs) SandboxResponse
+ globLocalFiles(args GlobLocalFilesArgs) SandboxResponse
- callTool(toolName string, params Record) ToolResult
}
class SandboxService {
<<interface>>
+ callTool(toolName string, params Record) ToolResult
}
class ToolResult {
+ success boolean
+ result any
+ error ErrorInfo
+ sessionExpiredAndRecreated boolean
}
class ErrorInfo {
+ message string
+ name string
}
class SandboxResponse {
+ content string
+ state any
+ success boolean
}
CloudSandboxExecutionRuntime --> SandboxService : uses
CloudSandboxExecutionRuntime ..> ToolResult : receives
CloudSandboxExecutionRuntime ..> SandboxResponse : returns
ToolResult *-- ErrorInfo
class ListLocalFilesArgs {
+ path string
}
class ReadLocalFileArgs {
+ path string
+ startLine number
+ endLine number
}
class WriteLocalFileArgs {
+ path string
+ content string
}
class EditLocalFileArgs {
+ path string
+ search string
+ replace string
}
class SearchLocalFilesArgs {
+ query string
}
class MoveLocalFilesArgs {
+ operations MoveOperation[]
}
class RenameLocalFileArgs {
+ oldPath string
+ newPath string
}
class ExecuteCodeArgs {
+ language string
+ code string
}
class RunCommandArgs {
+ command string
+ background boolean
}
class GetCommandOutputArgs {
+ commandId string
}
class KillCommandArgs {
+ commandId string
}
class GrepContentArgs {
+ pattern string
+ content string
}
class GlobLocalFilesArgs {
+ pattern string
}
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
TestGru AssignmentSummary
Tip You can |
There was a problem hiding this comment.
Hey - I've found 2 issues
Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments
### Comment 1
<location> `packages/builtin-tool-cloud-sandbox/src/ExecutionRuntime/index.ts:362-365` </location>
<code_context>
+ success: true,
};
} catch (error) {
+ console.log('executeCode error', error);
return this.handleError(error);
}
</code_context>
<issue_to_address>
**suggestion:** Direct `console.log` in error handling is inconsistent with the rest of the runtime and may leak noisy logs.
Other methods rely on `handleError` for logging, but `executeCode` logs directly, which breaks consistency and may expose noisy or sensitive details in production. Please remove this `console.log` and rely on `handleError` (or a centralized logger), or otherwise make logging consistent across methods.
```suggestion
} catch (error) {
return this.handleError(error);
}
```
</issue_to_address>
### Comment 2
<location> `packages/builtin-tool-cloud-sandbox/src/ExecutionRuntime/index.ts:70-72` </location>
<code_context>
+ if (!result.success) {
+ return {
+ content: result.error?.message || JSON.stringify(result.error),
+ state: { files: [] },
+ success: true,
+ };
+ }
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Using `JSON.stringify(result.error)` as a fallback could produce poor or even failing error messages.
Using `JSON.stringify(result.error)` as a fallback means:
- If `result.error` is `undefined`, callers see the literal string `'undefined'`.
- If `result.error` contains non-serializable data (e.g. circular refs), `JSON.stringify` will throw and hide the original error.
A safer pattern would be something like:
`const message = result.error?.message ?? (result.error ? String(result.error) : 'Unknown error');`
so failures donβt cascade and messages stay meaningful.
Suggested implementation:
```typescript
if (!result.success) {
const message =
result.error?.message ??
(result.error ? String(result.error) : 'Unknown error');
return {
content: message,
state: { files: [] },
success: true,
};
}
```
```typescript
if (!result.success) {
const message =
result.error?.message ??
(result.error ? String(result.error) : 'Unknown error');
return {
content: message,
```
</issue_to_address>Help me be more useful! Please click π or π on each comment and I'll use the feedback to improve your reviews.
| } catch (error) { | ||
| console.log('executeCode error', error); | ||
| return this.handleError(error); | ||
| } |
There was a problem hiding this comment.
suggestion: Direct console.log in error handling is inconsistent with the rest of the runtime and may leak noisy logs.
Other methods rely on handleError for logging, but executeCode logs directly, which breaks consistency and may expose noisy or sensitive details in production. Please remove this console.log and rely on handleError (or a centralized logger), or otherwise make logging consistent across methods.
| } catch (error) { | |
| console.log('executeCode error', error); | |
| return this.handleError(error); | |
| } | |
| } catch (error) { | |
| return this.handleError(error); | |
| } |
| content: result.error?.message || JSON.stringify(result.error), | ||
| state: { files: [] }, | ||
| success: true, |
There was a problem hiding this comment.
suggestion (bug_risk): Using JSON.stringify(result.error) as a fallback could produce poor or even failing error messages.
Using JSON.stringify(result.error) as a fallback means:
- If
result.errorisundefined, callers see the literal string'undefined'. - If
result.errorcontains non-serializable data (e.g. circular refs),JSON.stringifywill throw and hide the original error.
A safer pattern would be something like:
const message = result.error?.message ?? (result.error ? String(result.error) : 'Unknown error');
so failures donβt cascade and messages stay meaningful.
Suggested implementation:
if (!result.success) {
const message =
result.error?.message ??
(result.error ? String(result.error) : 'Unknown error');
return {
content: message,
state: { files: [] },
success: true,
};
} if (!result.success) {
const message =
result.error?.message ??
(result.error ? String(result.error) : 'Unknown error');
return {
content: message,There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 99dc938de8
βΉοΈ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with π.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return { | ||
| content: result.error?.message || JSON.stringify(result.error), | ||
| state: { files: [] }, | ||
| success: true, | ||
| }; |
There was a problem hiding this comment.
Mark sandbox tool failures as unsuccessful
When the sandbox service returns success: false (e.g. file not found/permission errors), this branch still returns success: true. CloudSandboxExecutor.toBuiltinResult only attaches an error when output.success is false, so these failures will be treated as successful tool calls: pluginError is suppressed and AgentRuntime will count them as successful executions in usage metrics. Consider keeping success: false (or propagating the error field) when result.success is false so failures are surfaced correctly.
Useful? React with πΒ / π.
Codecov Reportβ
All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## next #11721 +/- ##
==========================================
- Coverage 74.18% 74.18% -0.01%
==========================================
Files 1194 1194
Lines 95149 95149
Branches 10521 12572 +2051
==========================================
- Hits 70587 70584 -3
- Misses 24472 24475 +3
Partials 90 90
Flags with carried forward coverage won't be shown. Click here to find out more.
π New features to boost your workflow:
|
|
β€οΈ Great PR @ONLY-yours β€οΈ The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world. |
## [Version 2.0.0-next.344](v2.0.0-next.343...v2.0.0-next.344) <sup>Released on **2026-01-23**</sup> #### π Bug Fixes - **misc**: Fixed the sandbox tools call when error should use right callback. <br/> <details> <summary><kbd>Improvements and Fixes</kbd></summary> #### What's fixed * **misc**: Fixed the sandbox tools call when error should use right callback, closes [#11721](#11721) ([e8fce68](e8fce68)) </details> <div align="right"> [](#readme-top) </div>
|
π This PR is included in version 2.0.0-next.344 π The release is available on: Your semantic-release bot π¦π |
## [Version 1.153.0](v1.152.0...v1.153.0) <sup>Released on **2026-01-23**</sup> #### β» Code Refactoring - **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable. - **model-select**: Migrate FunctionCallingModelSelect to LobeSelect. - **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling. - **userMemories**: Removed un-used code. - **misc**: Improve memory data with experience and identity, move vercel-react-best-practices skills to .agents directory. #### β¨ Features - **database**: Added user memory activity. - **desktop**: Add legacy local database detection and migration guidance. - **misc**: Add platform-aware download client menu option, add server version check for desktop app, remove Clerk authentication code, skill setting page and skill store, support agent group unpublish agents, support client tasks mode, update the sandbox preinstall libs in sys role. #### π Bug Fixes - **copilot**: Pass correct scope when creating new session in PageEditor. - **desktop**: Gracefully handle missing update manifest 404 errors. - **model-runtime**: Filter unsupported image types (SVG) before sending to vision models. - **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x. - **sidebar-drawer**: Fix drawer positioning and title style. - **misc**: Fix group broadcast trigger tool use, fix local system tools, fix memory schema, fix multi agent tasks issue, fix multi tasks no summary issue, fix scope issue, fix tool argument scape and improve multi task run, fixed the sandbox tools call when error should use right callback, improve e2e server and complete i18n resources, slove the agent group editor not focus in editdata area, slove the agents header switch agents the lobeAI not show problem, sloved the old removeSessionTopics not work, TypewriterEffect not refreshing on language change, updata cron job ui & fixed commnuity pagenation goto error, update the agentbuilder tools not always use humanIntervention. #### π Styles - **misc**: Improve auto scroll and group profile, update og, update share style. <br/> <details> <summary><kbd>Improvements and Fixes</kbd></summary> #### Code refactoring * **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable, closes [lobehub#11658](https://github.com/jaworldwideorg/OneJA-Bot/issues/11658) ([c0f9875](c0f9875)) * **model-select**: Migrate FunctionCallingModelSelect to LobeSelect, closes [lobehub#11664](https://github.com/jaworldwideorg/OneJA-Bot/issues/11664) ([ad51305](ad51305)) * **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling, closes [lobehub#11663](https://github.com/jaworldwideorg/OneJA-Bot/issues/11663) ([c9d9dff](c9d9dff)) * **userMemories**: Removed un-used code, closes [lobehub#11713](https://github.com/jaworldwideorg/OneJA-Bot/issues/11713) ([89750fc](89750fc)) * **misc**: Improve memory data with experience and identity, closes [lobehub#11717](https://github.com/jaworldwideorg/OneJA-Bot/issues/11717) ([bdb3eb4](bdb3eb4)) * **misc**: Move vercel-react-best-practices skills to .agents directory, closes [lobehub#11703](https://github.com/jaworldwideorg/OneJA-Bot/issues/11703) ([6df7731](6df7731)) #### What's improved * **database**: Added user memory activity, closes [lobehub#11680](https://github.com/jaworldwideorg/OneJA-Bot/issues/11680) ([0160fbd](0160fbd)) * **desktop**: Add legacy local database detection and migration guidance, closes [lobehub#11682](https://github.com/jaworldwideorg/OneJA-Bot/issues/11682) ([5664b84](5664b84)) * **misc**: Add platform-aware download client menu option, closes [lobehub#11676](https://github.com/jaworldwideorg/OneJA-Bot/issues/11676) ([55abddc](55abddc)) * **misc**: Add server version check for desktop app, closes [lobehub#11710](https://github.com/jaworldwideorg/OneJA-Bot/issues/11710) ([0cf2723](0cf2723)) * **misc**: Remove Clerk authentication code, closes [lobehub#11711](https://github.com/jaworldwideorg/OneJA-Bot/issues/11711) ([395595a](395595a)) * **misc**: Skill setting page and skill store, closes [lobehub#11665](https://github.com/jaworldwideorg/OneJA-Bot/issues/11665) ([d8c0c26](d8c0c26)) * **misc**: Support agent group unpublish agents, closes [lobehub#11687](https://github.com/jaworldwideorg/OneJA-Bot/issues/11687) ([4e060be](4e060be)) * **misc**: Support client tasks mode, closes [lobehub#11666](https://github.com/jaworldwideorg/OneJA-Bot/issues/11666) ([98cf57b](98cf57b)) * **misc**: Update the sandbox preinstall libs in sys role, closes [lobehub#11688](https://github.com/jaworldwideorg/OneJA-Bot/issues/11688) ([404c577](404c577)) #### What's fixed * **copilot**: Pass correct scope when creating new session in PageEditor, closes [lobehub#11714](https://github.com/jaworldwideorg/OneJA-Bot/issues/11714) ([0259270](0259270)) * **desktop**: Gracefully handle missing update manifest 404 errors, closes [lobehub#11625](https://github.com/jaworldwideorg/OneJA-Bot/issues/11625) ([13e95b9](13e95b9)) * **model-runtime**: Filter unsupported image types (SVG) before sending to vision models, closes [lobehub#11698](https://github.com/jaworldwideorg/OneJA-Bot/issues/11698) ([c0c99a7](c0c99a7)) * **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x, closes [lobehub#11686](https://github.com/jaworldwideorg/OneJA-Bot/issues/11686) ([2b620df](2b620df)) * **sidebar-drawer**: Fix drawer positioning and title style, closes [lobehub#11655](https://github.com/jaworldwideorg/OneJA-Bot/issues/11655) ([cf5320e](cf5320e)) * **misc**: Fix group broadcast trigger tool use, closes [lobehub#11646](https://github.com/jaworldwideorg/OneJA-Bot/issues/11646) ([831a9b3](831a9b3)) * **misc**: Fix local system tools, closes [lobehub#11702](https://github.com/jaworldwideorg/OneJA-Bot/issues/11702) ([6548fc7](6548fc7)) * **misc**: Fix memory schema, closes [lobehub#11645](https://github.com/jaworldwideorg/OneJA-Bot/issues/11645) ([3baf780](3baf780)) * **misc**: Fix multi agent tasks issue, closes [lobehub#11672](https://github.com/jaworldwideorg/OneJA-Bot/issues/11672) ([9de773b](9de773b)) * **misc**: Fix multi tasks no summary issue, closes [lobehub#11685](https://github.com/jaworldwideorg/OneJA-Bot/issues/11685) ([26ce317](26ce317)) * **misc**: Fix scope issue, closes [lobehub#11719](https://github.com/jaworldwideorg/OneJA-Bot/issues/11719) ([17adde8](17adde8)) * **misc**: Fix tool argument scape and improve multi task run, closes [lobehub#11691](https://github.com/jaworldwideorg/OneJA-Bot/issues/11691) ([b13bb8a](b13bb8a)) * **misc**: Fixed the sandbox tools call when error should use right callback, closes [lobehub#11721](https://github.com/jaworldwideorg/OneJA-Bot/issues/11721) ([e8fce68](e8fce68)) * **misc**: Improve e2e server and complete i18n resources, closes [lobehub#11678](https://github.com/jaworldwideorg/OneJA-Bot/issues/11678) ([d450dd9](d450dd9)) * **misc**: Slove the agent group editor not focus in editdata area, closes [lobehub#11677](https://github.com/jaworldwideorg/OneJA-Bot/issues/11677) ([9ac84e6](9ac84e6)) * **misc**: Slove the agents header switch agents the lobeAI not show problem, closes [lobehub#11726](https://github.com/jaworldwideorg/OneJA-Bot/issues/11726) ([f45f508](f45f508)) * **misc**: Sloved the old removeSessionTopics not work, closes [lobehub#11671](https://github.com/jaworldwideorg/OneJA-Bot/issues/11671) ([06d41e5](06d41e5)) * **misc**: TypewriterEffect not refreshing on language change, closes [lobehub#11657](https://github.com/jaworldwideorg/OneJA-Bot/issues/11657) ([ba30f46](ba30f46)) * **misc**: Updata cron job ui & fixed commnuity pagenation goto error, closes [lobehub#11700](https://github.com/jaworldwideorg/OneJA-Bot/issues/11700) ([42ad2a0](42ad2a0)) * **misc**: Update the agentbuilder tools not always use humanIntervention, closes [lobehub#11696](https://github.com/jaworldwideorg/OneJA-Bot/issues/11696) ([0d3017b](0d3017b)) #### Styles * **misc**: Improve auto scroll and group profile, closes [lobehub#11725](https://github.com/jaworldwideorg/OneJA-Bot/issues/11725) ([550acc2](550acc2)) * **misc**: Update og, closes [lobehub#11709](https://github.com/jaworldwideorg/OneJA-Bot/issues/11709) ([01cf4e4](01cf4e4)) * **misc**: Update share style, closes [lobehub#11716](https://github.com/jaworldwideorg/OneJA-Bot/issues/11716) ([3c70dfa](3c70dfa)) </details> <div align="right"> [](#readme-top) </div>
π» Change Type
fix: LOBE-3839
π Related Issue
π Description of Change
π§ͺ How to Test
πΈ Screenshots / Videos
π Additional Information