feat(tools): Phase T.1-T.4 complete - manifest system, registry, implementations, runtime, collaboration, scheduler
This commit is contained in:
90
backend/app/tools/description.py
Normal file
90
backend/app/tools/description.py
Normal file
@@ -0,0 +1,90 @@
|
||||
"""
|
||||
Tool Description Generator
|
||||
|
||||
Generates AI-friendly tool descriptions for LLM consumption.
|
||||
"""
|
||||
|
||||
from typing import Dict, List, Any, Optional
|
||||
|
||||
|
||||
def generate_tool_description(manifest: dict) -> str:
|
||||
"""Generate AI-friendly tool description from manifest"""
|
||||
lines = [
|
||||
f"## {manifest.get('display_name', manifest.get('name', 'Unknown'))}",
|
||||
f"{manifest.get('description', 'No description available')}",
|
||||
"",
|
||||
"### Available Commands:",
|
||||
]
|
||||
|
||||
commands = manifest.get("commands", [])
|
||||
if not commands:
|
||||
return "\n".join(lines[:-2]) # Remove the "Available Commands" line
|
||||
|
||||
for cmd in commands:
|
||||
lines.append(f"#### {cmd.get('name', 'unnamed')}")
|
||||
lines.append(cmd.get("description", "No description"))
|
||||
lines.append("")
|
||||
|
||||
if cmd.get("example"):
|
||||
lines.append("**Example:**")
|
||||
lines.append(f"```\n{cmd['example']}\n```")
|
||||
lines.append("")
|
||||
|
||||
parameters = cmd.get("parameters", {})
|
||||
if parameters:
|
||||
lines.append("**Parameters:**")
|
||||
props = parameters.get("properties", {})
|
||||
for param_name, param_info in props.items():
|
||||
param_type = param_info.get("type", "any")
|
||||
param_desc = param_info.get("description", "")
|
||||
lines.append(f"- `{param_name}` ({param_type}): {param_desc}")
|
||||
lines.append("")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def generate_tools_for_llm(registry: Any) -> str:
|
||||
"""Generate tool list for LLM from registry"""
|
||||
import asyncio
|
||||
|
||||
async def _generate():
|
||||
tools = await registry.list_enabled()
|
||||
|
||||
sections = ["## Available Tools\n"]
|
||||
|
||||
for tool in tools:
|
||||
try:
|
||||
manifest_path = f"tools/manifests/{tool.name}.yaml"
|
||||
import yaml
|
||||
from pathlib import Path
|
||||
|
||||
manifest_file = Path(__file__).parent / "manifests" / f"{tool.name}.yaml"
|
||||
if manifest_file.exists():
|
||||
with open(manifest_file, encoding="utf-8") as f:
|
||||
manifest_data = yaml.safe_load(f)
|
||||
sections.append(generate_tool_description(manifest_data))
|
||||
else:
|
||||
sections.append(f"## {tool.display_name}\n{tool.description}\n")
|
||||
sections.append("\n---\n")
|
||||
except Exception:
|
||||
sections.append(f"## {tool.display_name}\n{tool.description}\n")
|
||||
sections.append("\n---\n")
|
||||
|
||||
return "\n".join(sections)
|
||||
|
||||
return asyncio.get_event_loop().run_until_complete(_generate())
|
||||
|
||||
|
||||
def generate_command_reference(manifest: dict) -> str:
|
||||
"""Generate compact command reference for quick lookup"""
|
||||
commands = manifest.get("commands", [])
|
||||
lines = [f"### {manifest.get('name', 'tool')} Commands\n"]
|
||||
|
||||
for cmd in commands:
|
||||
params = cmd.get("parameters", {}).get("required", [])
|
||||
param_str = ", ".join(params) if params else ""
|
||||
lines.append(
|
||||
f"- `{cmd.get('name', 'cmd')}({param_str})`: {cmd.get('description', '')[:50]}..."
|
||||
)
|
||||
|
||||
return "\n".join(lines)
|
||||
Reference in New Issue
Block a user