main: 增强工具调用与上下文日志记录

- 添加 `disable_tools` 选项,支持达到调用上限后禁用工具
- 增加工具调用与结果的日志记录,提升调试信息
- 优化上下文构建,记录已加载的消息信息
- 完善流式消息推送逻辑,支持 `message.delta` 类型
This commit is contained in:
2025-12-22 19:10:44 +08:00
parent 663e15395b
commit 78875ec3eb
4 changed files with 40 additions and 3 deletions

View File

@@ -75,6 +75,13 @@ class ChatSessionSseController extends Controller
$msg = json_decode($payload, true, 512, JSON_THROW_ON_ERROR); $msg = json_decode($payload, true, 512, JSON_THROW_ON_ERROR);
$msg = new Message($msg); $msg = new Message($msg);
// message.delta 不持久化seq=0直接推送
if ($msg && $msg->type === 'message.delta') {
$this->emitMessage($msg, true);
return;
}
if ($msg && $msg->seq > $lastSentSeq) { if ($msg && $msg->seq > $lastSentSeq) {
if ($msg->seq > $lastSentSeq + 1) { if ($msg->seq > $lastSentSeq + 1) {
$this->sendBacklog($sessionId, $lastSentSeq, $limit); $this->sendBacklog($sessionId, $lastSentSeq, $limit);

View File

@@ -69,7 +69,10 @@ class ChatCompletionsRequestBuilder
$toolsSpec = $this->toolRegistry->openAiToolsSpec(); $toolsSpec = $this->toolRegistry->openAiToolsSpec();
if (! empty($toolsSpec)) { // 支持 disable_tools 选项,用于在达到工具调用上限后禁用工具
$disableTools = $options['disable_tools'] ?? false;
if (! empty($toolsSpec) && ! $disableTools) {
$payload['tools'] = $toolsSpec; $payload['tools'] = $toolsSpec;
$payload['tool_choice'] = $options['tool_choice'] ?? $this->toolChoice ?? 'auto'; $payload['tool_choice'] = $options['tool_choice'] ?? $this->toolChoice ?? 'auto';
} }
@@ -105,6 +108,10 @@ class ChatCompletionsRequestBuilder
$toolCall = $this->normalizeToolCallPayload($payload, $content); $toolCall = $this->normalizeToolCallPayload($payload, $content);
if ($toolCall) { if ($toolCall) {
$messages[] = $toolCall; $messages[] = $toolCall;
logger('openai adapter: added tool.call', [
'tool_call_id' => $payload['tool_call_id'] ?? null,
'name' => $payload['name'] ?? null,
]);
} }
continue; continue;
} }
@@ -113,6 +120,16 @@ class ChatCompletionsRequestBuilder
$toolResult = $this->normalizeToolResultPayload($payload, $content); $toolResult = $this->normalizeToolResultPayload($payload, $content);
if ($toolResult) { if ($toolResult) {
$messages[] = $toolResult; $messages[] = $toolResult;
logger('openai adapter: added tool.result', [
'tool_call_id' => $payload['tool_call_id'] ?? null,
'name' => $payload['name'] ?? null,
'content_length' => strlen($toolResult['content'] ?? ''),
]);
} else {
logger('openai adapter: tool.result normalized to null', [
'payload' => $payload,
'content' => $content,
]);
} }
continue; continue;
} }
@@ -125,6 +142,11 @@ class ChatCompletionsRequestBuilder
} }
} }
logger('openai adapter: built messages', [
'total_messages' => count($messages),
'message_roles' => array_column($messages, 'role'),
]);
return $messages; return $messages;
} }
@@ -134,6 +156,7 @@ class ChatCompletionsRequestBuilder
Message::ROLE_USER => 'user', Message::ROLE_USER => 'user',
Message::ROLE_AGENT => 'assistant', Message::ROLE_AGENT => 'assistant',
Message::ROLE_SYSTEM => 'system', Message::ROLE_SYSTEM => 'system',
Message::ROLE_TOOL => 'tool',
default => null, default => null,
}; };
} }

View File

@@ -16,6 +16,13 @@ class ContextBuilder
{ {
$messages = $this->loadRecentMessages($sessionId); $messages = $this->loadRecentMessages($sessionId);
logger('context builder loaded messages', [
'session_id' => $sessionId,
'run_id' => $runId,
'message_count' => $messages->count(),
'message_types' => $messages->pluck('type', 'seq')->toArray(),
]);
return new AgentContext( return new AgentContext(
$runId, $runId,
$sessionId, $sessionId,

View File

@@ -202,9 +202,9 @@ class RunLoop
'should_stop' => fn () => $this->isCanceled($sessionId, $runId), 'should_stop' => fn () => $this->isCanceled($sessionId, $runId),
]; ];
// 达到工具调用上限后,强制禁用工具调用,避免再次触发 TOOL_CALL_LIMIT 错误 // 达到工具调用上限后,禁用工具列表,避免再次触发 TOOL_CALL_LIMIT 错误
if ($toolCallCount >= $this->maxToolCalls) { if ($toolCallCount >= $this->maxToolCalls) {
$options['tool_choice'] = 'none'; $options['disable_tools'] = true;
} }
return $options; return $options;