uskybox commited on
Commit
a254955
·
verified ·
1 Parent(s): 0f196cb

Update werewolf/villager/villager_agent.py

Browse files
Files changed (1) hide show
  1. werewolf/villager/villager_agent.py +53 -109
werewolf/villager/villager_agent.py CHANGED
@@ -9,153 +9,97 @@ from agent_build_sdk.utils.logger import logger
9
  from agent_build_sdk.sdk.role_agent import BasicRoleAgent
10
  from agent_build_sdk.sdk.agent import format_prompt
11
 
12
-
13
  class VillagerAgent(BasicRoleAgent):
14
  """平民角色Agent"""
15
 
16
  def __init__(self, model_name):
17
  super().__init__(ROLE_VILLAGER, model_name=model_name)
18
 
19
- def perceive(self, req=AgentReq):
 
20
  if req.status == STATUS_START:
21
  self.memory.clear()
22
- self.memory.set_variable("name", req.name)
 
23
  self.memory.append_history(GAME_RULE_PROMPT)
24
- self.memory.append_history("主持人:你好,你分配到的角色是[平民], 你是" + req.name)
25
  elif req.status == STATUS_NIGHT:
26
  self.memory.append_history("主持人:现在进入夜晚,天黑请闭眼")
27
  elif req.status == STATUS_NIGHT_INFO:
28
  self.memory.append_history(f"主持人:天亮了!昨天晚上的信息是: {req.message}")
29
- elif req.status == STATUS_DISCUSS: # 发言环节
30
  if req.name:
31
- # 可以使用模型来过滤掉玩家的注入消息,也可以换一个小模型,实际使用需要考虑对memory加锁,避免interact的时候丢失消息
32
- # clean_user_message_prompt = format_prompt(CLEAN_USER_PROMPT, {"user_message": req.message})
33
- # req.message = self.llm_caller(clean_user_message_prompt)
34
- self.memory.append_history(req.name + ': ' + req.message)
35
  else:
36
- # 主持人发言
37
- self.memory.append_history('主持人: 现在进入第{}天。'.format(str(req.round)))
38
- self.memory.append_history('主持人: 每个玩家描述自己的信息。')
39
- self.memory.append_history("---------------------------------------------")
40
- elif req.status == STATUS_VOTE: # 投票环节
41
- self.memory.append_history(f'第{req.round}天的投票环节,{req.name} 投了 {req.message}')
42
- elif req.status == STATUS_VOTE_RESULT: # 投票结果
43
  out_player = req.name if req.name else req.message
44
- if out_player:
45
- self.memory.append_history('主持人: 投票结果是:{}。'.format(out_player))
46
- else:
47
- self.memory.append_history('主持人: 无人出局。')
48
- elif req.status == STATUS_SHERIFF_ELECTION: # 警长竞选
49
- self.memory.append_history("主持人: 上警玩家: " + req.message)
50
- elif req.status == STATUS_SHERIFF_SPEECH: # 警长发言
51
- self.memory.append_history(req.name + " (警上发言): " + req.message)
52
- elif req.status == STATUS_SHERIFF_VOTE: # 警长投票
53
- self.memory.append_history("警上投票: " + req.name + "投了" + req.message)
54
- elif req.status == STATUS_SHERIFF: # 警长结果
55
- if req.name:
56
- self.memory.append_history("主持人: 警徽归属: " + req.name)
57
- self.memory.set_variable("sheriff", req.name)
58
- if req.message:
59
- self.memory.append_history(req.message)
60
  elif req.status == STATUS_RESULT:
61
  self.memory.append_history(req.message)
62
- elif req.status == STATUS_HUNTER:
63
- self.memory.append_history("猎人/狼王是:" + req.name + ",他正在发动技能,选择开枪")
64
- elif req.status == STATUS_HUNTER_RESULT:
65
- if req.message:
66
- self.memory.append_history("猎人/狼王是:" + req.name + ",他开枪带走了" + req.message)
67
- else:
68
- self.memory.append_history("猎人/狼王是:" + req.name + ",他没有带走任何人")
69
- elif req.status == STATUS_SHERIFF_SPEECH_ORDER:
70
- if "小号" in req.message:
71
- self.memory.append_history("主持人: 警长发言顺序是小号优先")
72
- else:
73
- self.memory.append_history("主持人: 警长发言顺序是大号优先")
74
- elif req.status == STATUS_SHERIFF_PK:
75
- self.memory.append_history(f"警长PK发言: {req.name}: {req.message}")
76
- else:
77
- raise NotImplementedError
78
- pass
79
 
80
- def interact(self, req=AgentReq) -> AgentResp:
 
 
 
 
 
 
 
 
 
 
 
 
81
  logger.info("VillagerAgent interact: {}".format(req))
 
 
 
 
 
82
  if req.status == STATUS_DISCUSS:
83
  if req.message:
84
  self.memory.append_history(req.message)
85
- prompt = format_prompt(DESC_PROMPT,
86
- {"name": self.memory.load_variable("name"),
87
- "history": "\n".join(self.memory.load_history())
88
- })
89
- logger.info("prompt:" + prompt)
90
  result = self.llm_caller(prompt)
91
- logger.info("VillagerAgent interact result: {}".format(result))
92
- return AgentResp(success=True, result=result, errMsg=None)
93
 
94
  elif req.status == STATUS_VOTE:
95
- self.memory.append_history('主持人: 到了投票的时候了。每个人,请指向你认为可能是狼人的人。')
96
- choices = [name for name in req.message.split(",") if name != self.memory.load_variable("name")] # 排除自己
97
- self.memory.set_variable("choices", choices)
98
- prompt = format_prompt(VOTE_PROMPT, {"name": self.memory.load_variable("name"),
99
- "choices": choices,
100
- "history": "\n".join(self.memory.load_history())
101
- })
102
- logger.info("prompt:" + prompt)
103
  result = self.llm_caller(prompt)
104
- logger.info("interact result: {}".format(result))
105
- return AgentResp(success=True, result=result, errMsg=None)
106
 
107
  elif req.status == STATUS_SHERIFF_ELECTION:
108
- prompt = format_prompt(SHERIFF_ELECTION_PROMPT, {"name": self.memory.load_variable("name"),
109
- "history": "\n".join(self.memory.load_history())})
110
- logger.info("prompt:" + prompt)
111
  result = self.llm_caller(prompt)
112
- logger.info("VillagerAgent sheriff election result: {}".format(result))
113
- return AgentResp(success=True, result=result, errMsg=None)
114
 
115
- elif req.status == STATUS_SHERIFF_SPEECH:
116
- prompt = format_prompt(SHERIFF_SPEECH_PROMPT, {"name": self.memory.load_variable("name"),
117
- "history": "\n".join(self.memory.load_history())})
118
- logger.info("prompt:" + prompt)
119
  result = self.llm_caller(prompt)
120
- logger.info("VillagerAgent sheriff speech result: {}".format(result))
121
- return AgentResp(success=True, result=result, errMsg=None)
122
-
123
- elif req.status == STATUS_SHERIFF_PK:
124
- prompt = format_prompt(SHERIFF_SPEECH_PROMPT, {"name": self.memory.load_variable("name"),
125
- "history": "\n".join(self.memory.load_history())})
126
- logger.info("prompt:" + prompt)
127
- result = self.llm_caller(prompt)
128
- logger.info("VillagerAgent sheriff pk result: {}".format(result))
129
- return AgentResp(success=True, result=result, errMsg=None)
130
 
131
  elif req.status == STATUS_SHERIFF_VOTE:
132
- choices = [name for name in req.message.split(",")]
133
- prompt = format_prompt(SHERIFF_VOTE_PROMPT, {"name": self.memory.load_variable("name"),
134
- "choices": choices,
135
- "history": "\n".join(self.memory.load_history())})
136
- logger.info("prompt:" + prompt)
137
  result = self.llm_caller(prompt)
138
- logger.info("VillagerAgent sheriff vote result: {}".format(result))
139
- return AgentResp(success=True, result=result, errMsg=None)
140
 
141
  elif req.status == STATUS_SHERIFF_SPEECH_ORDER:
142
- prompt = format_prompt(SHERIFF_SPEECH_ORDER_PROMPT, {"name": self.memory.load_variable("name"),
143
- "history": "\n".join(self.memory.load_history())})
144
- logger.info("prompt:" + prompt)
145
  result = self.llm_caller(prompt)
146
- logger.info("VillagerAgent sheriff speech order result: {}".format(result))
147
- return AgentResp(success=True, result=result, errMsg=None)
148
 
149
  elif req.status == STATUS_SHERIFF:
150
- # 警长转移警徽
151
- choices = [name for name in req.message.split(",") if name != self.memory.load_variable("name")] # 排除自己
152
- prompt = format_prompt(SHERIFF_TRANSFER_PROMPT, {"name": self.memory.load_variable("name"),
153
- "choices": choices,
154
- "history": "\n".join(self.memory.load_history())})
155
- logger.info("prompt:" + prompt)
156
  result = self.llm_caller(prompt)
157
- logger.info("VillagerAgent sheriff transfer result: {}".format(result))
158
- return AgentResp(success=True, result=result, errMsg=None)
159
- else:
160
- raise NotImplementedError
161
- pass
 
9
  from agent_build_sdk.sdk.role_agent import BasicRoleAgent
10
  from agent_build_sdk.sdk.agent import format_prompt
11
 
 
12
  class VillagerAgent(BasicRoleAgent):
13
  """平民角色Agent"""
14
 
15
  def __init__(self, model_name):
16
  super().__init__(ROLE_VILLAGER, model_name=model_name)
17
 
18
+ def perceive(self, req: AgentReq):
19
+ # 移除默认 raise NotImplementedError,改为 return,防止因为收到不属于自己的状态(如技能请求)而崩溃
20
  if req.status == STATUS_START:
21
  self.memory.clear()
22
+ name = req.name if req.name else "村民"
23
+ self.memory.set_variable("name", name)
24
  self.memory.append_history(GAME_RULE_PROMPT)
25
+ self.memory.append_history(f"主持人:你好,你分配到的角色是[平民],你是{name}")
26
  elif req.status == STATUS_NIGHT:
27
  self.memory.append_history("主持人:现在进入夜晚,天黑请闭眼")
28
  elif req.status == STATUS_NIGHT_INFO:
29
  self.memory.append_history(f"主持人:天亮了!昨天晚上的信息是: {req.message}")
30
+ elif req.status == STATUS_DISCUSS:
31
  if req.name:
32
+ self.memory.append_history(f"{req.name}: {req.message}")
 
 
 
33
  else:
34
+ self.memory.append_history(f"主持人: 现在进入第{req.round}天,每个玩家描述自己的信息。")
35
+ elif req.status == STATUS_VOTE:
36
+ self.memory.append_history(f"第{req.round}天的投票环节,{req.name} 投了 {req.message}")
37
+ elif req.status == STATUS_VOTE_RESULT:
 
 
 
38
  out_player = req.name if req.name else req.message
39
+ self.memory.append_history(f"主持人: 投票结果是:{out_player if out_player else '无人出局'}。")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  elif req.status == STATUS_RESULT:
41
  self.memory.append_history(req.message)
42
+ # 其他状态不处理也不要报错
43
+ return
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
+ def get_my_name(self, req: AgentReq):
46
+ """防御性获取名字:优先从内存取,内存没有从请求取,请求没有给默认值"""
47
+ try:
48
+ name = self.memory.load_variable("name")
49
+ if name: return name
50
+ except KeyError:
51
+ pass
52
+
53
+ name = req.name if req.name else "村民"
54
+ self.memory.set_variable("name", name)
55
+ return name
56
+
57
+ def interact(self, req: AgentReq) -> AgentResp:
58
  logger.info("VillagerAgent interact: {}".format(req))
59
+
60
+ # 获取名字,解决 KeyError: 'name'
61
+ my_name = self.get_my_name(req)
62
+ history_str = "\n".join(self.memory.load_history())
63
+
64
  if req.status == STATUS_DISCUSS:
65
  if req.message:
66
  self.memory.append_history(req.message)
67
+ prompt = format_prompt(DESC_PROMPT, {"name": my_name, "history": history_str})
 
 
 
 
68
  result = self.llm_caller(prompt)
69
+ return AgentResp(success=True, result=result)
 
70
 
71
  elif req.status == STATUS_VOTE:
72
+ choices = [n for n in req.message.split(",") if n != my_name] if req.message else []
73
+ prompt = format_prompt(VOTE_PROMPT, {"name": my_name, "choices": choices, "history": history_str})
 
 
 
 
 
 
74
  result = self.llm_caller(prompt)
75
+ return AgentResp(success=True, result=result)
 
76
 
77
  elif req.status == STATUS_SHERIFF_ELECTION:
78
+ prompt = format_prompt(SHERIFF_ELECTION_PROMPT, {"name": my_name, "history": history_str})
 
 
79
  result = self.llm_caller(prompt)
80
+ return AgentResp(success=True, result=result)
 
81
 
82
+ elif req.status in [STATUS_SHERIFF_SPEECH, STATUS_SHERIFF_PK]:
83
+ prompt = format_prompt(SHERIFF_SPEECH_PROMPT, {"name": my_name, "history": history_str})
 
 
84
  result = self.llm_caller(prompt)
85
+ return AgentResp(success=True, result=result)
 
 
 
 
 
 
 
 
 
86
 
87
  elif req.status == STATUS_SHERIFF_VOTE:
88
+ choices = req.message.split(",") if req.message else []
89
+ prompt = format_prompt(SHERIFF_VOTE_PROMPT, {"name": my_name, "choices": choices, "history": history_str})
 
 
 
90
  result = self.llm_caller(prompt)
91
+ return AgentResp(success=True, result=result)
 
92
 
93
  elif req.status == STATUS_SHERIFF_SPEECH_ORDER:
94
+ prompt = format_prompt(SHERIFF_SPEECH_ORDER_PROMPT, {"name": my_name, "history": history_str})
 
 
95
  result = self.llm_caller(prompt)
96
+ return AgentResp(success=True, result=result)
 
97
 
98
  elif req.status == STATUS_SHERIFF:
99
+ choices = [n for n in req.message.split(",") if n != my_name] if req.message else []
100
+ prompt = format_prompt(SHERIFF_TRANSFER_PROMPT, {"name": my_name, "choices": choices, "history": history_str})
 
 
 
 
101
  result = self.llm_caller(prompt)
102
+ return AgentResp(success=True, result=result)
103
+
104
+ # 遇到不需要互动的状态(比如村民在晚上),返回一个安全的默认值,而不是 raise NotImplementedError
105
+ return AgentResp(success=True, result="我不说话。")