核心组件: - Orchestrator: 意图理解、任务拆分、竞标管理、结果验证 - Worker: 竞标任务、执行交付 - TaskBoard: 状态管理、信息存储 - BidEvaluator: 竞标评估算法 - ExecutionMonitor: 执行监控、超时处理 - LLMClient: 大模型接口调用 功能特性: - 竞标机制:Agent主动竞争任务 - 动态调度:串行/并行任务智能调度 - 智能容错:超时切换、验证重试 - 质量保证:结果验证、历史追踪 Web界面:首页、请求列表、任务列表、Agent管理 API接口:请求/任务/Agent管理、测试接口 端口:19015
155 lines
4.4 KiB
Python
155 lines
4.4 KiB
Python
"""
|
||
竞标评估器 - 评估Agent竞标,选择最佳执行者
|
||
"""
|
||
|
||
from typing import Dict, List
|
||
from .models import Bid, Task, AgentProfile
|
||
|
||
|
||
class BidEvaluator:
|
||
"""竞标评估器"""
|
||
|
||
def __init__(self):
|
||
self.weights = {
|
||
'capability': 0.3, # 能力匹配度
|
||
'confidence': 0.2, # 自信度
|
||
'time_efficiency': 0.2, # 时间效率
|
||
'approach_quality': 0.2, # 方案质量
|
||
'historical': 0.1 # 历史表现
|
||
}
|
||
|
||
def evaluate_bid(self, bid: Bid, agent: AgentProfile, max_time: int = 300) -> float:
|
||
"""
|
||
评估单个竞标
|
||
|
||
Args:
|
||
bid: 竞标书
|
||
agent: Agent档案
|
||
max_time: 最大可接受时间
|
||
|
||
Returns:
|
||
综合得分 0-1
|
||
"""
|
||
scores = {}
|
||
|
||
# 1. 能力匹配度
|
||
scores['capability'] = bid.capability_match
|
||
|
||
# 2. 自信度
|
||
scores['confidence'] = bid.confidence
|
||
|
||
# 3. 时间效率(时间越短得分越高)
|
||
scores['time_efficiency'] = max(0, 1 - bid.estimated_time / max_time)
|
||
|
||
# 4. 方案质量
|
||
scores['approach_quality'] = self._rate_approach(bid.approach)
|
||
|
||
# 5. 历史表现
|
||
scores['historical'] = agent.success_rate
|
||
|
||
# 加权求和
|
||
final_score = sum(
|
||
self.weights[k] * v
|
||
for k, v in scores.items()
|
||
)
|
||
|
||
return final_score
|
||
|
||
def _rate_approach(self, approach: str) -> float:
|
||
"""评估方案质量"""
|
||
score = 0.5
|
||
|
||
# 有备选方案加分
|
||
if '备选' in approach or 'alternative' in approach.lower():
|
||
score += 0.1
|
||
|
||
# 有错误处理加分
|
||
if '错误' in approach or '异常' in approach or 'error' in approach.lower():
|
||
score += 0.1
|
||
|
||
# 有详细描述加分
|
||
if len(approach) > 100:
|
||
score += 0.1
|
||
|
||
# 有步骤分解加分
|
||
if '步骤' in approach or 'step' in approach.lower():
|
||
score += 0.1
|
||
|
||
return min(score, 1.0)
|
||
|
||
def select_best_bid(
|
||
self,
|
||
bids: List[Bid],
|
||
agents: Dict[str, AgentProfile]
|
||
) -> tuple:
|
||
"""
|
||
选择最佳竞标
|
||
|
||
Args:
|
||
bids: 竞标列表
|
||
agents: Agent档案字典
|
||
|
||
Returns:
|
||
(best_bid, best_agent, scores_dict)
|
||
"""
|
||
if not bids:
|
||
return (None, None, {})
|
||
|
||
scores = {}
|
||
|
||
for bid in bids:
|
||
agent = agents.get(bid.agent_id)
|
||
if agent:
|
||
score = self.evaluate_bid(bid, agent)
|
||
scores[bid.id] = {
|
||
'score': score,
|
||
'bid': bid,
|
||
'agent': agent,
|
||
'details': {
|
||
'capability': bid.capability_match,
|
||
'confidence': bid.confidence,
|
||
'time_efficiency': max(0, 1 - bid.estimated_time / 300),
|
||
'approach_quality': self._rate_approach(bid.approach),
|
||
'historical': agent.success_rate
|
||
}
|
||
}
|
||
|
||
if not scores:
|
||
return (None, None, {})
|
||
|
||
# 找最高分
|
||
best_bid_id = max(scores.keys(), key=lambda k: scores[k]['score'])
|
||
best = scores[best_bid_id]
|
||
|
||
return (best['bid'], best['agent'], scores)
|
||
|
||
def get_backup_agents(
|
||
self,
|
||
bids: List[Bid],
|
||
agents: Dict[str, AgentProfile],
|
||
selected_agent_id: str
|
||
) -> List[AgentProfile]:
|
||
"""
|
||
获取备选Agent列表(按得分排序)
|
||
|
||
Args:
|
||
bids: 竞标列表
|
||
agents: Agent档案字典
|
||
selected_agent_id: 已选择的AgentID
|
||
|
||
Returns:
|
||
备选Agent列表
|
||
"""
|
||
backup = []
|
||
|
||
for bid in bids:
|
||
if bid.agent_id != selected_agent_id:
|
||
agent = agents.get(bid.agent_id)
|
||
if agent:
|
||
score = self.evaluate_bid(bid, agent)
|
||
backup.append((agent, score))
|
||
|
||
# 按得分降序排序
|
||
backup.sort(key=lambda x: x[1], reverse=True)
|
||
|
||
return [a for a, s in backup] |