main: 增强工具调用与上下文日志记录
- 添加 `disable_tools` 选项,支持达到调用上限后禁用工具 - 增加工具调用与结果的日志记录,提升调试信息 - 优化上下文构建,记录已加载的消息信息 - 完善流式消息推送逻辑,支持 `message.delta` 类型
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user