Initial commit: kage-research project files

This commit is contained in:
shokollm
2026-04-09 00:39:52 +00:00
commit 71fc8b4495
19 changed files with 5303 additions and 0 deletions

133
pi_agent_tool.py Normal file
View File

@@ -0,0 +1,133 @@
#!/usr/bin/env python3
"""
Pi Agent Tool - Integrate Pi agent with Hermes
This tool allows Hermes to delegate tasks to a Pi agent running
as an HTTP server.
Flow:
Hermes Agent → pi_agent_tool → HTTP Server (Level 4) → Pi Agent
"""
import json
import os
import requests
from typing import Any, Dict, Optional
# Configuration
PI_SERVER_URL = os.environ.get("PI_SERVER_URL", "http://localhost:3000")
PI_TIMEOUT = int(os.environ.get("PI_TIMEOUT", "300"))
def check_pi_requirements() -> bool:
"""Check if Pi server is available."""
try:
response = requests.get(f"{PI_SERVER_URL}/health", timeout=5)
return response.status_code == 200
except Exception:
return False
def pi_agent_tool(
message: str,
context: Optional[str] = None,
max_iterations: Optional[int] = None,
) -> str:
"""
Delegate a task to the Pi agent.
Args:
message: The task/message to send to the Pi agent
context: Optional context to prepend
max_iterations: Max agent turns (optional)
Returns:
The agent's response
"""
# Build the full message with context
full_message = message
if context:
full_message = f"{context}\n\nTask: {message}"
try:
# Call the Pi server
response = requests.post(
f"{PI_SERVER_URL}/message",
json={
"message": full_message,
"max_iterations": max_iterations,
},
timeout=PI_TIMEOUT,
)
if response.status_code == 200:
data = response.json()
return data.get("response", "No response")
else:
return f"Error: Server returned {response.status_code}"
except requests.Timeout:
return "Error: Pi agent timed out"
except requests.ConnectionError:
return "Error: Cannot connect to Pi server. Is it running?"
except Exception as e:
return f"Error: {str(e)}"
# =============================================================================
# OpenAI Function-Calling Schema
# =============================================================================
PI_AGENT_SCHEMA = {
"name": "pi_agent",
"description": (
"Delegate a coding task to the Pi agent. "
"Use this for: "
"1. Complex multi-step tasks "
"2. Tasks requiring file operations "
"3. Tasks requiring shell commands "
"4. Research or investigation tasks "
"The Pi agent has access to terminal, file operations, and web search.\n\n"
"Returns the agent's full response."
),
"parameters": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "The task or question to delegate to the Pi agent"
},
"context": {
"type": "string",
"description": (
"Optional context to provide to the agent. "
"Include relevant files, code snippets, or background info."
)
},
"max_iterations": {
"type": "integer",
"description": "Maximum number of agent turns (default: 50)"
}
},
"required": ["message"]
}
}
# =============================================================================
# Registry
# =============================================================================
from tools.registry import registry, tool_error
registry.register(
name="pi_agent",
toolset="pi_agent",
schema=PI_AGENT_SCHEMA,
handler=lambda args, **kw: pi_agent_tool(
message=args.get("message"),
context=args.get("context"),
max_iterations=args.get("max_iterations"),
),
check_fn=check_pi_requirements,
emoji="🤖",
)