Files
multi-agent-bidding/app/app.py

262 lines
6.4 KiB
Python

"""
多智能体竞标调度系统 - Web应用
"""
from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
import json
import time
from .models import AgentProfile, TaskStatus
from .task_board import TaskBoard
from .orchestrator import Orchestrator
from .worker import WorkerPool, create_default_workers
from .llm_client import LLMClient
import os
template_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'templates')
app = Flask(__name__, template_folder=template_dir)
CORS(app)
# 初始化组件
task_board = TaskBoard()
llm_client = LLMClient(
base_url="http://192.168.2.17:19007/v1",
api_key="xxxx",
model="auto"
)
orchestrator = Orchestrator(task_board, llm_client)
worker_pool = create_default_workers(task_board, llm_client)
# === Web页面 ===
@app.route('/')
def index():
"""首页"""
return render_template('index.html')
@app.route('/requests')
def requests_page():
"""请求列表页"""
return render_template('requests.html')
@app.route('/tasks')
def tasks_page():
"""任务列表页"""
return render_template('tasks.html')
@app.route('/agents')
def agents_page():
"""Agent列表页"""
return render_template('agents.html')
# === API ===
@app.route('/api/request', methods=['POST'])
def create_request():
"""
创建用户请求
Body: {"content": "用户请求内容"}
"""
data = request.get_json()
content = data.get('content', '')
if not content:
return jsonify({'error': '请提供请求内容'}), 400
# 处理请求
result = orchestrator.process_request(content)
return jsonify(result.to_dict())
@app.route('/api/request/<request_id>')
def get_request(request_id):
"""获取请求详情"""
req = task_board.get_request(request_id)
if req:
return jsonify(req.to_dict())
return jsonify({'error': '请求不存在'}), 404
@app.route('/api/requests')
def list_requests():
"""列出请求"""
limit = int(request.args.get('limit', 50))
requests = task_board.list_requests(limit)
return jsonify([r.to_dict() for r in requests])
@app.route('/api/tasks')
def list_tasks():
"""列出任务"""
limit = int(request.args.get('limit', 100))
tasks = task_board.list_tasks(limit)
return jsonify([t.to_dict() for t in tasks])
@app.route('/api/task/<task_id>')
def get_task(task_id):
"""获取任务详情"""
task = task_board.get_task(task_id)
if task:
task_dict = task.to_dict()
# 添加竞标和尝试记录
task_dict['bids'] = [b.to_dict() for b in task_board.get_bids(task_id)]
task_dict['attempts'] = [a.to_dict() for a in task_board.get_attempts(task_id)]
return jsonify(task_dict)
return jsonify({'error': '任务不存在'}), 404
@app.route('/api/agents')
def list_agents():
"""列出Agent"""
agents = task_board.list_agents()
return jsonify([a.to_dict() for a in agents])
@app.route('/api/agent', methods=['POST'])
def register_agent():
"""
注册Agent
Body: {"id": "...", "name": "...", "capabilities": [...]}
"""
data = request.get_json()
agent = AgentProfile(
id=data.get('id', ''),
name=data.get('name', ''),
description=data.get('description', ''),
capabilities=data.get('capabilities', []),
max_concurrent_tasks=data.get('max_concurrent_tasks', 1),
preferred_task_types=data.get('preferred_task_types', [])
)
if not agent.id:
return jsonify({'error': '请提供Agent ID'}), 400
task_board.register_agent(agent)
return jsonify(agent.to_dict())
@app.route('/api/agent/<agent_id>', methods=['DELETE'])
def unregister_agent(agent_id):
"""注销Agent"""
task_board.unregister_agent(agent_id)
return jsonify({'success': True})
@app.route('/api/stats')
def get_stats():
"""获取统计信息"""
stats = task_board.get_stats()
stats['active_executions'] = orchestrator.execution_manager.get_active_count()
return jsonify(stats)
# === 快速测试 ===
@app.route('/api/test', methods=['POST'])
def test_execution():
"""
快速测试
Body: {"prompt": "测试内容"}
"""
data = request.get_json()
prompt = data.get('prompt', '你好,请介绍一下你自己')
try:
response = llm_client.simple_chat(prompt)
return jsonify({
'success': True,
'response': response
})
except Exception as e:
return jsonify({
'success': False,
'error': str(e)
}), 500
@app.route('/api/test_intent', methods=['POST'])
def test_intent():
"""
测试意图分析
Body: {"prompt": "帮我写一个Python爬虫"}
"""
data = request.get_json()
prompt = data.get('prompt', '')
try:
intent = llm_client.analyze_intent(prompt)
return jsonify({
'success': True,
'intent': intent
})
except Exception as e:
return jsonify({
'success': False,
'error': str(e)
}), 500
@app.route('/api/test_split', methods=['POST'])
def test_split():
"""
测试任务拆分
Body: {"prompt": "..."}
"""
data = request.get_json()
prompt = data.get('prompt', '')
try:
intent = llm_client.analyze_intent(prompt)
tasks = llm_client.split_tasks(intent, prompt)
return jsonify({
'success': True,
'intent': intent,
'tasks': tasks
})
except Exception as e:
return jsonify({
'success': False,
'error': str(e)
}), 500
def main():
"""启动应用"""
import argparse
parser = argparse.ArgumentParser(description='多智能体竞标调度系统')
parser.add_argument('--port', type=int, default=19015, help='服务端口')
parser.add_argument('--host', type=str, default='0.0.0.0', help='服务地址')
parser.add_argument('--debug', action='store_true', help='调试模式')
args = parser.parse_args()
print(f"启动多智能体竞标调度系统...")
print(f"端口: {args.port}")
print(f"LLM接口: {llm_client.base_url}")
print(f"默认Agent数量: {len(worker_pool.list_workers())}")
app.run(
host=args.host,
port=args.port,
debug=args.debug
)
if __name__ == '__main__':
main()