feat: Implement LLM streaming support and enhance event handling in review process

This commit is contained in:
Primakov Alexandr Alexandrovich
2025-10-13 17:48:03 +03:00
parent 2f29ccff74
commit 1d953f554b
6 changed files with 107 additions and 45 deletions

View File

@@ -32,6 +32,7 @@ export const ReviewStream: React.FC<ReviewStreamProps> = ({ reviewId }) => {
const [currentStep, setCurrentStep] = useState<string>('');
const [isConnected, setIsConnected] = useState(false);
const [llmMessages, setLlmMessages] = useState<string[]>([]);
const [llmStreamingText, setLlmStreamingText] = useState<string>('');
useEffect(() => {
console.log('🔌 Connecting to WebSocket:', WS_URL);
@@ -126,6 +127,12 @@ export const ReviewStream: React.FC<ReviewStreamProps> = ({ reviewId }) => {
setCurrentStep(step || '');
}
// Handle LLM streaming chunks
if (data.type === 'llm_chunk' || data.data?.type === 'llm_chunk') {
const chunk = data.data?.chunk || data.chunk || '';
setLlmStreamingText((prev) => prev + chunk);
}
// Collect LLM messages
if (data.type === 'llm_message' || data.data?.type === 'llm_message') {
const message = data.data?.message || data.message;
@@ -136,6 +143,8 @@ export const ReviewStream: React.FC<ReviewStreamProps> = ({ reviewId }) => {
// Handle special events
if (data.type === 'review_started') {
console.log('🎬 Review started:', data.data?.message);
// Сбрасываем streaming текст при начале нового review
setLlmStreamingText('');
}
if (data.type === 'review_completed') {
@@ -319,6 +328,21 @@ export const ReviewStream: React.FC<ReviewStreamProps> = ({ reviewId }) => {
{renderStepProgress()}
{/* LLM Streaming текст */}
{llmStreamingText && (
<div className="mt-6">
<h3 className="text-lg font-semibold text-dark-text-primary mb-3 flex items-center gap-2">
<span className="animate-pulse">🤖</span> AI генерирует ответ...
</h3>
<div className="bg-dark-card border border-dark-border rounded-lg p-4">
<pre className="text-sm text-dark-text-secondary font-mono whitespace-pre-wrap break-words max-h-96 overflow-y-auto">
{llmStreamingText}
<span className="animate-pulse"></span>
</pre>
</div>
</div>
)}
<div className="mt-6">
<h3 className="text-lg font-semibold text-dark-text-primary mb-3">
📝 События