ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
This commit is contained in:
+260
@@ -0,0 +1,260 @@
|
||||
LINE-000
|
||||
LINE-001
|
||||
LINE-002
|
||||
LINE-003
|
||||
LINE-004
|
||||
LINE-005
|
||||
LINE-006
|
||||
LINE-007
|
||||
LINE-008
|
||||
LINE-009
|
||||
LINE-010
|
||||
LINE-011
|
||||
LINE-012
|
||||
LINE-013
|
||||
LINE-014
|
||||
LINE-015
|
||||
LINE-016
|
||||
LINE-017
|
||||
LINE-018
|
||||
LINE-019
|
||||
LINE-020
|
||||
LINE-021
|
||||
LINE-022
|
||||
LINE-023
|
||||
LINE-024
|
||||
LINE-025
|
||||
LINE-026
|
||||
LINE-027
|
||||
LINE-028
|
||||
LINE-029
|
||||
LINE-030
|
||||
LINE-031
|
||||
LINE-032
|
||||
LINE-033
|
||||
LINE-034
|
||||
LINE-035
|
||||
LINE-036
|
||||
LINE-037
|
||||
LINE-038
|
||||
LINE-039
|
||||
LINE-040
|
||||
LINE-041
|
||||
LINE-042
|
||||
LINE-043
|
||||
LINE-044
|
||||
LINE-045
|
||||
LINE-046
|
||||
LINE-047
|
||||
LINE-048
|
||||
LINE-049
|
||||
LINE-050
|
||||
LINE-051
|
||||
LINE-052
|
||||
LINE-053
|
||||
LINE-054
|
||||
LINE-055
|
||||
LINE-056
|
||||
LINE-057
|
||||
LINE-058
|
||||
LINE-059
|
||||
LINE-060
|
||||
LINE-061
|
||||
LINE-062
|
||||
LINE-063
|
||||
LINE-064
|
||||
LINE-065
|
||||
LINE-066
|
||||
LINE-067
|
||||
LINE-068
|
||||
LINE-069
|
||||
LINE-070
|
||||
LINE-071
|
||||
LINE-072
|
||||
LINE-073
|
||||
LINE-074
|
||||
LINE-075
|
||||
LINE-076
|
||||
LINE-077
|
||||
LINE-078
|
||||
LINE-079
|
||||
LINE-080
|
||||
LINE-081
|
||||
LINE-082
|
||||
LINE-083
|
||||
LINE-084
|
||||
LINE-085
|
||||
LINE-086
|
||||
LINE-087
|
||||
LINE-088
|
||||
LINE-089
|
||||
LINE-090
|
||||
LINE-091
|
||||
LINE-092
|
||||
LINE-093
|
||||
LINE-094
|
||||
LINE-095
|
||||
LINE-096
|
||||
LINE-097
|
||||
LINE-098
|
||||
LINE-099
|
||||
LINE-100
|
||||
LINE-101
|
||||
LINE-102
|
||||
LINE-103
|
||||
LINE-104
|
||||
LINE-105
|
||||
LINE-106
|
||||
LINE-107
|
||||
LINE-108
|
||||
LINE-109
|
||||
LINE-110
|
||||
LINE-111
|
||||
LINE-112
|
||||
LINE-113
|
||||
LINE-114
|
||||
LINE-115
|
||||
LINE-116
|
||||
LINE-117
|
||||
LINE-118
|
||||
LINE-119
|
||||
LINE-120
|
||||
LINE-121
|
||||
LINE-122
|
||||
LINE-123
|
||||
LINE-124
|
||||
LINE-125
|
||||
LINE-126
|
||||
LINE-127
|
||||
LINE-128
|
||||
LINE-129
|
||||
LINE-130
|
||||
LINE-131
|
||||
LINE-132
|
||||
LINE-133
|
||||
LINE-134
|
||||
LINE-135
|
||||
LINE-136
|
||||
LINE-137
|
||||
LINE-138
|
||||
LINE-139
|
||||
LINE-140
|
||||
LINE-141
|
||||
LINE-142
|
||||
LINE-143
|
||||
LINE-144
|
||||
LINE-145
|
||||
LINE-146
|
||||
LINE-147
|
||||
LINE-148
|
||||
LINE-149
|
||||
LINE-150
|
||||
LINE-151
|
||||
LINE-152
|
||||
LINE-153
|
||||
LINE-154
|
||||
LINE-155
|
||||
LINE-156
|
||||
LINE-157
|
||||
LINE-158
|
||||
LINE-159
|
||||
LINE-160
|
||||
LINE-161
|
||||
LINE-162
|
||||
LINE-163
|
||||
LINE-164
|
||||
LINE-165
|
||||
LINE-166
|
||||
LINE-167
|
||||
LINE-168
|
||||
LINE-169
|
||||
LINE-170
|
||||
LINE-171
|
||||
LINE-172
|
||||
LINE-173
|
||||
LINE-174
|
||||
LINE-175
|
||||
LINE-176
|
||||
LINE-177
|
||||
LINE-178
|
||||
LINE-179
|
||||
LINE-180
|
||||
LINE-181
|
||||
LINE-182
|
||||
LINE-183
|
||||
LINE-184
|
||||
LINE-185
|
||||
LINE-186
|
||||
LINE-187
|
||||
LINE-188
|
||||
LINE-189
|
||||
LINE-190
|
||||
LINE-191
|
||||
LINE-192
|
||||
LINE-193
|
||||
LINE-194
|
||||
LINE-195
|
||||
LINE-196
|
||||
LINE-197
|
||||
LINE-198
|
||||
LINE-199
|
||||
LINE-200
|
||||
LINE-201
|
||||
LINE-202
|
||||
LINE-203
|
||||
LINE-204
|
||||
LINE-205
|
||||
LINE-206
|
||||
LINE-207
|
||||
LINE-208
|
||||
LINE-209
|
||||
LINE-210
|
||||
LINE-211
|
||||
LINE-212
|
||||
LINE-213
|
||||
LINE-214
|
||||
LINE-215
|
||||
LINE-216
|
||||
LINE-217
|
||||
LINE-218
|
||||
LINE-219
|
||||
LINE-220
|
||||
LINE-221
|
||||
LINE-222
|
||||
LINE-223
|
||||
LINE-224
|
||||
LINE-225
|
||||
LINE-226
|
||||
LINE-227
|
||||
LINE-228
|
||||
LINE-229
|
||||
LINE-230
|
||||
LINE-231
|
||||
LINE-232
|
||||
LINE-233
|
||||
LINE-234
|
||||
LINE-235
|
||||
LINE-236
|
||||
LINE-237
|
||||
LINE-238
|
||||
LINE-239
|
||||
LINE-240
|
||||
LINE-241
|
||||
LINE-242
|
||||
LINE-243
|
||||
LINE-244
|
||||
LINE-245
|
||||
LINE-246
|
||||
LINE-247
|
||||
LINE-248
|
||||
LINE-249
|
||||
LINE-250
|
||||
LINE-251
|
||||
LINE-252
|
||||
LINE-253
|
||||
LINE-254
|
||||
LINE-255
|
||||
LINE-256
|
||||
LINE-257
|
||||
LINE-258
|
||||
LINE-259
|
||||
+272
@@ -0,0 +1,272 @@
|
||||
{
|
||||
"transport": "mcp-stdio",
|
||||
"server_name": "execution-tools",
|
||||
"server_version": "1.0.0",
|
||||
"schemas": [
|
||||
{
|
||||
"name": "file_write",
|
||||
"description": "Write content to a file with automatic syntax verification",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"path": {
|
||||
"type": "string",
|
||||
"description": "File path (relative to workspace or absolute)"
|
||||
},
|
||||
"content": {
|
||||
"type": "string",
|
||||
"description": "Content to write"
|
||||
},
|
||||
"overwrite": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to overwrite existing files",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"path",
|
||||
"content"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "file_edit",
|
||||
"description": "Edit an existing file by searching and replacing content",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"path": {
|
||||
"type": "string",
|
||||
"description": "File path"
|
||||
},
|
||||
"search": {
|
||||
"type": "string",
|
||||
"description": "Text to search for"
|
||||
},
|
||||
"replace": {
|
||||
"type": "string",
|
||||
"description": "Replacement text"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"path",
|
||||
"search",
|
||||
"replace"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "code_interpreter",
|
||||
"description": "Execute code in multiple programming languages in a sandboxed environment with result analysis. Supports: Python, JavaScript, TypeScript, Go, Java, C++, Rust, PHP, Bash",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"code": {
|
||||
"type": "string",
|
||||
"description": "Code to execute"
|
||||
},
|
||||
"language": {
|
||||
"type": "string",
|
||||
"description": "Programming language (python, javascript, typescript, go, java, cpp, rust, php, bash)",
|
||||
"default": "python"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "number",
|
||||
"description": "Execution timeout in seconds",
|
||||
"default": 30.0
|
||||
},
|
||||
"stdin": {
|
||||
"type": "string",
|
||||
"description": "Optional stdin input for the program"
|
||||
},
|
||||
"files": {
|
||||
"type": "object",
|
||||
"description": "Optional additional files (filename -> content mapping)",
|
||||
"additionalProperties": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "virtual_terminal",
|
||||
"description": "Execute shell commands with error summarization",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"command": {
|
||||
"type": "string",
|
||||
"description": "Shell command to execute"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "integer",
|
||||
"description": "Timeout in seconds",
|
||||
"default": 30
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"command"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "google_calendar_add",
|
||||
"description": "Add an event to Google Calendar",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"summary": {
|
||||
"type": "string",
|
||||
"description": "Event title"
|
||||
},
|
||||
"start_time": {
|
||||
"type": "string",
|
||||
"description": "Start time (ISO 8601 format, e.g., 2024-01-01T10:00:00)"
|
||||
},
|
||||
"end_time": {
|
||||
"type": "string",
|
||||
"description": "End time (ISO 8601 format)"
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"description": "Event description"
|
||||
},
|
||||
"location": {
|
||||
"type": "string",
|
||||
"description": "Event location"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"summary",
|
||||
"start_time",
|
||||
"end_time"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "github_create_pr",
|
||||
"description": "Create a GitHub Pull Request",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"repo_name": {
|
||||
"type": "string",
|
||||
"description": "Repository name (format: owner/repo)"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "PR title"
|
||||
},
|
||||
"body": {
|
||||
"type": "string",
|
||||
"description": "PR description"
|
||||
},
|
||||
"head_branch": {
|
||||
"type": "string",
|
||||
"description": "Source branch"
|
||||
},
|
||||
"base_branch": {
|
||||
"type": "string",
|
||||
"description": "Target branch",
|
||||
"default": "main"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"repo_name",
|
||||
"title",
|
||||
"body",
|
||||
"head_branch"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "excel_create_with_formula_and_screenshot",
|
||||
"description": "Create an XLSX workbook, apply formulas, and render a real screenshot with LibreOffice",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"output_path": {
|
||||
"type": "string"
|
||||
},
|
||||
"rows": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"item": {
|
||||
"type": "string"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "number"
|
||||
},
|
||||
"unit_price": {
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"item",
|
||||
"quantity",
|
||||
"unit_price"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"output_path",
|
||||
"rows"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "webhook_post",
|
||||
"description": "POST JSON to a real HTTPS webhook endpoint",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string"
|
||||
},
|
||||
"payload": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"url",
|
||||
"payload"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "browser_navigate",
|
||||
"description": "Navigate with real headless Chromium, extract page content, and save a screenshot",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string"
|
||||
},
|
||||
"screenshot_path": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"url",
|
||||
"screenshot_path"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "environment_capabilities",
|
||||
"description": "Inspect real Computer Use container and Android device availability",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {}
|
||||
}
|
||||
}
|
||||
],
|
||||
"schema_sha256": "d9a5bd49b95a42874d0d588926f4c717df2344c86f22991624c3056720649e74"
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
[
|
||||
{
|
||||
"purpose": "dangerous_operation_review",
|
||||
"called_at_utc": "2026-07-29T22:26:40.931107+00:00",
|
||||
"provider": "kimi",
|
||||
"request": {
|
||||
"model": "kimi-k3",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a cautious safety reviewer. Approve operations that are safe and reject risky ones."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "You are a safety reviewer for an AI agent execution system.\nReview the following operation and determine if it should be approved.\n\nOperation: terminal_command\nDetails: {\n \"command\": \"rm -rf ./should-never-execute\",\n \"detected_patterns\": [\n \"rm -rf\"\n ]\n}\n\nAnalyze the operation for:\n1. Potential data loss or destructive actions\n2. Security risks\n3. Resource consumption concerns\n4. Compliance with best practices\n\nRespond in JSON format:\n{\n \"approved\": true/false,\n \"reason\": \"Brief explanation of your decision\",\n \"risk_level\": \"low/medium/high\",\n \"recommendations\": [\"List of recommendations if any\"]\n}\n"
|
||||
}
|
||||
],
|
||||
"temperature": 1,
|
||||
"max_tokens": 4096
|
||||
},
|
||||
"response": {
|
||||
"id": "chatcmpl-6a6a7e10ec6f19570af6af7a",
|
||||
"model": "kimi-k3",
|
||||
"finish_reason": "stop",
|
||||
"content": "```json\n{\n \"approved\": false,\n \"reason\": \"The command 'rm -rf' performs recursive, forced deletion without confirmation, which is inherently destructive and irreversible. The target directory name 'should-never-execute' further signals this operation should not proceed. There is no verification of the path's contents, no backup mechanism, and no explicit user confirmation for this destructive action.\",\n \"risk_level\": \"high\",\n \"recommendations\": [\n \"Avoid using 'rm -rf' with force flags; require explicit user confirmation before any recursive deletion\",\n \"Verify the target path contents with 'ls -la ./should-never-execute' before any deletion attempt\",\n \"Use safer alternatives such as moving the directory to a trash location (e.g., 'mv ./should-never-execute ~/.trash/') for recoverability\",\n \"Create a backup of the directory before deletion if the data has any potential value\",\n \"Implement path validation to prevent deletion of directories with suspicious or protected names\",\n \"Use 'rm -ri' for interactive deletion if removal is truly intended and confirmed by the user\"\n ]\n}\n```"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 259,
|
||||
"completion_tokens": 505,
|
||||
"total_tokens": 764
|
||||
},
|
||||
"latency_seconds": 18.213
|
||||
},
|
||||
{
|
||||
"purpose": "dangerous_operation_review",
|
||||
"called_at_utc": "2026-07-29T22:26:58.129910+00:00",
|
||||
"provider": "kimi",
|
||||
"request": {
|
||||
"model": "kimi-k3",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a cautious safety reviewer. Approve operations that are safe and reject risky ones."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "You are a safety reviewer for an AI agent execution system.\nReview the following operation and determine if it should be approved.\n\nOperation: code_execution\nDetails: {\n \"code\": \"import urllib.request\\ntry:\\n print(urllib.request.urlopen('https://example.com', timeout=3).status)\\nexcept Exception as e:\\n print(type(e).__name__, str(e))\\n\",\n \"language\": \"python\",\n \"detected_patterns\": [\n \"open(\"\n ]\n}\n\nAnalyze the operation for:\n1. Potential data loss or destructive actions\n2. Security risks\n3. Resource consumption concerns\n4. Compliance with best practices\n\nRespond in JSON format:\n{\n \"approved\": true/false,\n \"reason\": \"Brief explanation of your decision\",\n \"risk_level\": \"low/medium/high\",\n \"recommendations\": [\"List of recommendations if any\"]\n}\n"
|
||||
}
|
||||
],
|
||||
"temperature": 1,
|
||||
"max_tokens": 4096
|
||||
},
|
||||
"response": {
|
||||
"id": "chatcmpl-6a6a7e229eab2b3298a1be04",
|
||||
"model": "kimi-k3",
|
||||
"finish_reason": "stop",
|
||||
"content": "```json\n{\n \"approved\": true,\n \"reason\": \"The operation is a benign read-only HTTPS GET request to example.com (an IANA-reserved documentation/test domain) that simply prints the HTTP status code. It includes a timeout and proper exception handling, involves no destructive actions, no data writes, no credential handling, and minimal resource use. The detected 'open(' pattern is a false positive from urllib.request.urlopen(), not a local file operation.\",\n \"risk_level\": \"low\",\n \"recommendations\": [\n \"If the execution environment has an egress policy, confirm that outbound network access to arbitrary hosts is permitted, even though this request targets a harmless reserved domain.\",\n \"Consider logging outbound network requests for audit purposes in production agent environments.\"\n ]\n}\n```"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 298,
|
||||
"completion_tokens": 504,
|
||||
"total_tokens": 802
|
||||
},
|
||||
"latency_seconds": 17.028
|
||||
}
|
||||
]
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
[
|
||||
{
|
||||
"purpose": "dangerous_operation_review",
|
||||
"called_at_utc": "2026-07-29T22:26:40.931107+00:00",
|
||||
"provider": "kimi",
|
||||
"request": {
|
||||
"model": "kimi-k3",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a cautious safety reviewer. Approve operations that are safe and reject risky ones."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "You are a safety reviewer for an AI agent execution system.\nReview the following operation and determine if it should be approved.\n\nOperation: terminal_command\nDetails: {\n \"command\": \"rm -rf ./should-never-execute\",\n \"detected_patterns\": [\n \"rm -rf\"\n ]\n}\n\nAnalyze the operation for:\n1. Potential data loss or destructive actions\n2. Security risks\n3. Resource consumption concerns\n4. Compliance with best practices\n\nRespond in JSON format:\n{\n \"approved\": true/false,\n \"reason\": \"Brief explanation of your decision\",\n \"risk_level\": \"low/medium/high\",\n \"recommendations\": [\"List of recommendations if any\"]\n}\n"
|
||||
}
|
||||
],
|
||||
"temperature": 1,
|
||||
"max_tokens": 4096
|
||||
},
|
||||
"response": {
|
||||
"id": "chatcmpl-6a6a7e10ec6f19570af6af7a",
|
||||
"model": "kimi-k3",
|
||||
"finish_reason": "stop",
|
||||
"content": "```json\n{\n \"approved\": false,\n \"reason\": \"The command 'rm -rf' performs recursive, forced deletion without confirmation, which is inherently destructive and irreversible. The target directory name 'should-never-execute' further signals this operation should not proceed. There is no verification of the path's contents, no backup mechanism, and no explicit user confirmation for this destructive action.\",\n \"risk_level\": \"high\",\n \"recommendations\": [\n \"Avoid using 'rm -rf' with force flags; require explicit user confirmation before any recursive deletion\",\n \"Verify the target path contents with 'ls -la ./should-never-execute' before any deletion attempt\",\n \"Use safer alternatives such as moving the directory to a trash location (e.g., 'mv ./should-never-execute ~/.trash/') for recoverability\",\n \"Create a backup of the directory before deletion if the data has any potential value\",\n \"Implement path validation to prevent deletion of directories with suspicious or protected names\",\n \"Use 'rm -ri' for interactive deletion if removal is truly intended and confirmed by the user\"\n ]\n}\n```"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 259,
|
||||
"completion_tokens": 505,
|
||||
"total_tokens": 764
|
||||
},
|
||||
"latency_seconds": 18.213
|
||||
},
|
||||
{
|
||||
"purpose": "dangerous_operation_review",
|
||||
"called_at_utc": "2026-07-29T22:26:58.129910+00:00",
|
||||
"provider": "kimi",
|
||||
"request": {
|
||||
"model": "kimi-k3",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a cautious safety reviewer. Approve operations that are safe and reject risky ones."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "You are a safety reviewer for an AI agent execution system.\nReview the following operation and determine if it should be approved.\n\nOperation: code_execution\nDetails: {\n \"code\": \"import urllib.request\\ntry:\\n print(urllib.request.urlopen('https://example.com', timeout=3).status)\\nexcept Exception as e:\\n print(type(e).__name__, str(e))\\n\",\n \"language\": \"python\",\n \"detected_patterns\": [\n \"open(\"\n ]\n}\n\nAnalyze the operation for:\n1. Potential data loss or destructive actions\n2. Security risks\n3. Resource consumption concerns\n4. Compliance with best practices\n\nRespond in JSON format:\n{\n \"approved\": true/false,\n \"reason\": \"Brief explanation of your decision\",\n \"risk_level\": \"low/medium/high\",\n \"recommendations\": [\"List of recommendations if any\"]\n}\n"
|
||||
}
|
||||
],
|
||||
"temperature": 1,
|
||||
"max_tokens": 4096
|
||||
},
|
||||
"response": {
|
||||
"id": "chatcmpl-6a6a7e229eab2b3298a1be04",
|
||||
"model": "kimi-k3",
|
||||
"finish_reason": "stop",
|
||||
"content": "```json\n{\n \"approved\": true,\n \"reason\": \"The operation is a benign read-only HTTPS GET request to example.com (an IANA-reserved documentation/test domain) that simply prints the HTTP status code. It includes a timeout and proper exception handling, involves no destructive actions, no data writes, no credential handling, and minimal resource use. The detected 'open(' pattern is a false positive from urllib.request.urlopen(), not a local file operation.\",\n \"risk_level\": \"low\",\n \"recommendations\": [\n \"If the execution environment has an egress policy, confirm that outbound network access to arbitrary hosts is permitted, even though this request targets a harmless reserved domain.\",\n \"Consider logging outbound network requests for audit purposes in production agent environments.\"\n ]\n}\n```"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 298,
|
||||
"completion_tokens": 504,
|
||||
"total_tokens": 802
|
||||
},
|
||||
"latency_seconds": 17.028
|
||||
}
|
||||
]
|
||||
+163
@@ -0,0 +1,163 @@
|
||||
{
|
||||
"experiment": "4-3",
|
||||
"campaign_id": "real_mcp_20260730T070500Z",
|
||||
"status": "blocked",
|
||||
"official_complete": false,
|
||||
"files": [
|
||||
{
|
||||
"path": "artifacts/long_output.full.txt",
|
||||
"bytes": 2340,
|
||||
"sha256": "86b815da715192ef997d8a8d0c6adcaa8b1fdf9aa349889a4fc46462e4c02cb1"
|
||||
},
|
||||
{
|
||||
"path": "catalog.json",
|
||||
"bytes": 7135,
|
||||
"sha256": "a2459670d25b4cce95b6709846934d6600e1c2eac6090cd77ff6139369ad9c58"
|
||||
},
|
||||
{
|
||||
"path": "llm_receipts.checkpoint.json",
|
||||
"bytes": 5112,
|
||||
"sha256": "9bfcd8ee68e880c1d9c3141963d97eb7d1743d71647200d34807465498cfed1b"
|
||||
},
|
||||
{
|
||||
"path": "llm_receipts.json",
|
||||
"bytes": 5113,
|
||||
"sha256": "dabaf8a14e145ebc88d93a4a7032afce049fae98cbf17db957e5f82126f07619"
|
||||
},
|
||||
{
|
||||
"path": "outside-witness.txt",
|
||||
"bytes": 16,
|
||||
"sha256": "de6e8ea7f35c8a0261f7fb9eb75022a92311cfd84248567104f5c9e7d3ddf782"
|
||||
},
|
||||
{
|
||||
"path": "protocol.json",
|
||||
"bytes": 1067,
|
||||
"sha256": "f8ca33de720405502a7f0df26a2c9a4bf3988a6eee235500a1355d258ebaebc0"
|
||||
},
|
||||
{
|
||||
"path": "receipts/01_python_valid_write.json",
|
||||
"bytes": 504,
|
||||
"sha256": "5237151b2fc0efb59da8e02619c6190aef5a7a0400e98b44b859474eabf3e686"
|
||||
},
|
||||
{
|
||||
"path": "receipts/02_python_invalid_rejected.json",
|
||||
"bytes": 417,
|
||||
"sha256": "b42060e04825d24bb20bb646ab0c8a5b11663ff4d25409b1d784d12881831590"
|
||||
},
|
||||
{
|
||||
"path": "receipts/03_javascript_valid_write.json",
|
||||
"bytes": 516,
|
||||
"sha256": "a73b1750929371562748fd73e7f3ca32ed8aa51cb68b98e59dfe5b9dbc23f6d6"
|
||||
},
|
||||
{
|
||||
"path": "receipts/04_javascript_invalid_rejected.json",
|
||||
"bytes": 897,
|
||||
"sha256": "509808a4d105f7e38b22dee9ed24b0d1756e5060c2a92a6143bedf040f902d91"
|
||||
},
|
||||
{
|
||||
"path": "receipts/05_verified_edit.json",
|
||||
"bytes": 519,
|
||||
"sha256": "9bc914d9862f1a7d550c4572335ba789232e45051772edd4525d612d9e93bb9b"
|
||||
},
|
||||
{
|
||||
"path": "receipts/06_path_escape_rejected.json",
|
||||
"bytes": 369,
|
||||
"sha256": "8f778b3d855f06b85c6d81f23d4e905dc46c438a3669d841324e1578e094b678"
|
||||
},
|
||||
{
|
||||
"path": "receipts/07_terminal_safe.json",
|
||||
"bytes": 494,
|
||||
"sha256": "29704f32819b8cb6358b67f93f525aa2098e4f0ba5874aec9f5e43733b14380d"
|
||||
},
|
||||
{
|
||||
"path": "receipts/08_terminal_timeout.json",
|
||||
"bytes": 307,
|
||||
"sha256": "692ae82a1a80008ddabede71d795ec367f95a8ab30ed808f2cb67c72930fae60"
|
||||
},
|
||||
{
|
||||
"path": "receipts/09_terminal_danger_rejected.json",
|
||||
"bytes": 699,
|
||||
"sha256": "0f4d4d9d6f053e7fd4d08801646e3cec3485b5610ad5ebd2287a2077aafb596c"
|
||||
},
|
||||
{
|
||||
"path": "receipts/10_python_docker_sandbox.json",
|
||||
"bytes": 1126,
|
||||
"sha256": "20a912310d8fc364dd2a9fbac4ddcf2ac5fe579b105e76e9864009a0a5be7985"
|
||||
},
|
||||
{
|
||||
"path": "receipts/11_python_network_denied.json",
|
||||
"bytes": 1011,
|
||||
"sha256": "e211efef5aa93802c96816cb2369bc78205c9611f4204ce266c87add833e3c2f"
|
||||
},
|
||||
{
|
||||
"path": "receipts/12_long_output_persisted.json",
|
||||
"bytes": 2176,
|
||||
"sha256": "f673d9820e49343127f133385ac8c49684e40cda5aaca25d586ac951e03f4126"
|
||||
},
|
||||
{
|
||||
"path": "receipts/13_excel_formula_screenshot.json",
|
||||
"bytes": 1466,
|
||||
"sha256": "1e276f77ec6f402aa841e213e59c11685f854ad5ed90aff83751e05fc28d5a8d"
|
||||
},
|
||||
{
|
||||
"path": "receipts/14_real_webhook.json",
|
||||
"bytes": 1149,
|
||||
"sha256": "2a18e4e400e5b5ce094289492be430ae0bd35d2ffafdb526e4f95aa7fd7eb9ce"
|
||||
},
|
||||
{
|
||||
"path": "receipts/15_real_browser.json",
|
||||
"bytes": 884,
|
||||
"sha256": "685348ff21b92983b01678c16dc227e1345e9578c998d28ecdc373e408dc5d50"
|
||||
},
|
||||
{
|
||||
"path": "receipts/16_calendar_preflight.json",
|
||||
"bytes": 442,
|
||||
"sha256": "67b317de35158904b5b08e891d4a8e31bbe25a94e4d1cfe88ffeebb3d2433556"
|
||||
},
|
||||
{
|
||||
"path": "receipts/17_github_pr_preflight.json",
|
||||
"bytes": 462,
|
||||
"sha256": "a39311ace49b1e2e4db4c614f59f7e7374b83cad38df38a22be0260a041d8e82"
|
||||
},
|
||||
{
|
||||
"path": "receipts/18_desktop_mobile_capabilities.json",
|
||||
"bytes": 489,
|
||||
"sha256": "2fc4d52f7a7c499e74184572af210e77e6fe0e9633a60f95a69b4cb31e6fa74a"
|
||||
},
|
||||
{
|
||||
"path": "summary.json",
|
||||
"bytes": 1323,
|
||||
"sha256": "1e49d2131e8c694465142c2d7e844f7601026cab8b76592b8ed156233b7fc22c"
|
||||
},
|
||||
{
|
||||
"path": "workspace/browser-example.png",
|
||||
"bytes": 16578,
|
||||
"sha256": "f21d7a2b1f7739641b8838e2ed2a9a907559cece9397568db6e1ccca197cc7b0"
|
||||
},
|
||||
{
|
||||
"path": "workspace/invoice.pdf",
|
||||
"bytes": 19487,
|
||||
"sha256": "d0b2ab6e0bff2e0e77730bb22d5066782618b164a43b76c79a334440f7f3a493"
|
||||
},
|
||||
{
|
||||
"path": "workspace/invoice.png",
|
||||
"bytes": 14315,
|
||||
"sha256": "b97c76df59cc7972772341ea3a391bb4dba8907b65000f1b360005804d39986d"
|
||||
},
|
||||
{
|
||||
"path": "workspace/invoice.xlsx",
|
||||
"bytes": 5060,
|
||||
"sha256": "59aac1249a4b3b9472113eab025d6bb5312341c63cb443a001166b4ff7ab1c8b"
|
||||
},
|
||||
{
|
||||
"path": "workspace/valid.js",
|
||||
"bytes": 40,
|
||||
"sha256": "799574240050acc326491093ba5641e3eb6ec281fc8f7a0a259b80a0a51724cd"
|
||||
},
|
||||
{
|
||||
"path": "workspace/valid.py",
|
||||
"bytes": 32,
|
||||
"sha256": "e1a894022d1a082987b87adecb623438c9e386d86b2b621cff4a5fe7fdf7edc8"
|
||||
}
|
||||
]
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
MUST-NOT-CHANGE
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"experiment": "4-3",
|
||||
"authority": "book/chapter4.md:274",
|
||||
"required_categories": {
|
||||
"file_write_edit": [
|
||||
"python_linter",
|
||||
"javascript_linter",
|
||||
"structured_errors"
|
||||
],
|
||||
"terminal": [
|
||||
"timeout",
|
||||
"dangerous_command_review",
|
||||
"history_or_receipt"
|
||||
],
|
||||
"code_interpreter": [
|
||||
"real_sandbox",
|
||||
"dangerous_operation_gate",
|
||||
"long_output_persisted"
|
||||
],
|
||||
"data": [
|
||||
"excel_write",
|
||||
"formula",
|
||||
"screenshot"
|
||||
],
|
||||
"external": [
|
||||
"calendar",
|
||||
"github_pr",
|
||||
"email",
|
||||
"webhook"
|
||||
],
|
||||
"gui": [
|
||||
"browser",
|
||||
"virtual_desktop",
|
||||
"virtual_mobile"
|
||||
]
|
||||
},
|
||||
"safety": {
|
||||
"workspace_confinement": true,
|
||||
"automatic_linter": true,
|
||||
"llm_driven_danger_review": true,
|
||||
"long_output_head_tail_and_full_file": true,
|
||||
"credential_free_receipts": true
|
||||
},
|
||||
"completion_rule": "Every named manuscript category must have substantive real execution evidence; missing credentials or active GUI backends produce blocked, never passed."
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"case": "python_valid_write",
|
||||
"tool": "file_write",
|
||||
"arguments": {
|
||||
"path": "valid.py",
|
||||
"content": "def add(a, b):\n return a + b\n",
|
||||
"overwrite": true
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace/valid.py",
|
||||
"bytes_written": 32,
|
||||
"verification": "passed"
|
||||
},
|
||||
"latency_seconds": 0.002
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"case": "python_invalid_rejected",
|
||||
"tool": "file_write",
|
||||
"arguments": {
|
||||
"path": "invalid.py",
|
||||
"content": "def broken(:\n pass\n",
|
||||
"overwrite": true
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": false,
|
||||
"error": "Syntax validation failed: Syntax error at line 1: invalid syntax",
|
||||
"verification": "failed"
|
||||
},
|
||||
"latency_seconds": 0.002
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"case": "javascript_valid_write",
|
||||
"tool": "file_write",
|
||||
"arguments": {
|
||||
"path": "valid.js",
|
||||
"content": "const answer = 42;\nconsole.log(answer);\n",
|
||||
"overwrite": true
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace/valid.js",
|
||||
"bytes_written": 40,
|
||||
"verification": "passed"
|
||||
},
|
||||
"latency_seconds": 0.068
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"case": "javascript_invalid_rejected",
|
||||
"tool": "file_write",
|
||||
"arguments": {
|
||||
"path": "invalid.js",
|
||||
"content": "const broken = ;\n",
|
||||
"overwrite": true
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": false,
|
||||
"error": "Syntax validation failed: [stdin]:1\nconst broken = ;\n ^\n\nSyntaxError: Unexpected token ';'\n at wrapSafe (node:internal/modules/cjs/loader:1740:18)\n at checkSyntax (node:internal/main/check_syntax:76:3)\n at node:internal/main/check_syntax:45:5\n at Socket.<anonymous> (node:internal/process/execution:205:5)\n at Socket.emit (node:events:520:22)\n at endReadableNT (node:internal/streams/readable:1729:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:90:21)\n\nNode.js v25.6.0",
|
||||
"verification": "failed"
|
||||
},
|
||||
"latency_seconds": 0.067
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"case": "verified_edit",
|
||||
"tool": "file_edit",
|
||||
"arguments": {
|
||||
"path": "valid.py",
|
||||
"search": "a + b",
|
||||
"replace": "a - b"
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace/valid.py",
|
||||
"diff_preview": "Line 2:\n - return a + b\n + return a - b",
|
||||
"verification": "passed"
|
||||
},
|
||||
"latency_seconds": 0.002
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"case": "path_escape_rejected",
|
||||
"tool": "file_write",
|
||||
"arguments": {
|
||||
"path": "../../escape.py",
|
||||
"content": "print('escape')\n",
|
||||
"overwrite": true
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": false,
|
||||
"error": "Path ../../escape.py is outside workspace directory"
|
||||
},
|
||||
"latency_seconds": 0.002
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"case": "terminal_safe",
|
||||
"tool": "virtual_terminal",
|
||||
"arguments": {
|
||||
"command": "pwd && printf SAFE",
|
||||
"timeout": 10
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"returncode": 0,
|
||||
"stdout": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace\nSAFE",
|
||||
"stderr": "",
|
||||
"stdout_file": null,
|
||||
"stderr_file": null
|
||||
},
|
||||
"latency_seconds": 0.008
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"case": "terminal_timeout",
|
||||
"tool": "virtual_terminal",
|
||||
"arguments": {
|
||||
"command": "sleep 2",
|
||||
"timeout": 1
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": false,
|
||||
"error": "Command timed out after 1 seconds"
|
||||
},
|
||||
"latency_seconds": 1.008
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"case": "terminal_danger_rejected",
|
||||
"tool": "virtual_terminal",
|
||||
"arguments": {
|
||||
"command": "rm -rf ./should-never-execute",
|
||||
"timeout": 10
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": false,
|
||||
"error": "Command execution not approved: The command 'rm -rf' performs recursive, forced deletion without confirmation, which is inherently destructive and irreversible. The target directory name 'should-never-execute' further signals this operation should not proceed. There is no verification of the path's contents, no backup mechanism, and no explicit user confirmation for this destructive action."
|
||||
},
|
||||
"latency_seconds": 18.275
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"case": "python_docker_sandbox",
|
||||
"tool": "code_interpreter",
|
||||
"arguments": {
|
||||
"language": "python",
|
||||
"timeout": 30,
|
||||
"code": "import os, json\nprint(json.dumps({'root': os.listdir('/'), 'network_proxy': os.environ.get('HTTPS_PROXY')}))\n"
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"status": "success",
|
||||
"language": "python",
|
||||
"stdout": "{\"root\": [\"sys\", \"root\", \"boot\", \"opt\", \"sbin\", \"srv\", \"dev\", \"media\", \"proc\", \"var\", \"tmp\", \"etc\", \"home\", \"lib\", \"usr\", \"run\", \"mnt\", \"bin\", \"workspace\", \".dockerenv\"], \"network_proxy\": null}\n",
|
||||
"stderr": "",
|
||||
"stdout_file": null,
|
||||
"stderr_file": null,
|
||||
"returncode": 0,
|
||||
"error": null,
|
||||
"compile_output": null,
|
||||
"phase": null,
|
||||
"execution_time": 0.15543341636657715,
|
||||
"sandbox": {
|
||||
"kind": "docker",
|
||||
"image": "python:3.11-slim",
|
||||
"network": "none",
|
||||
"rootfs": "read-only",
|
||||
"memory": "256m",
|
||||
"cpus": 1,
|
||||
"pids_limit": 64
|
||||
},
|
||||
"verification": "passed"
|
||||
},
|
||||
"latency_seconds": 0.164
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"case": "python_network_denied",
|
||||
"tool": "code_interpreter",
|
||||
"arguments": {
|
||||
"language": "python",
|
||||
"timeout": 30,
|
||||
"code": "import urllib.request\ntry:\n print(urllib.request.urlopen('https://example.com', timeout=3).status)\nexcept Exception as e:\n print(type(e).__name__, str(e))\n"
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"status": "success",
|
||||
"language": "python",
|
||||
"stdout": "URLError <urlopen error [Errno -3] Temporary failure in name resolution>\n",
|
||||
"stderr": "",
|
||||
"stdout_file": null,
|
||||
"stderr_file": null,
|
||||
"returncode": 0,
|
||||
"error": null,
|
||||
"compile_output": null,
|
||||
"phase": null,
|
||||
"execution_time": 0.25653815269470215,
|
||||
"sandbox": {
|
||||
"kind": "docker",
|
||||
"image": "python:3.11-slim",
|
||||
"network": "none",
|
||||
"rootfs": "read-only",
|
||||
"memory": "256m",
|
||||
"cpus": 1,
|
||||
"pids_limit": 64
|
||||
},
|
||||
"verification": "passed"
|
||||
},
|
||||
"latency_seconds": 17.298
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"case": "long_output_persisted",
|
||||
"tool": "code_interpreter",
|
||||
"arguments": {
|
||||
"language": "python",
|
||||
"timeout": 30,
|
||||
"code": "for i in range(260): print(f'LINE-{i:03d}')\n"
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"status": "success",
|
||||
"language": "python",
|
||||
"stdout": "LINE-000\nLINE-001\nLINE-002\nLINE-003\nLINE-004\nLINE-005\nLINE-006\nLINE-007\nLINE-008\nLINE-009\nLINE-010\nLINE-011\nLINE-012\nLINE-013\nLINE-014\nLINE-015\nLINE-016\nLINE-017\nLINE-018\nLINE-019\nLINE-020\nLINE-021\nLINE-022\nLINE-023\nLINE-024\nLINE-025\nLINE-026\nLINE-027\nLINE-028\nLINE-029\nLINE-030\nLINE-031\nLINE-032\nLINE-033\nLINE-034\nLINE-035\nLINE-036\nLINE-037\nLINE-038\nLINE-039\nLINE-040\nLINE-041\nLINE-042\nLINE-043\nLINE-044\nLINE-045\nLINE-046\nLINE-047\nLINE-048\nLINE-049\n... [省略 161 行,完整输出已保存至 /var/folders/0l/vk1w1b5n2fxfwdlz3f_w25_w0000gp/T/code_interpreter_output_v37osy_b.txt] ...\nLINE-211\nLINE-212\nLINE-213\nLINE-214\nLINE-215\nLINE-216\nLINE-217\nLINE-218\nLINE-219\nLINE-220\nLINE-221\nLINE-222\nLINE-223\nLINE-224\nLINE-225\nLINE-226\nLINE-227\nLINE-228\nLINE-229\nLINE-230\nLINE-231\nLINE-232\nLINE-233\nLINE-234\nLINE-235\nLINE-236\nLINE-237\nLINE-238\nLINE-239\nLINE-240\nLINE-241\nLINE-242\nLINE-243\nLINE-244\nLINE-245\nLINE-246\nLINE-247\nLINE-248\nLINE-249\nLINE-250\nLINE-251\nLINE-252\nLINE-253\nLINE-254\nLINE-255\nLINE-256\nLINE-257\nLINE-258\nLINE-259\n\n[如需完整输出,请使用 read_file 工具读取 /var/folders/0l/vk1w1b5n2fxfwdlz3f_w25_w0000gp/T/code_interpreter_output_v37osy_b.txt]",
|
||||
"stderr": "",
|
||||
"stdout_file": "/var/folders/0l/vk1w1b5n2fxfwdlz3f_w25_w0000gp/T/code_interpreter_output_v37osy_b.txt",
|
||||
"stderr_file": null,
|
||||
"returncode": 0,
|
||||
"error": null,
|
||||
"compile_output": null,
|
||||
"phase": null,
|
||||
"execution_time": 0.12924504280090332,
|
||||
"sandbox": {
|
||||
"kind": "docker",
|
||||
"image": "python:3.11-slim",
|
||||
"network": "none",
|
||||
"rootfs": "read-only",
|
||||
"memory": "256m",
|
||||
"cpus": 1,
|
||||
"pids_limit": 64
|
||||
},
|
||||
"verification": "passed"
|
||||
},
|
||||
"latency_seconds": 0.141
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"case": "excel_formula_screenshot",
|
||||
"tool": "excel_create_with_formula_and_screenshot",
|
||||
"arguments": {
|
||||
"output_path": "invoice.xlsx",
|
||||
"rows": [
|
||||
{
|
||||
"item": "Compute",
|
||||
"quantity": 2,
|
||||
"unit_price": 12.5
|
||||
},
|
||||
{
|
||||
"item": "Storage",
|
||||
"quantity": 3,
|
||||
"unit_price": 7.0
|
||||
}
|
||||
]
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"xlsx": {
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace/invoice.xlsx",
|
||||
"bytes": 5060,
|
||||
"sha256": "59aac1249a4b3b9472113eab025d6bb5312341c63cb443a001166b4ff7ab1c8b"
|
||||
},
|
||||
"pdf": {
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace/invoice.pdf",
|
||||
"bytes": 19487,
|
||||
"sha256": "d0b2ab6e0bff2e0e77730bb22d5066782618b164a43b76c79a334440f7f3a493"
|
||||
},
|
||||
"screenshot": {
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace/invoice.png",
|
||||
"bytes": 14315,
|
||||
"sha256": "b97c76df59cc7972772341ea3a391bb4dba8907b65000f1b360005804d39986d"
|
||||
},
|
||||
"formula_cells": [
|
||||
"D2",
|
||||
"D3",
|
||||
"D4"
|
||||
],
|
||||
"rows": 2,
|
||||
"renderer": "LibreOffice headless + PyMuPDF",
|
||||
"latency_seconds": 1.13
|
||||
},
|
||||
"latency_seconds": 1.222
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"case": "real_webhook",
|
||||
"tool": "webhook_post",
|
||||
"arguments": {
|
||||
"url": "https://postman-echo.com/post",
|
||||
"payload": {
|
||||
"experiment": "4-3",
|
||||
"marker": "REAL-WEBHOOK-RECEIPT"
|
||||
}
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"status": 200,
|
||||
"url": "https://postman-echo.com/post",
|
||||
"response": {
|
||||
"args": {},
|
||||
"data": {
|
||||
"experiment": "4-3",
|
||||
"marker": "REAL-WEBHOOK-RECEIPT"
|
||||
},
|
||||
"files": {},
|
||||
"form": {},
|
||||
"headers": {
|
||||
"host": "postman-echo.com",
|
||||
"content-length": "52",
|
||||
"accept": "*/*",
|
||||
"content-type": "application/json",
|
||||
"user-agent": "python-httpx/0.28.1",
|
||||
"x-forwarded-proto": "https",
|
||||
"accept-encoding": "gzip, br"
|
||||
},
|
||||
"json": {
|
||||
"experiment": "4-3",
|
||||
"marker": "REAL-WEBHOOK-RECEIPT"
|
||||
},
|
||||
"url": "https://postman-echo.com/post"
|
||||
},
|
||||
"response_sha256": "727438d7ad2e56ef124d7b14904d546de199bf2bda40bb56989885625ecc45f2",
|
||||
"response_bytes": 391,
|
||||
"latency_seconds": 1.06
|
||||
},
|
||||
"latency_seconds": 1.063
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"case": "real_browser",
|
||||
"tool": "browser_navigate",
|
||||
"arguments": {
|
||||
"url": "https://example.com",
|
||||
"screenshot_path": "browser-example.png"
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"url": "https://example.com",
|
||||
"status": 200,
|
||||
"title": "Example Domain",
|
||||
"body_text": "Example Domain\n\nThis domain is for use in documentation examples without needing permission. Avoid use in operations.\n\nLearn more",
|
||||
"screenshot": {
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter4/execution-tools/validation/experiment_4_3/real_mcp_20260730T070500Z/workspace/browser-example.png",
|
||||
"bytes": 16578,
|
||||
"sha256": "f21d7a2b1f7739641b8838e2ed2a9a907559cece9397568db6e1ccca197cc7b0"
|
||||
},
|
||||
"browser": "Chromium via Playwright",
|
||||
"latency_seconds": 1.902
|
||||
},
|
||||
"latency_seconds": 1.906
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"case": "calendar_preflight",
|
||||
"tool": "google_calendar_add",
|
||||
"arguments": {
|
||||
"summary": "Experiment 4-3",
|
||||
"start_time": "2026-08-01T10:00:00+00:00",
|
||||
"end_time": "2026-08-01T10:30:00+00:00"
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": false,
|
||||
"error": "Failed to initialize Google Calendar: Credentials file not found: credentials.json"
|
||||
},
|
||||
"latency_seconds": 0.002
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"case": "github_pr_preflight",
|
||||
"tool": "github_create_pr",
|
||||
"arguments": {
|
||||
"repo_name": "bojieli/ai-agent-book",
|
||||
"title": "Experiment 4-3 preflight",
|
||||
"body": "Credential-gated preflight",
|
||||
"head_branch": "nonexistent-exp4-3"
|
||||
},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": false,
|
||||
"error": "Failed to initialize GitHub client: GitHub token not configured"
|
||||
},
|
||||
"latency_seconds": 0.002
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"case": "desktop_mobile_capabilities",
|
||||
"tool": "environment_capabilities",
|
||||
"arguments": {},
|
||||
"transport": "mcp-stdio",
|
||||
"mcp_result_is_error": false,
|
||||
"payload": {
|
||||
"success": true,
|
||||
"computer_use_container_image_present": true,
|
||||
"computer_use_active_session": false,
|
||||
"android_world_adb_present": true,
|
||||
"android_active_devices": [],
|
||||
"note": "Availability probe only; absent active sessions cannot satisfy execution gates."
|
||||
},
|
||||
"latency_seconds": 0.035
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"experiment": "4-3",
|
||||
"campaign_id": "real_mcp_20260730T070500Z",
|
||||
"generated_at": "2026-07-29T22:27:02.959073+00:00",
|
||||
"status": "blocked",
|
||||
"official_complete": false,
|
||||
"gates": {
|
||||
"real_mcp_catalog_and_calls": true,
|
||||
"python_and_javascript_linter": true,
|
||||
"file_edit_verified_and_escape_rejected": true,
|
||||
"terminal_timeout_and_llm_danger_review": true,
|
||||
"real_python_container_sandbox": true,
|
||||
"long_output_truncated_and_persisted": true,
|
||||
"real_excel_formula_and_screenshot": true,
|
||||
"real_webhook": true,
|
||||
"real_browser": true,
|
||||
"real_calendar_mutation": false,
|
||||
"real_github_pr_mutation": false,
|
||||
"real_email_mutation": false,
|
||||
"real_virtual_desktop_session": false,
|
||||
"real_virtual_mobile_session": false,
|
||||
"credential_free_usage_latency_receipts": true
|
||||
},
|
||||
"long_output_full_file": {
|
||||
"path": "artifacts/long_output.full.txt",
|
||||
"bytes": 2340,
|
||||
"sha256": "86b815da715192ef997d8a8d0c6adcaa8b1fdf9aa349889a4fc46462e4c02cb1",
|
||||
"source_temp_path_sha256": "db74bcaabc997ed39ea3e943101c35b51e395946dccb8ba84b2da2d20e72a8ce"
|
||||
},
|
||||
"blockers": [
|
||||
"real_calendar_mutation",
|
||||
"real_github_pr_mutation",
|
||||
"real_email_mutation",
|
||||
"real_virtual_desktop_session",
|
||||
"real_virtual_mobile_session"
|
||||
],
|
||||
"receipt_count": 18,
|
||||
"llm_call_count": 2
|
||||
}
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
BIN
Binary file not shown.
BIN
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
Binary file not shown.
+2
@@ -0,0 +1,2 @@
|
||||
const answer = 42;
|
||||
console.log(answer);
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
def add(a, b):
|
||||
return a - b
|
||||
Reference in New Issue
Block a user