1
+
2
+ using LangChain . Chains . HelperChains ;
3
+
4
+ namespace LangChain . Chains . StackableChains . Context ;
5
+
6
+ public class ConsoleTraceHook : StackableChainHook
7
+ {
8
+ public bool UseColors { get ; set ; } = true ;
9
+ public int ValuesLength { get ; set ; } = 40 ;
10
+ public override void ChainStart ( StackableChainValues values )
11
+ {
12
+ Console . WriteLine ( ) ;
13
+ }
14
+ public override void LinkEnter ( BaseStackableChain chain , StackableChainValues values )
15
+ {
16
+
17
+ Console . Write ( "|" ) ;
18
+ Console . Write ( chain . GetType ( ) . Name ) ;
19
+ Console . WriteLine ( ) ;
20
+ if ( chain . InputKeys . Count > 0 )
21
+ {
22
+ Console . Write ( "|" ) ;
23
+ Console . Write ( " " ) ;
24
+ Console . Write ( "\u2514 " ) ;
25
+ Console . Write ( "Input:" ) ;
26
+ Console . WriteLine ( ) ;
27
+ foreach ( string inputKey in chain . InputKeys )
28
+ {
29
+ Console . Write ( "|" ) ;
30
+ Console . Write ( " " ) ;
31
+ Console . Write ( "\u2514 " ) ;
32
+ var value = values . Value [ inputKey ] ;
33
+ var oldColor = Console . ForegroundColor ;
34
+ Console . ForegroundColor = GetColorForKey ( inputKey ) ;
35
+ Console . Write ( $ " { inputKey } ={ ShortenString ( value . ToString ( ) ?? "" , ValuesLength ) } ") ;
36
+ Console . ForegroundColor = oldColor ;
37
+ Console . WriteLine ( ) ;
38
+ }
39
+ }
40
+
41
+
42
+ }
43
+
44
+ Dictionary < string , ConsoleColor > _colorMap = new Dictionary < string , ConsoleColor > ( ) ;
45
+
46
+ ConsoleColor GetColorForKey ( string key )
47
+ {
48
+ if ( ! UseColors )
49
+ return Console . ForegroundColor ;
50
+ // if key is not in map, get unique color(except black and white)
51
+ // if there no unique colors left, return white
52
+ if ( ! _colorMap . ContainsKey ( key ) )
53
+ {
54
+ var color = ConsoleColor . White ;
55
+ var colors = Enum . GetValues ( typeof ( ConsoleColor ) ) ;
56
+ foreach ( ConsoleColor c in colors )
57
+ {
58
+ if ( c == ConsoleColor . Black || c == ConsoleColor . White )
59
+ continue ;
60
+ if ( ! _colorMap . ContainsValue ( c ) )
61
+ {
62
+ color = c ;
63
+ break ;
64
+ }
65
+ }
66
+ _colorMap . Add ( key , color ) ;
67
+ }
68
+ return _colorMap [ key ] ;
69
+ }
70
+
71
+ string ShortenString ( string str , int length )
72
+ {
73
+ if ( str . Length <= length )
74
+ return str ;
75
+ return str . Substring ( 0 , length - 3 ) + "..." ;
76
+ }
77
+
78
+ public override void LinkExit ( BaseStackableChain chain , StackableChainValues values )
79
+ {
80
+ if ( chain . OutputKeys . Count > 0 )
81
+ {
82
+ Console . Write ( "|" ) ;
83
+ Console . Write ( " " ) ;
84
+ Console . Write ( "\u2514 " ) ;
85
+ Console . Write ( "Output:" ) ;
86
+ Console . WriteLine ( ) ;
87
+ foreach ( string outputKey in chain . OutputKeys )
88
+ {
89
+ Console . Write ( "|" ) ;
90
+ Console . Write ( " " ) ;
91
+ Console . Write ( "\u2514 " ) ;
92
+ var value = values . Value [ outputKey ] ;
93
+ var oldColor = Console . ForegroundColor ;
94
+ Console . ForegroundColor = GetColorForKey ( outputKey ) ;
95
+ Console . Write ( $ " { outputKey } ={ ShortenString ( value . ToString ( ) ?? "" , ValuesLength ) } ") ;
96
+ Console . ForegroundColor = oldColor ;
97
+ Console . WriteLine ( ) ;
98
+ }
99
+ }
100
+
101
+ }
102
+ }
0 commit comments