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

This commit is contained in:
2026-08-20 13:12:50 +00:00
commit b119135836
10275 changed files with 3284984 additions and 0 deletions
@@ -0,0 +1,28 @@
"""Shared bootstrap for agent-skills-ppt regression tests."""
import sys
from pathlib import Path
from types import ModuleType
PROJECT_ROOT = Path(__file__).resolve().parents[1]
if str(PROJECT_ROOT) not in sys.path:
sys.path.insert(0, str(PROJECT_ROOT))
SCRIPTS_DIR = PROJECT_ROOT / "skills" / "pptx" / "scripts"
if str(SCRIPTS_DIR) not in sys.path:
sys.path.insert(0, str(SCRIPTS_DIR))
try:
import openai # noqa: F401
except ImportError:
openai_stub = ModuleType("openai")
openai_stub.OpenAI = object
sys.modules["openai"] = openai_stub
try:
import pptx # noqa: F401
except ImportError:
pptx_stub = ModuleType("pptx")
pptx_stub.Presentation = object
sys.modules["pptx"] = pptx_stub
@@ -0,0 +1,66 @@
#!/usr/bin/env python3
"""Regression tests for dispatch() in demo.py.
Bug: the agentic loop parses tool-call arguments with a JSONDecodeError
fallback to {} and then calls dispatch() with no try/except. dispatch()
used to do args["name"] / args["payload"] etc., so any malformed or
incomplete LLM tool call crashed the whole run with KeyError. Fixed to
return "[error] ..." strings that the agent can recover from.
"""
import os
from pathlib import Path
from demo import dispatch, scan_skill_catalog
OUT = Path("/tmp/test_dispatch_out.pptx")
def test_missing_name_returns_error_not_keyerror():
catalog = scan_skill_catalog()
# {} is exactly what the JSONDecodeError fallback in run_agent produces
result = dispatch(catalog, "read_skill", {}, OUT)
assert result.startswith("[error]")
assert "name" in result
def test_missing_payload_returns_error_not_keyerror():
catalog = scan_skill_catalog()
result = dispatch(catalog, "run_skill_script",
{"name": "pptx", "script": "generate_pptx.py"}, OUT)
assert result.startswith("[error]")
assert "payload" in result
def test_unknown_tool_still_returns_error():
catalog = scan_skill_catalog()
result = dispatch(catalog, "no_such_tool", {}, OUT)
assert result.startswith("[error]")
def test_valid_read_skill_still_works():
catalog = scan_skill_catalog()
result = dispatch(catalog, "read_skill", {"name": "pptx"}, OUT)
assert not result.startswith("[error]")
assert len(result) > 0
def test_run_skill_script_rejects_absolute_path(tmp_path):
"""run_skill_script executes the file, so it must stay inside scripts/."""
outside = tmp_path / "evil.py"
outside.write_text("raise AssertionError('executed out-of-tree script')")
catalog = scan_skill_catalog()
result = dispatch(catalog, "run_skill_script",
{"name": "pptx", "script": str(outside), "payload": "{}"}, OUT)
assert result.startswith("[error]")
def test_run_skill_script_rejects_parent_traversal(tmp_path):
outside = tmp_path / "evil.py"
outside.write_text("raise AssertionError('executed out-of-tree script')")
catalog = scan_skill_catalog()
scripts_dir = (catalog["pptx"]["dir"] / "scripts").resolve()
rel = os.path.relpath(outside, scripts_dir)
result = dispatch(catalog, "run_skill_script",
{"name": "pptx", "script": rel, "payload": "{}"}, OUT)
assert result.startswith("[error]")
@@ -0,0 +1,31 @@
import tempfile
from pathlib import Path
from generate_pptx import build_presentation
def test_null_bullets_like_omit():
out = Path(tempfile.mkdtemp()) / "out.pptx"
result = build_presentation(
{
"title": "Demo",
"slides": [{"title": "Slide", "bullets": None}],
},
str(out),
)
assert out.exists()
assert result["num_slides"] == 2
assert "Slide" in result["titles"]
def test_missing_bullets_still_works():
out = Path(tempfile.mkdtemp()) / "out.pptx"
result = build_presentation(
{
"title": "Demo",
"slides": [{"title": "Slide"}],
},
str(out),
)
assert out.exists()
assert result["num_slides"] == 2