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:
@@ -0,0 +1,239 @@
|
||||
{
|
||||
"formats": [
|
||||
{
|
||||
"name": "live_pipe_parser",
|
||||
"raw_log": "live-format-1.log",
|
||||
"raw_log_sha256": "0e6df83a5a373e7adb217708ccfa45df197f2ee84edd638b9db981cba85d5b80",
|
||||
"samples": 3,
|
||||
"initial_failures": 3,
|
||||
"required_keys": [
|
||||
"timestamp",
|
||||
"level",
|
||||
"module",
|
||||
"step",
|
||||
"message"
|
||||
],
|
||||
"parser": "parsers/live_pipe_parser.py",
|
||||
"parser_sha256": "8c03fe6676bfe61f78900065f1a4caae5f2ee16ebe563cb57ed2c68bd4e8d4d5",
|
||||
"test": {
|
||||
"passed": true,
|
||||
"report": "[样本1] 通过,解析出字段:['level', 'message', 'module', 'step', 'timestamp']\n[样本2] 通过,解析出字段:['level', 'message', 'module', 'step', 'timestamp']\n[样本3] 通过,解析出字段:['level', 'message', 'module', 'step', 'timestamp']",
|
||||
"results": [
|
||||
{
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "INFO",
|
||||
"module": "checkout.worker",
|
||||
"step": "1",
|
||||
"message": "accepted real request req-81"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "WARNING",
|
||||
"module": "checkout.worker",
|
||||
"step": "2",
|
||||
"message": "retrying payment authorization req-81"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "ERROR",
|
||||
"module": "checkout.worker",
|
||||
"step": "3",
|
||||
"message": "authorization exhausted req-81"
|
||||
}
|
||||
]
|
||||
},
|
||||
"parsed_after_hot_update": [
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "INFO",
|
||||
"module": "checkout.worker",
|
||||
"step": "1",
|
||||
"message": "accepted real request req-81"
|
||||
},
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "WARNING",
|
||||
"module": "checkout.worker",
|
||||
"step": "2",
|
||||
"message": "retrying payment authorization req-81"
|
||||
},
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "ERROR",
|
||||
"module": "checkout.worker",
|
||||
"step": "3",
|
||||
"message": "authorization exhausted req-81"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "live_bracket_parser",
|
||||
"raw_log": "live-format-2.log",
|
||||
"raw_log_sha256": "b52aa925d76f1c10017d42f16efd4daacf5ed73c9184067bdee9a9e50a7878b6",
|
||||
"samples": 3,
|
||||
"initial_failures": 3,
|
||||
"required_keys": [
|
||||
"timestamp",
|
||||
"level",
|
||||
"tool",
|
||||
"latency_ms",
|
||||
"status",
|
||||
"message"
|
||||
],
|
||||
"parser": "parsers/live_bracket_parser.py",
|
||||
"parser_sha256": "4f1780d6d2e9886eafc1f5a0c3cce09c9873cb4113f9de5f34482d1efc35e07c",
|
||||
"test": {
|
||||
"passed": true,
|
||||
"report": "[样本1] 通过,解析出字段:['latency_ms', 'level', 'message', 'status', 'timestamp', 'tool']\n[样本2] 通过,解析出字段:['latency_ms', 'level', 'message', 'status', 'timestamp', 'tool']\n[样本3] 通过,解析出字段:['latency_ms', 'level', 'message', 'status', 'timestamp', 'tool']",
|
||||
"results": [
|
||||
{
|
||||
"timestamp": "2026-07-29T21:23:42.606+00:00",
|
||||
"level": "INFO",
|
||||
"tool": "inventory_lookup",
|
||||
"latency_ms": 34,
|
||||
"status": "ok",
|
||||
"message": "stock check completed"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-29T21:23:42.609+00:00",
|
||||
"level": "WARNING",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 181,
|
||||
"status": "retry",
|
||||
"message": "upstream requested retry"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-29T21:23:42.612+00:00",
|
||||
"level": "ERROR",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 412,
|
||||
"status": "timeout",
|
||||
"message": "deadline exceeded"
|
||||
}
|
||||
]
|
||||
},
|
||||
"parsed_after_hot_update": [
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.606+00:00",
|
||||
"level": "INFO",
|
||||
"tool": "inventory_lookup",
|
||||
"latency_ms": 34,
|
||||
"status": "ok",
|
||||
"message": "stock check completed"
|
||||
},
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.609+00:00",
|
||||
"level": "WARNING",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 181,
|
||||
"status": "retry",
|
||||
"message": "upstream requested retry"
|
||||
},
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.612+00:00",
|
||||
"level": "ERROR",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 412,
|
||||
"status": "timeout",
|
||||
"message": "deadline exceeded"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"loaded_after_restart": [
|
||||
"live_bracket_parser",
|
||||
"live_pipe_parser"
|
||||
],
|
||||
"rows_after_restart": [
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "INFO",
|
||||
"module": "checkout.worker",
|
||||
"step": "1",
|
||||
"message": "accepted real request req-81"
|
||||
},
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "WARNING",
|
||||
"module": "checkout.worker",
|
||||
"step": "2",
|
||||
"message": "retrying payment authorization req-81"
|
||||
},
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "ERROR",
|
||||
"module": "checkout.worker",
|
||||
"step": "3",
|
||||
"message": "authorization exhausted req-81"
|
||||
},
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.606+00:00",
|
||||
"level": "INFO",
|
||||
"tool": "inventory_lookup",
|
||||
"latency_ms": 34,
|
||||
"status": "ok",
|
||||
"message": "stock check completed"
|
||||
},
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.609+00:00",
|
||||
"level": "WARNING",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 181,
|
||||
"status": "retry",
|
||||
"message": "upstream requested retry"
|
||||
},
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.612+00:00",
|
||||
"level": "ERROR",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 412,
|
||||
"status": "timeout",
|
||||
"message": "deadline exceeded"
|
||||
}
|
||||
],
|
||||
"browser": {
|
||||
"browser": "Chromium",
|
||||
"version": "139.0.7258.5",
|
||||
"rows": 6,
|
||||
"columns": [
|
||||
"_parser",
|
||||
"latency_ms",
|
||||
"level",
|
||||
"message",
|
||||
"module",
|
||||
"status",
|
||||
"step",
|
||||
"timestamp",
|
||||
"tool"
|
||||
]
|
||||
},
|
||||
"vision_judgment": {
|
||||
"pass": true,
|
||||
"readable": true,
|
||||
"has_multiple_parsers": true,
|
||||
"observed_columns": [
|
||||
"_parser",
|
||||
"latency_ms",
|
||||
"level",
|
||||
"message",
|
||||
"module",
|
||||
"status",
|
||||
"step",
|
||||
"timestamp",
|
||||
"tool"
|
||||
],
|
||||
"reason": "The table is readable with clear columns, contains 6 parsed rows, includes multiple parser identifiers (_parser: live_pipe_parser, live_bracket_parser), and structured fields (latency_ms, level, message, etc.)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"experiment": "5-7",
|
||||
"run_id": "20260729T212342Z-5_7-live",
|
||||
"started_at_utc": "2026-07-29T21:23:42.501795+00:00",
|
||||
"completed_at_utc": "2026-07-29T21:25:15.353838+00:00",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"source": {
|
||||
"manuscript": "book/chapter5.md#实验-5-7",
|
||||
"campaign_sha256": "cafda97001032d4720a5cdd3e920e4c025102486e6158b017be9352b3935664a"
|
||||
},
|
||||
"formats": [
|
||||
{
|
||||
"name": "live_pipe_parser",
|
||||
"raw_log": "live-format-1.log",
|
||||
"raw_log_sha256": "0e6df83a5a373e7adb217708ccfa45df197f2ee84edd638b9db981cba85d5b80",
|
||||
"samples": 3,
|
||||
"initial_failures": 3,
|
||||
"required_keys": [
|
||||
"timestamp",
|
||||
"level",
|
||||
"module",
|
||||
"step",
|
||||
"message"
|
||||
],
|
||||
"parser": "parsers/live_pipe_parser.py",
|
||||
"parser_sha256": "8c03fe6676bfe61f78900065f1a4caae5f2ee16ebe563cb57ed2c68bd4e8d4d5",
|
||||
"test": {
|
||||
"passed": true,
|
||||
"report": "[样本1] 通过,解析出字段:['level', 'message', 'module', 'step', 'timestamp']\n[样本2] 通过,解析出字段:['level', 'message', 'module', 'step', 'timestamp']\n[样本3] 通过,解析出字段:['level', 'message', 'module', 'step', 'timestamp']",
|
||||
"results": [
|
||||
{
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "INFO",
|
||||
"module": "checkout.worker",
|
||||
"step": "1",
|
||||
"message": "accepted real request req-81"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "WARNING",
|
||||
"module": "checkout.worker",
|
||||
"step": "2",
|
||||
"message": "retrying payment authorization req-81"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "ERROR",
|
||||
"module": "checkout.worker",
|
||||
"step": "3",
|
||||
"message": "authorization exhausted req-81"
|
||||
}
|
||||
]
|
||||
},
|
||||
"parsed_after_hot_update": [
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "INFO",
|
||||
"module": "checkout.worker",
|
||||
"step": "1",
|
||||
"message": "accepted real request req-81"
|
||||
},
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "WARNING",
|
||||
"module": "checkout.worker",
|
||||
"step": "2",
|
||||
"message": "retrying payment authorization req-81"
|
||||
},
|
||||
{
|
||||
"_parser": "live_pipe_parser",
|
||||
"timestamp": "2026-07-30T05:23:42Z",
|
||||
"level": "ERROR",
|
||||
"module": "checkout.worker",
|
||||
"step": "3",
|
||||
"message": "authorization exhausted req-81"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "live_bracket_parser",
|
||||
"raw_log": "live-format-2.log",
|
||||
"raw_log_sha256": "b52aa925d76f1c10017d42f16efd4daacf5ed73c9184067bdee9a9e50a7878b6",
|
||||
"samples": 3,
|
||||
"initial_failures": 3,
|
||||
"required_keys": [
|
||||
"timestamp",
|
||||
"level",
|
||||
"tool",
|
||||
"latency_ms",
|
||||
"status",
|
||||
"message"
|
||||
],
|
||||
"parser": "parsers/live_bracket_parser.py",
|
||||
"parser_sha256": "4f1780d6d2e9886eafc1f5a0c3cce09c9873cb4113f9de5f34482d1efc35e07c",
|
||||
"test": {
|
||||
"passed": true,
|
||||
"report": "[样本1] 通过,解析出字段:['latency_ms', 'level', 'message', 'status', 'timestamp', 'tool']\n[样本2] 通过,解析出字段:['latency_ms', 'level', 'message', 'status', 'timestamp', 'tool']\n[样本3] 通过,解析出字段:['latency_ms', 'level', 'message', 'status', 'timestamp', 'tool']",
|
||||
"results": [
|
||||
{
|
||||
"timestamp": "2026-07-29T21:23:42.606+00:00",
|
||||
"level": "INFO",
|
||||
"tool": "inventory_lookup",
|
||||
"latency_ms": 34,
|
||||
"status": "ok",
|
||||
"message": "stock check completed"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-29T21:23:42.609+00:00",
|
||||
"level": "WARNING",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 181,
|
||||
"status": "retry",
|
||||
"message": "upstream requested retry"
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-29T21:23:42.612+00:00",
|
||||
"level": "ERROR",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 412,
|
||||
"status": "timeout",
|
||||
"message": "deadline exceeded"
|
||||
}
|
||||
]
|
||||
},
|
||||
"parsed_after_hot_update": [
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.606+00:00",
|
||||
"level": "INFO",
|
||||
"tool": "inventory_lookup",
|
||||
"latency_ms": 34,
|
||||
"status": "ok",
|
||||
"message": "stock check completed"
|
||||
},
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.609+00:00",
|
||||
"level": "WARNING",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 181,
|
||||
"status": "retry",
|
||||
"message": "upstream requested retry"
|
||||
},
|
||||
{
|
||||
"_parser": "live_bracket_parser",
|
||||
"timestamp": "2026-07-29T21:23:42.612+00:00",
|
||||
"level": "ERROR",
|
||||
"tool": "payment_api",
|
||||
"latency_ms": 412,
|
||||
"status": "timeout",
|
||||
"message": "deadline exceeded"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"browser": {
|
||||
"browser": "Chromium",
|
||||
"version": "139.0.7258.5",
|
||||
"rows": 6,
|
||||
"columns": [
|
||||
"_parser",
|
||||
"latency_ms",
|
||||
"level",
|
||||
"message",
|
||||
"module",
|
||||
"status",
|
||||
"step",
|
||||
"timestamp",
|
||||
"tool"
|
||||
]
|
||||
},
|
||||
"vision_judgment": {
|
||||
"pass": true,
|
||||
"readable": true,
|
||||
"has_multiple_parsers": true,
|
||||
"observed_columns": [
|
||||
"_parser",
|
||||
"latency_ms",
|
||||
"level",
|
||||
"message",
|
||||
"module",
|
||||
"status",
|
||||
"step",
|
||||
"timestamp",
|
||||
"tool"
|
||||
],
|
||||
"reason": "The table is readable with clear columns, contains 6 parsed rows, includes multiple parser identifiers (_parser: live_pipe_parser, live_bracket_parser), and structured fields (latency_ms, level, message, etc.)"
|
||||
},
|
||||
"usage": {
|
||||
"calls": 3,
|
||||
"prompt_tokens": 3696,
|
||||
"completion_tokens": 4069,
|
||||
"total_tokens": 7765,
|
||||
"latency_s": 92.052
|
||||
},
|
||||
"artifacts": {
|
||||
"evidence.json": {
|
||||
"path": "evidence.json",
|
||||
"sha256": "5bbdfd7a34e133c51ce96f6cb3139cc90a50462a9f1ddf3963850c7136851d75",
|
||||
"bytes": 7273
|
||||
},
|
||||
"live-format-1.log": {
|
||||
"path": "live-format-1.log",
|
||||
"sha256": "0e6df83a5a373e7adb217708ccfa45df197f2ee84edd638b9db981cba85d5b80",
|
||||
"bytes": 249
|
||||
},
|
||||
"live-format-2.log": {
|
||||
"path": "live-format-2.log",
|
||||
"sha256": "b52aa925d76f1c10017d42f16efd4daacf5ed73c9184067bdee9a9e50a7878b6",
|
||||
"bytes": 345
|
||||
},
|
||||
"parsers/__pycache__/live_bracket_parser.cpython-311.pyc": {
|
||||
"path": "parsers/__pycache__/live_bracket_parser.cpython-311.pyc",
|
||||
"sha256": "096ea41a2b5b1a6cf683d18d05579810f499dbea75366e798c98f882eeab5a8a",
|
||||
"bytes": 1232
|
||||
},
|
||||
"parsers/__pycache__/live_pipe_parser.cpython-311.pyc": {
|
||||
"path": "parsers/__pycache__/live_pipe_parser.cpython-311.pyc",
|
||||
"sha256": "fa59fd91273396f06f51866d8cc206cbad0b73a146a0de78f1d5752b6cc4be86",
|
||||
"bytes": 1200
|
||||
},
|
||||
"parsers/live_bracket_parser.py": {
|
||||
"path": "parsers/live_bracket_parser.py",
|
||||
"sha256": "4f1780d6d2e9886eafc1f5a0c3cce09c9873cb4113f9de5f34482d1efc35e07c",
|
||||
"bytes": 869
|
||||
},
|
||||
"parsers/live_pipe_parser.py": {
|
||||
"path": "parsers/live_pipe_parser.py",
|
||||
"sha256": "8c03fe6676bfe61f78900065f1a4caae5f2ee16ebe563cb57ed2c68bd4e8d4d5",
|
||||
"bytes": 733
|
||||
},
|
||||
"producer-1.py": {
|
||||
"path": "producer-1.py",
|
||||
"sha256": "dda2a6a04f198f038d74f78375f8d03eb9e48aeadd672c0b39c13fb2900c69f2",
|
||||
"bytes": 547
|
||||
},
|
||||
"producer-2.py": {
|
||||
"path": "producer-2.py",
|
||||
"sha256": "cb6999b88a3bd22a9187cc37efdeec0e02d5a0f70390f21620cab2218b53bb71",
|
||||
"bytes": 638
|
||||
},
|
||||
"receipts.json": {
|
||||
"path": "receipts.json",
|
||||
"sha256": "31a3da57aa08f7ec90b591567721fb4a09698365fc7c7710cd9c958e2c647a45",
|
||||
"bytes": 8546
|
||||
},
|
||||
"visualization.html": {
|
||||
"path": "visualization.html",
|
||||
"sha256": "3f236a29650312ca11579cd1918e98affc1082c2dac3aeb8dc90bcdae0aaf185",
|
||||
"bytes": 1693
|
||||
},
|
||||
"visualization.png": {
|
||||
"path": "visualization.png",
|
||||
"sha256": "d8dfad31b33fc0fa5dcf60b99041e61ef531627e5bde64e92f1cb345ab2cec52",
|
||||
"bytes": 96289
|
||||
}
|
||||
},
|
||||
"acceptance_gates": {
|
||||
"raw_logs_emitted_by_real_runtime_processes": true,
|
||||
"initial_system_detected_every_new_format_failure": true,
|
||||
"real_model_generated_both_parser_modules": true,
|
||||
"generated_code_passed_automatic_tests": true,
|
||||
"hot_update_parsed_every_failed_sample": true,
|
||||
"persisted_parsers_loaded_after_fresh_engine_restart": true,
|
||||
"fresh_engine_parsed_entire_mixed_stream": true,
|
||||
"real_chromium_rendered_visualization": true,
|
||||
"real_vision_model_approved_rendered_pixels": true,
|
||||
"raw_provider_receipts_complete": true
|
||||
},
|
||||
"official_complete": true
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
import re
|
||||
|
||||
def parse(line: str) -> dict | None:
|
||||
# 定义日志格式的正则表达式模式
|
||||
pattern = r'^\[(?P<timestamp>[^\]]+)\]\s*\((?P<level>[^)]+)\)\s*<tool=(?P<tool>[^>]+)>\s*\{latency_ms=(?P<latency_ms>\d+)\s+status=(?P<status>\w+)\}\s*::\s*(?P<message>.*)$'
|
||||
|
||||
# 尝试匹配日志行
|
||||
match = re.match(pattern, line.strip())
|
||||
if not match:
|
||||
return None
|
||||
|
||||
# 提取匹配的组
|
||||
groups = match.groupdict()
|
||||
|
||||
# 检查所有必需字段是否存在且不为空
|
||||
required_keys = ['timestamp', 'level', 'tool', 'latency_ms', 'status', 'message']
|
||||
for key in required_keys:
|
||||
if key not in groups or not groups[key]:
|
||||
return None
|
||||
|
||||
# 转换latency_ms为整数
|
||||
try:
|
||||
groups['latency_ms'] = int(groups['latency_ms'])
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
return groups
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
import re
|
||||
|
||||
def parse(line: str) -> dict | None:
|
||||
# 定义匹配日志格式的正则表达式
|
||||
pattern = r'^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z)\|([A-Z]+)\|([\w.]+)\|step=(\d+)\|(.*)$'
|
||||
match = re.match(pattern, line.strip())
|
||||
|
||||
if not match:
|
||||
return None
|
||||
|
||||
# 提取各个字段
|
||||
timestamp = match.group(1)
|
||||
level = match.group(2)
|
||||
module = match.group(3)
|
||||
step = match.group(4)
|
||||
message = match.group(5)
|
||||
|
||||
# 确保所有必需字段都不为空
|
||||
if not all([timestamp, level, module, step, message]):
|
||||
return None
|
||||
|
||||
return {
|
||||
'timestamp': timestamp,
|
||||
'level': level,
|
||||
'module': module,
|
||||
'step': step,
|
||||
'message': message
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import logging, sys
|
||||
formatter=logging.Formatter('%(asctime)s|%(levelname)s|%(name)s|step=%(step)s|%(message)s', datefmt='%Y-%m-%dT%H:%M:%SZ')
|
||||
handler=logging.StreamHandler(sys.stdout); handler.setFormatter(formatter)
|
||||
logger=logging.getLogger('checkout.worker'); logger.handlers=[handler]; logger.setLevel(logging.INFO); logger.propagate=False
|
||||
logger.info('accepted real request req-81', extra={'step': 1})
|
||||
logger.warning('retrying payment authorization req-81', extra={'step': 2})
|
||||
logger.error('authorization exhausted req-81', extra={'step': 3})
|
||||
@@ -0,0 +1,7 @@
|
||||
import datetime, time
|
||||
events=[('inventory_lookup',34,'ok','stock check completed'),('payment_api',181,'retry','upstream requested retry'),('payment_api',412,'timeout','deadline exceeded')]
|
||||
for tool,latency,status,message in events:
|
||||
started=time.perf_counter(); time.sleep(0.003); observed=max(latency,int((time.perf_counter()-started)*1000))
|
||||
stamp=datetime.datetime.now(datetime.timezone.utc).isoformat(timespec='milliseconds')
|
||||
level='ERROR' if status=='timeout' else ('WARNING' if status=='retry' else 'INFO')
|
||||
print(f'[{stamp}] ({level}) <tool={tool}> {{latency_ms={observed} status={status}}} :: {message}', flush=True)
|
||||
@@ -0,0 +1,103 @@
|
||||
[
|
||||
{
|
||||
"purpose": "generate-live_pipe_parser-attempt-1",
|
||||
"called_at_utc": "2026-07-29T21:24:10.369834+00:00",
|
||||
"latency_s": 27.68,
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "你是一个\"日志解析器代码生成器\"。用户会给你一批**同一种未知格式**的日志样本,\n以及现有系统解析失败的报错。你的任务:编写一个 Python 函数,把这种格式的每一行解析成结构化字段。\n\n严格要求:\n1. 只输出一个 Python 代码块(```python ... ```),不要任何解释文字。\n2. 代码块里必须定义一个函数:def parse(line: str) -> dict | None\n - 输入是一行日志(字符串)。\n - 如果这行符合你要解析的格式,返回一个 dict,键为字段名(英文小写下划线),值为解析出的内容。\n - 如果这行**不符合**这种格式,必须返回 None(不要抛异常,把机会让给其它解析器)。\n3. 只能使用 Python 标准库(re、json、datetime 等),不要 import 第三方库。\n4. 不要有任何 print、input、文件读写、网络访问等副作用。\n5. 必须解析出用户指定的**所有必需字段**(required_keys),字段值不能为空。\n6. 尽量健壮:用正则/分隔符解析,容忍字段顺序内的空格。\n"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "现有系统无法解析下面这种格式的日志,请生成解析函数。\n\n【失败样本(同一种新格式)】\n2026-07-30T05:23:42Z|INFO|checkout.worker|step=1|accepted real request req-81\n2026-07-30T05:23:42Z|WARNING|checkout.worker|step=2|retrying payment authorization req-81\n2026-07-30T05:23:42Z|ERROR|checkout.worker|step=3|authorization exhausted req-81\n\n【系统报错】\n没有任何已注册解析器能解析该行:'2026-07-30T05:23:42Z|INFO|checkout.worker|step=1|accepted real request req-81'\n\n【必需解析出的字段 required_keys】\n['timestamp', 'level', 'module', 'step', 'message']"
|
||||
}
|
||||
],
|
||||
"temperature": 0
|
||||
},
|
||||
"response": {
|
||||
"id": "0217853602230262b35cfdb86d4e4b324c5d7f5a75557a23d3680",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "```python\nimport re\n\ndef parse(line: str) -> dict | None:\n # 定义匹配日志格式的正则表达式\n pattern = r'^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z)\\|([A-Z]+)\\|([\\w.]+)\\|step=(\\d+)\\|(.*)$'\n match = re.match(pattern, line.strip())\n \n if not match:\n return None\n \n # 提取各个字段\n timestamp = match.group(1)\n level = match.group(2)\n module = match.group(3)\n step = match.group(4)\n message = match.group(5)\n \n # 确保所有必需字段都不为空\n if not all([timestamp, level, module, step, message]):\n return None\n \n return {\n 'timestamp': timestamp,\n 'level': level,\n 'module': module,\n 'step': step,\n 'message': message\n }\n```"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 588,
|
||||
"completion_tokens": 1136,
|
||||
"total_tokens": 1724,
|
||||
"cached_prompt_tokens": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"purpose": "generate-live_bracket_parser-attempt-1",
|
||||
"called_at_utc": "2026-07-29T21:25:00.326777+00:00",
|
||||
"latency_s": 49.954,
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "你是一个\"日志解析器代码生成器\"。用户会给你一批**同一种未知格式**的日志样本,\n以及现有系统解析失败的报错。你的任务:编写一个 Python 函数,把这种格式的每一行解析成结构化字段。\n\n严格要求:\n1. 只输出一个 Python 代码块(```python ... ```),不要任何解释文字。\n2. 代码块里必须定义一个函数:def parse(line: str) -> dict | None\n - 输入是一行日志(字符串)。\n - 如果这行符合你要解析的格式,返回一个 dict,键为字段名(英文小写下划线),值为解析出的内容。\n - 如果这行**不符合**这种格式,必须返回 None(不要抛异常,把机会让给其它解析器)。\n3. 只能使用 Python 标准库(re、json、datetime 等),不要 import 第三方库。\n4. 不要有任何 print、input、文件读写、网络访问等副作用。\n5. 必须解析出用户指定的**所有必需字段**(required_keys),字段值不能为空。\n6. 尽量健壮:用正则/分隔符解析,容忍字段顺序内的空格。\n"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "现有系统无法解析下面这种格式的日志,请生成解析函数。\n\n【失败样本(同一种新格式)】\n[2026-07-29T21:23:42.606+00:00] (INFO) <tool=inventory_lookup> {latency_ms=34 status=ok} :: stock check completed\n[2026-07-29T21:23:42.609+00:00] (WARNING) <tool=payment_api> {latency_ms=181 status=retry} :: upstream requested retry\n[2026-07-29T21:23:42.612+00:00] (ERROR) <tool=payment_api> {latency_ms=412 status=timeout} :: deadline exceeded\n\n【系统报错】\n没有任何已注册解析器能解析该行:'[2026-07-29T21:23:42.606+00:00] (INFO) <tool=inventory_lookup> {latency_ms=34 status=ok} :: stock check completed'\n\n【必需解析出的字段 required_keys】\n['timestamp', 'level', 'tool', 'latency_ms', 'status', 'message']"
|
||||
}
|
||||
],
|
||||
"temperature": 0
|
||||
},
|
||||
"response": {
|
||||
"id": "0217853602505592b35cfdb86d4e4b324c5d7f5a75557a2d2f0d6",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "```python\nimport re\n\ndef parse(line: str) -> dict | None:\n # 定义日志格式的正则表达式模式\n pattern = r'^\\[(?P<timestamp>[^\\]]+)\\]\\s*\\((?P<level>[^)]+)\\)\\s*<tool=(?P<tool>[^>]+)>\\s*\\{latency_ms=(?P<latency_ms>\\d+)\\s+status=(?P<status>\\w+)\\}\\s*::\\s*(?P<message>.*)$'\n \n # 尝试匹配日志行\n match = re.match(pattern, line.strip())\n if not match:\n return None\n \n # 提取匹配的组\n groups = match.groupdict()\n \n # 检查所有必需字段是否存在且不为空\n required_keys = ['timestamp', 'level', 'tool', 'latency_ms', 'status', 'message']\n for key in required_keys:\n if key not in groups or not groups[key]:\n return None\n \n # 转换latency_ms为整数\n try:\n groups['latency_ms'] = int(groups['latency_ms'])\n except ValueError:\n return None\n \n return groups\n```"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 661,
|
||||
"completion_tokens": 2452,
|
||||
"total_tokens": 3113,
|
||||
"cached_prompt_tokens": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"purpose": "vision-review-rendered-parser-table",
|
||||
"called_at_utc": "2026-07-29T21:25:15.349082+00:00",
|
||||
"latency_s": 14.418,
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Inspect this rendered adaptive-log table. Return strict JSON: {\"pass\": bool, \"readable\": bool, \"has_multiple_parsers\": bool, \"observed_columns\": [strings], \"reason\": string}. Pass only if the table is readable, contains multiple parsed rows, and visibly includes both parser identifiers and structured fields."
|
||||
},
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {
|
||||
"sha256": "d8dfad31b33fc0fa5dcf60b99041e61ef531627e5bde64e92f1cb345ab2cec52",
|
||||
"bytes": 96289
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0
|
||||
},
|
||||
"response": {
|
||||
"id": "0217853603011172b35cfdb86d4e4b324c5d7f5a75557a2e2712e",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"pass\": true, \"readable\": true, \"has_multiple_parsers\": true, \"observed_columns\": [\"_parser\", \"latency_ms\", \"level\", \"message\", \"module\", \"status\", \"step\", \"timestamp\", \"tool\"], \"reason\": \"The table is readable with clear columns, contains 6 parsed rows, includes multiple parser identifiers (_parser: live_pipe_parser, live_bracket_parser), and structured fields (latency_ms, level, message, etc.)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 2447,
|
||||
"completion_tokens": 481,
|
||||
"total_tokens": 2928,
|
||||
"cached_prompt_tokens": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
<!doctype html><meta charset=utf-8><title>Adaptive log parser</title>
|
||||
<style>body{font-family:system-ui;background:#0b1020;color:#e8eefc;padding:30px}table{border-collapse:collapse;width:100%;background:#121a30}th,td{border:1px solid #33415f;padding:9px;text-align:left}th{color:#79c0ff}h1{color:#a5d6ff}</style>
|
||||
<h1>Self-healed live log stream</h1><p>6 runtime records parsed after hot update.</p>
|
||||
<table><thead><tr><th>_parser</th><th>latency_ms</th><th>level</th><th>message</th><th>module</th><th>status</th><th>step</th><th>timestamp</th><th>tool</th></tr></thead><tbody><tr><td>live_pipe_parser</td><td></td><td>INFO</td><td>accepted real request req-81</td><td>checkout.worker</td><td></td><td>1</td><td>2026-07-30T05:23:42Z</td><td></td></tr><tr><td>live_pipe_parser</td><td></td><td>WARNING</td><td>retrying payment authorization req-81</td><td>checkout.worker</td><td></td><td>2</td><td>2026-07-30T05:23:42Z</td><td></td></tr><tr><td>live_pipe_parser</td><td></td><td>ERROR</td><td>authorization exhausted req-81</td><td>checkout.worker</td><td></td><td>3</td><td>2026-07-30T05:23:42Z</td><td></td></tr><tr><td>live_bracket_parser</td><td>34</td><td>INFO</td><td>stock check completed</td><td></td><td>ok</td><td></td><td>2026-07-29T21:23:42.606+00:00</td><td>inventory_lookup</td></tr><tr><td>live_bracket_parser</td><td>181</td><td>WARNING</td><td>upstream requested retry</td><td></td><td>retry</td><td></td><td>2026-07-29T21:23:42.609+00:00</td><td>payment_api</td></tr><tr><td>live_bracket_parser</td><td>412</td><td>ERROR</td><td>deadline exceeded</td><td></td><td>timeout</td><td></td><td>2026-07-29T21:23:42.612+00:00</td><td>payment_api</td></tr></tbody></table>
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
Reference in New Issue
Block a user