stillerman commited on
Commit
b59ef58
·
1 Parent(s): ff1e468

better trace

Browse files
Files changed (1) hide show
  1. src/components/game-component.tsx +90 -30
src/components/game-component.tsx CHANGED
@@ -1,9 +1,9 @@
1
  "use client";
2
 
3
- import { useState, useEffect, useCallback } from "react";
4
  import { Card } from "@/components/ui/card";
5
  import { Button } from "@/components/ui/button";
6
- import { Flag, Clock, Hash, ArrowRight, Bot } from "lucide-react";
7
  import { useInference } from "@/lib/inference";
8
 
9
  import { API_BASE } from "@/lib/constants";
@@ -74,9 +74,11 @@ export default function GameComponent({
74
  "playing"
75
  );
76
 
77
- const [convo, setConvo] = useState([]);
 
 
78
 
79
- const { status: modelStatus, partialText, inferenceResult, inference } = useInference({
80
  apiKey:
81
  window.localStorage.getItem("huggingface_access_token") || undefined,
82
  });
@@ -198,8 +200,23 @@ export default function GameComponent({
198
  setConvo((prev) => [...prev, message]);
199
  };
200
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  return (
202
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
203
  <Card className="p-4 flex col-span-2">
204
  <h2 className="text-xl font-bold">Game Status</h2>
205
  <div className="grid grid-cols-4 gap-4 mb-4">
@@ -245,7 +262,7 @@ export default function GameComponent({
245
  )}
246
  </Card>
247
  {/* Left pane - Current page and available links */}
248
- <Card className="p-4 flex flex-col">
249
  <h2 className="text-xl font-bold">Available Links</h2>
250
  <div className="flex justify-between items-center mb-4">
251
  {gameStatus !== "playing" && (
@@ -286,13 +303,6 @@ export default function GameComponent({
286
  </>
287
  )}
288
 
289
- {player === "model" && modelStatus === "thinking" && gameStatus === "playing" && (
290
- <div className="flex items-center gap-2 text-sm animate-pulse mb-4">
291
- <Bot className="h-4 w-4" />
292
- <span>{model} is thinking...</span>
293
- </div>
294
- )}
295
-
296
  {gameStatus === "playing" && player === "me" && (
297
  <Button
298
  onClick={handleGiveUp}
@@ -326,24 +336,74 @@ export default function GameComponent({
326
  )}
327
  </Card>
328
 
329
- <Card className="p-4 flex flex-col max-h-[500px] overflow-y-auto">
330
- <h2 className="text-xl font-bold">LLM Reasoning</h2>
331
- {
332
- convo.map((message, index) => (
333
- <div key={index}>
334
- <p>{message.role}</p>
335
- <p>{message.content}</p>
336
- <hr />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
337
  </div>
338
- ))
339
- }
340
-
341
- { modelStatus === "thinking" && (
342
- <div className="flex items-center gap-2 text-sm animate-pulse mb-4">
343
- <Bot className="h-4 w-4" />
344
- <p>{partialText}</p>
345
- </div>
346
- )}
347
  </Card>
348
 
349
  {/* <Card className="p-4 flex flex-col max-h-[500px] overflow-y-auto">
 
1
  "use client";
2
 
3
+ import { useState, useEffect, useCallback, useRef } from "react";
4
  import { Card } from "@/components/ui/card";
5
  import { Button } from "@/components/ui/button";
6
+ import { Flag, Clock, Hash, ArrowRight, Bot, User, ChevronDown, ChevronUp } from "lucide-react";
7
  import { useInference } from "@/lib/inference";
8
 
9
  import { API_BASE } from "@/lib/constants";
 
74
  "playing"
75
  );
76
 
77
+ const [convo, setConvo] = useState<Message[]>([]);
78
+ const [expandedMessages, setExpandedMessages] = useState<Record<number, boolean>>({});
79
+ const messagesEndRef = useRef<HTMLDivElement>(null);
80
 
81
+ const { status: modelStatus, partialText, inference } = useInference({
82
  apiKey:
83
  window.localStorage.getItem("huggingface_access_token") || undefined,
84
  });
 
200
  setConvo((prev) => [...prev, message]);
201
  };
202
 
203
+ const scrollToBottom = () => {
204
+ messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
205
+ };
206
+
207
+ useEffect(() => {
208
+ scrollToBottom();
209
+ }, [convo, partialText]);
210
+
211
+ const toggleMessageExpand = (index: number) => {
212
+ setExpandedMessages(prev => ({
213
+ ...prev,
214
+ [index]: !prev[index]
215
+ }));
216
+ };
217
+
218
  return (
219
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4 h-[calc(100vh-200px)]">
220
  <Card className="p-4 flex col-span-2">
221
  <h2 className="text-xl font-bold">Game Status</h2>
222
  <div className="grid grid-cols-4 gap-4 mb-4">
 
262
  )}
263
  </Card>
264
  {/* Left pane - Current page and available links */}
265
+ <Card className="p-4 flex flex-col h-full overflow-hidden">
266
  <h2 className="text-xl font-bold">Available Links</h2>
267
  <div className="flex justify-between items-center mb-4">
268
  {gameStatus !== "playing" && (
 
303
  </>
304
  )}
305
 
 
 
 
 
 
 
 
306
  {gameStatus === "playing" && player === "me" && (
307
  <Button
308
  onClick={handleGiveUp}
 
336
  )}
337
  </Card>
338
 
339
+ <Card className="p-4 flex flex-col h-full overflow-hidden">
340
+ <h2 className="text-xl font-bold mb-4">LLM Reasoning</h2>
341
+ <div className="flex-1 overflow-y-auto space-y-4 pr-2">
342
+ {convo.map((message, index) => {
343
+ const isExpanded = expandedMessages[index] || false;
344
+ const isLongUserMessage = message.role === "user" && message.content.length > 300;
345
+ const shouldTruncate = isLongUserMessage && !isExpanded;
346
+
347
+ return (
348
+ <div
349
+ key={index}
350
+ className={`p-3 rounded-lg ${
351
+ message.role === "assistant"
352
+ ? "bg-blue-50 border border-blue-100"
353
+ : "bg-gray-50 border border-gray-100"
354
+ }`}
355
+ >
356
+ <div className="flex items-center gap-2 mb-1 text-sm font-medium text-muted-foreground">
357
+ {message.role === "assistant" ? (
358
+ <>
359
+ <Bot className="h-4 w-4" />
360
+ <span>Assistant</span>
361
+ </>
362
+ ) : (
363
+ <>
364
+ <User className="h-4 w-4" />
365
+ <span>User</span>
366
+ </>
367
+ )}
368
+ </div>
369
+
370
+ <div>
371
+ <p className="whitespace-pre-wrap text-sm">
372
+ {shouldTruncate
373
+ ? message.content.substring(0, 300) + "..."
374
+ : message.content
375
+ }
376
+ </p>
377
+
378
+ {isLongUserMessage && (
379
+ <Button
380
+ variant="ghost"
381
+ size="sm"
382
+ className="mt-1 h-6 text-xs flex items-center gap-1 text-muted-foreground hover:text-foreground"
383
+ onClick={() => toggleMessageExpand(index)}
384
+ >
385
+ {isExpanded
386
+ ? <><ChevronUp className="h-3 w-3" /> Show less</>
387
+ : <><ChevronDown className="h-3 w-3" /> Show more</>
388
+ }
389
+ </Button>
390
+ )}
391
+ </div>
392
+ </div>
393
+ );
394
+ })}
395
+
396
+ {modelStatus === "thinking" && (
397
+ <div className="p-3 rounded-lg bg-blue-50 border border-blue-100">
398
+ <div className="flex items-center gap-2 mb-1 text-sm font-medium text-muted-foreground">
399
+ <Bot className="h-4 w-4" />
400
+ <span className="animate-pulse">Thinking...</span>
401
+ </div>
402
+ <p className="whitespace-pre-wrap text-sm">{partialText}</p>
403
  </div>
404
+ )}
405
+ <div ref={messagesEndRef} />
406
+ </div>
 
 
 
 
 
 
407
  </Card>
408
 
409
  {/* <Card className="p-4 flex flex-col max-h-[500px] overflow-y-auto">