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,104 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test script for the read_file tool with offset and size parameters
|
||||
"""
|
||||
|
||||
from agent import LocalFileTools
|
||||
|
||||
def test_file_range_reading():
|
||||
"""Test reading files with offset and size parameters"""
|
||||
|
||||
print("🧪 Testing File Range Reading")
|
||||
print("="*60)
|
||||
|
||||
# Initialize tools
|
||||
tools = LocalFileTools(root_dir="../..")
|
||||
|
||||
# Test file
|
||||
test_file = "chapter1/context/agent.py"
|
||||
|
||||
# Test 1: Read first 10 lines
|
||||
print("\n1️⃣ Reading first 10 lines:")
|
||||
result = tools.read_file(test_file, offset=0, size=10)
|
||||
if result["success"]:
|
||||
print(f" ✓ Read {result['lines_read']} lines from total {result['total_lines']}")
|
||||
print(f" Range: lines {result['offset']}-{result['end_line']}")
|
||||
print(f" First line: {result['content'].split(chr(10))[0][:50]}...")
|
||||
else:
|
||||
print(f" ✗ Error: {result['error']}")
|
||||
|
||||
# Test 2: Read lines 100-110
|
||||
print("\n2️⃣ Reading lines 100-110:")
|
||||
result = tools.read_file(test_file, offset=100, size=10)
|
||||
if result["success"]:
|
||||
print(f" ✓ Read {result['lines_read']} lines")
|
||||
print(f" Range: lines {result['offset']}-{result['end_line']}")
|
||||
lines = result['content'].split('\n')
|
||||
if lines:
|
||||
print(f" Sample: {lines[0][:60]}...")
|
||||
else:
|
||||
print(f" ✗ Error: {result['error']}")
|
||||
|
||||
# Test 3: Read from offset 250 with size 500 (as specified)
|
||||
print("\n3️⃣ Reading from offset 250, size 500:")
|
||||
result = tools.read_file(test_file, offset=250, size=500)
|
||||
if result["success"]:
|
||||
print(f" ✓ Read {result['lines_read']} lines")
|
||||
print(f" Range: lines {result['offset']}-{result['end_line']}")
|
||||
print(f" Total file has {result['total_lines']} lines")
|
||||
else:
|
||||
print(f" ✗ Error: {result['error']}")
|
||||
|
||||
# Test 4: Read without size (from offset to end)
|
||||
print("\n4️⃣ Reading from offset 700 to end:")
|
||||
result = tools.read_file(test_file, offset=700)
|
||||
if result["success"]:
|
||||
print(f" ✓ Read {result['lines_read']} lines")
|
||||
print(f" Range: lines {result['offset']}-{result['end_line']}")
|
||||
else:
|
||||
print(f" ✗ Error: {result['error']}")
|
||||
|
||||
# Test 5: Offset beyond file length
|
||||
print("\n5️⃣ Testing offset beyond file length:")
|
||||
result = tools.read_file(test_file, offset=10000, size=10)
|
||||
if result["success"]:
|
||||
print(f" ✓ Handled gracefully: {result.get('message', 'No error')}")
|
||||
print(f" Lines read: {result['lines_read']}")
|
||||
else:
|
||||
print(f" Result: {result}")
|
||||
|
||||
# Test 6: Read entire file (no offset, no size)
|
||||
print("\n6️⃣ Reading entire file (default behavior):")
|
||||
result = tools.read_file("chapter1/context/README.md")
|
||||
if result["success"]:
|
||||
print(f" ✓ Read entire file")
|
||||
print(f" Total lines: {result['total_lines']}")
|
||||
print(f" Lines read: {result['lines_read']}")
|
||||
print(f" Truncated: {result.get('truncated', False)}")
|
||||
else:
|
||||
print(f" ✗ Error: {result['error']}")
|
||||
|
||||
# Test 7: Compare with limit parameter (the user's original request)
|
||||
print("\n7️⃣ API-style usage (offset=250, size=500):")
|
||||
result = tools.read_file("chapter2/local_llm_serving/main.py", offset=250, size=500)
|
||||
if result["success"]:
|
||||
print(f" ✓ Successfully read lines {result['offset']}-{result['end_line']}")
|
||||
print(f" Lines read: {result['lines_read']}")
|
||||
print(f" File has {result['total_lines']} total lines")
|
||||
|
||||
# Show a sample of the content
|
||||
lines = result['content'].split('\n')[:3]
|
||||
print("\n First 3 lines of content:")
|
||||
for i, line in enumerate(lines):
|
||||
print(f" Line {250+i}: {line[:60]}..." if len(line) > 60 else f" Line {250+i}: {line}")
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("✅ File range reading tests complete!")
|
||||
print("\nThe read_file tool now supports:")
|
||||
print(" • offset: Starting line number (0-based)")
|
||||
print(" • size: Number of lines to read")
|
||||
print(" • Handles edge cases gracefully")
|
||||
print(" • Maintains security boundaries")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_file_range_reading()
|
||||
Reference in New Issue
Block a user