Skip to content

Commit 7d4703e

Browse files
committed
✨ 更新claude agent sdk
- 新增 AskUserQuestion 工具支持及用户回答处理
1 parent 2c8af1b commit 7d4703e

9 files changed

Lines changed: 548 additions & 47 deletions

File tree

agent/service/handler/permission_handler.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,27 @@ async def request_permission(self, agent_id: str, tool_name: str, input_data: di
8080
if decision == "allow":
8181
logger.info(f"✅ 权限允许: {tool_name}")
8282

83-
return PermissionResultAllow(updated_input=input_data)
83+
# 如果是 AskUserQuestion,构建 SDK 要求的 answers 格式
84+
updated_input = input_data.copy()
85+
if tool_name == "AskUserQuestion" and "user_answers" in response:
86+
user_answers = response["user_answers"]
87+
questions = input_data.get("questions", [])
88+
89+
# 构建 {question_text: selected_labels} 格式
90+
answers = {}
91+
for answer in user_answers:
92+
question_idx = answer.get("questionIndex", 0)
93+
selected_options = answer.get("selectedOptions", [])
94+
95+
if 0 <= question_idx < len(questions):
96+
question_text = questions[question_idx].get("question", "")
97+
# 多选用 ", " 连接
98+
answers[question_text] = ", ".join(selected_options)
99+
100+
updated_input["answers"] = answers
101+
logger.info(f"📝 AskUserQuestion 用户回答: {answers}")
102+
103+
return PermissionResultAllow(updated_input=updated_input)
84104
else:
85105
logger.info(f"❌ 权限拒绝: {tool_name}")
86106
return PermissionResultDeny(message=response.get("message", "User denied permission"))
@@ -104,11 +124,19 @@ async def handle_permission_response(self, message: Dict[str, Any]) -> None:
104124
return
105125

106126
# 保存响应
107-
self._permission_responses[request_id] = {
127+
response_data = {
108128
"decision": message.get("decision", "deny"),
109129
"message": message.get("message", "")
110130
}
111131

132+
# 如果是 AskUserQuestion 的回答,直接保存原始用户答案
133+
user_answers = message.get("user_answers")
134+
if user_answers:
135+
response_data["user_answers"] = user_answers
136+
logger.debug(f"📝 收到 AskUserQuestion 用户答案: {user_answers}")
137+
138+
self._permission_responses[request_id] = response_data
139+
112140
# 触发等待事件
113141
if request_id in self._permission_requests:
114142
self._permission_requests[request_id].set()

agent/service/session_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ async def get_session(self, agent_id: str) -> Optional[ClaudeSDKClient]:
4949
async def create_session(
5050
self,
5151
agent_id: str,
52-
can_use_tool: CanUseTool,
52+
can_use_tool: Optional[CanUseTool],
5353
session_id: Optional[str] = None,
5454
session_options: Optional[Dict[str, Any]] = None,
5555
) -> ClaudeSDKClient:

web/src/components/chat-interface.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ function groupMessagesByRound(messages: Message[]): Map<string, Message[]> {
3636
return groups;
3737
}
3838

39-
export function ChatInterface({agentId: externalAgentId, onNewSession: onNewSession}: ChatInterfaceProps) {
39+
export function ChatInterface({ agentId: externalAgentId, onNewSession: onNewSession }: ChatInterfaceProps) {
4040
const scrollRef = useRef<HTMLDivElement>(null);
4141

4242
const {
@@ -118,9 +118,9 @@ export function ChatInterface({agentId: externalAgentId, onNewSession: onNewSess
118118
<div className="bg-destructive/10 border border-destructive/20 rounded-lg p-3 backdrop-blur-sm">
119119
<div className="flex items-start gap-3">
120120
<svg className="w-5 h-5 text-destructive flex-shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24"
121-
stroke="currentColor">
121+
stroke="currentColor">
122122
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2}
123-
d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
123+
d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
124124
</svg>
125125
<div className="flex-1">
126126
<p className="text-sm font-medium text-destructive">无法连接到后端服务</p>
@@ -135,11 +135,11 @@ export function ChatInterface({agentId: externalAgentId, onNewSession: onNewSess
135135

136136
{/* 如果没有agentId,显示空状态 */}
137137
{!externalAgentId ? (
138-
<EmptyState onNewSession={onNewSession}/>
138+
<EmptyState onNewSession={onNewSession} />
139139
) : (
140140
<>
141141
{/* Header */}
142-
<ChatHeader agentId={agentId} isLoading={isLoading} todos={todos}/>
142+
<ChatHeader agentId={agentId} isLoading={isLoading} todos={todos} />
143143

144144
{/* Messages Area */}
145145
<div ref={scrollRef} className="flex-1 overflow-y-auto p-6 space-y-8 relative z-0 scroll-smooth">

0 commit comments

Comments
 (0)