devtu-fix-tool
npx skills add https://github.com/mims-harvard/tooluniverse --skill devtu-fix-tool
Agent 安装分布
Skill 文档
Fix ToolUniverse Tools
Diagnose and fix failing ToolUniverse tools through systematic error identification, targeted fixes, and validation.
Instructions
When fixing a failing tool:
- Run targeted test to identify error:
python scripts/test_new_tools.py <tool-pattern> -v
-
Verify API is correct – search online for official API documentation to confirm endpoints, parameters, and patterns are correct
-
Identify error type (see Error Types section)
-
Apply appropriate fix based on error pattern
-
Regenerate tools if you modified JSON configs or tool classes:
python -m tooluniverse.generate_tools
- Check and update unit tests if they exist in
tests/unit/:
ls tests/unit/test_<tool-name>_tool.py
-
Verify fix by re-running both integration and unit tests
-
Provide fix summary with problem, root cause, solution, and test results
Where to Fix
| Issue Type | File to Modify |
|---|---|
| Binary response | src/tooluniverse/*_tool.py + src/tooluniverse/data/*_tools.json |
| Schema mismatch | src/tooluniverse/data/*_tools.json (return_schema) |
| Missing data wrapper | src/tooluniverse/*_tool.py (operation methods) |
| Endpoint URL | src/tooluniverse/data/*_tools.json (endpoint field) |
| Invalid test example | src/tooluniverse/data/*_tools.json (test_examples) |
| Unit test updates | tests/unit/test_*_tool.py (if exists) |
| API key as parameter | src/tooluniverse/data/*_tools.json (remove param) + *_tool.py (use env var) |
| Tool not loading (optional key) | src/tooluniverse/data/*_tools.json (use optional_api_keys not required_api_keys) |
Error Types
1. JSON Parsing Errors
Symptom: Expecting value: line 1 column 1 (char 0)
Cause: Tool expects JSON but receives binary data (images, PDFs, files)
Fix: Check Content-Type header. For binary responses, return a description string instead of parsing JSON. Update return_schema to {"type": "string"}.
2. Schema Validation Errors
Symptom: Schema Mismatch: At root: ... is not of type 'object' or Data: None
Cause: Missing data field wrapper OR wrong schema type
Fix depends on the error:
- If
Data: Noneâ Adddatawrapper to ALL operation methods (see Multi-Operation Pattern below) - If type mismatch â Update
return_schemain JSON config:- Data is string:
{"type": "string"} - Data is array:
{"type": "array", "items": {...}} - Data is object:
{"type": "object", "properties": {...}}
- Data is string:
Key concept: Schema validates the data field content, NOT the full response.
3. Nullable Field Errors
Symptom: Schema Mismatch: At N->fieldName: None is not of type 'integer'
Cause: API returns None/null for optional fields
Fix: Allow nullable types in JSON config using {"type": ["<base_type>", "null"]}. Use for optional fields, not required identifiers.
4. Mixed Type Field Errors
Symptom: Schema Mismatch: At N->field: {object} is not of type 'string', 'null'
Cause: Field returns different structures depending on context
Fix: Use oneOf in JSON config for fields with multiple distinct schemas. Different from nullable ({"type": ["string", "null"]}) which is same base type + null.
5. Invalid Test Examples
Symptom: 404 ERROR - Not found or 400 Bad Request
Cause: Test example uses invalid/outdated IDs
Fix: Discover valid examples using the List â Get or Search â Details patterns below.
6. API Parameter Errors
Symptom: 400 Bad Request or parameter validation errors
Fix: Update parameter schema in JSON config with correct types, required fields, and enums.
7. API Key Configuration Errors
Symptom: Tool not loading when API key is optional, or api_key parameter causing confusion
Cause: Using required_api_keys for keys that should be optional, or exposing API key as tool parameter
Key differences:
required_api_keys: Tool is skipped if keys are missingoptional_api_keys: Tool loads and works without keys (with reduced performance)
Fix: Use optional_api_keys in JSON config for APIs that work anonymously but have better rate limits with keys. Read API key from environment only (os.environ.get()), never as a tool parameter.
8. API Endpoint Pattern Errors
Symptom: 404 for valid resources, or unexpected results
Fix: Verify official API docs – check if values belong in URL path vs query parameters.
9. Transient API Failures
Symptom: Tests fail intermittently with timeout/connection/5xx errors
Fix: Use pytest.skip() for transient errors in unit tests – don’t fail on external API outages.
Common Fix Patterns
Schema Validation Pattern
Schema validates the data field content, not the full response. Match return_schema type to what’s inside data (array, object, or string).
Multi-Operation Tool Pattern
Every internal method must return {"status": "...", "data": {...}}. Don’t use alternative field names at top level.
Finding Valid Test Examples
When test examples fail with 400/404, discover valid IDs by:
- List â Get: Call a list endpoint first, extract ID from results
- Search â Details: Search for a known entity, use returned ID
- Iterate Versions: Try different dataset versions if supported
Unit Test Management
Check for Unit Tests
After fixing a tool, check if unit tests exist:
ls tests/unit/test_<tool-name>_tool.py
When to Update Unit Tests
Update unit tests when you:
- Change return structure: Update assertions checking
result["data"]structure - Add/modify operations: Add test cases for new operations
- Change error handling: Update error assertions
- Modify required parameters: Update parameter validation tests
- Fix schema issues: Ensure tests validate correct data structure
- Add binary handling: Add tests for binary responses
Running Unit Tests
# Run specific tool tests
pytest tests/unit/test_<tool-name>_tool.py -v
# Run all unit tests
pytest tests/unit/ -v
Unit Test Checklist
- Check if
tests/unit/test_<tool-name>_tool.pyexists - Run unit tests before and after fix
- Update assertions if data structure changed
- Ensure both direct and interface tests pass
For detailed unit test patterns and examples, see unit-tests-reference.md.
Verification
Run Integration Tests
python scripts/test_new_tools.py <pattern> -v
Run Unit Tests (if exist)
pytest tests/unit/test_<tool-name>_tool.py -v
Regenerate Tools
After modifying JSON configs or tool classes:
python -m tooluniverse.generate_tools
Regenerate after:
- Changing
src/tooluniverse/data/*_tools.jsonfiles - Modifying tool class implementations
Not needed for test script changes.
Output Format
After fixing, provide this summary:
Problem: [Brief description]
Root Cause: [Why it failed]
Solution: [What was changed]
Changes Made:
- File 1: [Description]
- File 2: [Description]
- File 3 (if applicable): [Unit test updates]
Integration Test Results:
- Before: X tests, Y passed (Z%), N failed, M schema invalid
- After: X tests, X passed (100.0%), 0 failed, 0 schema invalid
Unit Test Results (if applicable):
- Before: X tests, Y passed, Z failed
- After: X tests, X passed, 0 failed
Common Pitfalls
- Schema validates
datafield, not full response - All methods need
{"status": "...", "data": {...}}wrapper - JSON config changes require regeneration
- Use
optional_api_keysfor APIs that work without keys - Check official API docs for correct endpoint patterns
- Unit tests should skip on transient API failures, not fail
Debugging
- Inspect API response: Check status code, Content-Type header, and body preview
- Check tool config: Load ToolUniverse and inspect the tool’s configuration
- Add debug prints: Log URL, params, status, and Content-Type in the run method
Quick Reference
| Task | Command |
|---|---|
| Run integration tests | python scripts/test_new_tools.py <pattern> -v |
| Run unit tests | pytest tests/unit/test_<tool-name>_tool.py -v |
| Check if unit tests exist | ls tests/unit/test_<tool-name>_tool.py |
| Regenerate tools | python -m tooluniverse.generate_tools |
| Check status | git status --short | grep -E "(data|tools|.*_tool.py|tests/unit)" |
| Error Type | Fix Location |
|---|---|
| JSON parse error | src/tooluniverse/*_tool.py run() method |
| Schema mismatch | src/tooluniverse/data/*_tools.json return_schema |
| 404 errors | src/tooluniverse/data/*_tools.json test_examples or endpoint |
| Parameter errors | src/tooluniverse/data/*_tools.json parameter schema |
| Unit test failures | tests/unit/test_*_tool.py assertions |
| Tool skipped (optional key) | src/tooluniverse/data/*_tools.json use optional_api_keys |
| API key as parameter | Remove from JSON params, use os.environ.get() in Python |