Initial commit to git.yoin
This commit is contained in:
146
uni-agent/test_servers/agent_protocol_server.py
Normal file
146
uni-agent/test_servers/agent_protocol_server.py
Normal file
@@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Agent Protocol 测试服务器
|
||||
REST API 标准实现
|
||||
"""
|
||||
|
||||
import json
|
||||
import uuid
|
||||
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||
from urllib.parse import urlparse
|
||||
from datetime import datetime
|
||||
|
||||
PORT = 8102
|
||||
|
||||
|
||||
class APHandler(BaseHTTPRequestHandler):
|
||||
|
||||
tasks = {}
|
||||
|
||||
def log_message(self, format, *args):
|
||||
pass
|
||||
|
||||
def send_json(self, data: dict, status: int = 200):
|
||||
body = json.dumps(data, ensure_ascii=False).encode()
|
||||
self.send_response(status)
|
||||
self.send_header("Content-Type", "application/json")
|
||||
self.send_header("Content-Length", len(body))
|
||||
self.end_headers()
|
||||
self.wfile.write(body)
|
||||
|
||||
def do_GET(self):
|
||||
path = urlparse(self.path).path
|
||||
|
||||
if path == "/" or path == "/ap/v1":
|
||||
self.send_json({
|
||||
"name": "Test Agent Protocol Server",
|
||||
"version": "1.0.0",
|
||||
"protocol_version": "v1"
|
||||
})
|
||||
|
||||
elif path == "/ap/v1/agent/tasks":
|
||||
self.send_json({
|
||||
"tasks": list(APHandler.tasks.values())
|
||||
})
|
||||
|
||||
elif path.startswith("/ap/v1/agent/tasks/"):
|
||||
parts = path.split("/")
|
||||
task_id = parts[5] if len(parts) > 5 else ""
|
||||
|
||||
if "/artifacts" in path:
|
||||
if task_id in APHandler.tasks:
|
||||
self.send_json({
|
||||
"artifacts": APHandler.tasks[task_id].get("artifacts", [])
|
||||
})
|
||||
else:
|
||||
self.send_json({"error": "Task not found"}, 404)
|
||||
|
||||
elif "/steps" in path:
|
||||
if task_id in APHandler.tasks:
|
||||
self.send_json({
|
||||
"steps": APHandler.tasks[task_id].get("steps", [])
|
||||
})
|
||||
else:
|
||||
self.send_json({"error": "Task not found"}, 404)
|
||||
|
||||
else:
|
||||
if task_id in APHandler.tasks:
|
||||
self.send_json(APHandler.tasks[task_id])
|
||||
else:
|
||||
self.send_json({"error": "Task not found"}, 404)
|
||||
|
||||
else:
|
||||
self.send_json({"error": "Not found"}, 404)
|
||||
|
||||
def do_POST(self):
|
||||
path = urlparse(self.path).path
|
||||
|
||||
content_length = int(self.headers.get("Content-Length", 0))
|
||||
body = self.rfile.read(content_length)
|
||||
|
||||
try:
|
||||
request = json.loads(body) if body else {}
|
||||
except json.JSONDecodeError:
|
||||
self.send_json({"error": "Invalid JSON"}, 400)
|
||||
return
|
||||
|
||||
if path == "/ap/v1/agent/tasks":
|
||||
task_id = str(uuid.uuid4())
|
||||
task_input = request.get("input", "")
|
||||
|
||||
APHandler.tasks[task_id] = {
|
||||
"task_id": task_id,
|
||||
"input": task_input,
|
||||
"status": "running",
|
||||
"steps": [],
|
||||
"artifacts": [],
|
||||
"created_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
self.send_json(APHandler.tasks[task_id], 201)
|
||||
|
||||
elif path.startswith("/ap/v1/agent/tasks/") and path.endswith("/steps"):
|
||||
parts = path.split("/")
|
||||
task_id = parts[5]
|
||||
|
||||
if task_id not in APHandler.tasks:
|
||||
self.send_json({"error": "Task not found"}, 404)
|
||||
return
|
||||
|
||||
step_input = request.get("input", "")
|
||||
step_id = str(uuid.uuid4())
|
||||
|
||||
step = {
|
||||
"step_id": step_id,
|
||||
"input": step_input,
|
||||
"output": f"Processed: {step_input}" if step_input else "Step executed",
|
||||
"status": "completed",
|
||||
"is_last": True,
|
||||
"created_at": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
APHandler.tasks[task_id]["steps"].append(step)
|
||||
APHandler.tasks[task_id]["status"] = "completed"
|
||||
|
||||
APHandler.tasks[task_id]["artifacts"].append({
|
||||
"artifact_id": str(uuid.uuid4()),
|
||||
"file_name": "output.txt",
|
||||
"relative_path": "/output.txt",
|
||||
"content": step["output"]
|
||||
})
|
||||
|
||||
self.send_json(step, 201)
|
||||
|
||||
else:
|
||||
self.send_json({"error": "Not found"}, 404)
|
||||
|
||||
|
||||
def main():
|
||||
server = HTTPServer(("localhost", PORT), APHandler)
|
||||
print(f"Agent Protocol Test Server running on http://localhost:{PORT}")
|
||||
print(f"API Base: http://localhost:{PORT}/ap/v1")
|
||||
server.serve_forever()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user