@@ -5,30 +5,50 @@ import os
5
5
import sys
6
6
import urllib .parse
7
7
from configparser import ConfigParser
8
+ import json
8
9
9
10
from litellm import completion # type: ignore[import-not-found]
10
11
11
12
import zulip
12
13
14
+ def format_conversation (result ):
15
+ # Note: Including timestamps seems to have no impact; including reactions
16
+ # makes the results worse.
17
+ zulip_messages = result ["messages" ]
18
+ if len (zulip_messages ) == 0 :
19
+ print ("No messages in conversation to summarize" )
20
+ sys .exit (0 )
21
+
22
+ zulip_messages_list = [{"sender" : message ['sender_full_name' ],
23
+ "content" : message ['content' ]} for message in zulip_messages ]
24
+ return json .dumps (zulip_messages_list )
25
+
26
+ def make_message (content , role = "user" ):
27
+ return {"content" : content ,
28
+ "role" : role }
29
+
30
+ def get_max_summary_length (conversation_length ):
31
+ return min (6 , 4 + int ((conversation_length - 10 )/ 10 ))
32
+
13
33
if __name__ == "__main__" :
14
34
parser = argparse .ArgumentParser ()
15
35
parser .add_argument (
16
36
"--url" ,
17
37
type = str ,
18
38
help = "The URL to fetch content from" ,
19
- default = "https://chat.zulip.org/#narrow/stream /101-design/topic/more.20user.20indicators " ,
39
+ default = "https://chat.zulip.org/#narrow/channel /101-design/topic/buddy.20list.20style.20switcher " ,
20
40
)
21
41
parser .add_argument (
22
42
"--model" ,
23
43
type = str ,
24
44
help = "The model name to use for summarization" ,
25
- default = "huggingface/meta-llama/Meta- Llama-3-8B -Instruct" ,
45
+ default = "huggingface/meta-llama/Llama-3.1-70B -Instruct" ,
26
46
)
27
47
parser .add_argument (
28
48
"--max-tokens" ,
29
49
type = int ,
30
50
help = "The maximum tokens permitted in the response" ,
31
- default = 100 ,
51
+ default = 300 ,
32
52
)
33
53
parser .add_argument (
34
54
"--max-messages" ,
@@ -92,38 +112,25 @@ if __name__ == "__main__":
92
112
if result ["result" ] == "error" :
93
113
print ("Failed fetching message history" , result )
94
114
sys .exit (1 )
95
- messages = result ["messages" ]
96
115
97
- if len (messages ) == 0 :
98
- print ("No messages in conversation to summarize" )
99
- sys .exit (0 )
116
+ conversation_length = len (result ['messages' ])
117
+ max_summary_length = get_max_summary_length (conversation_length )
100
118
101
- formatted_messages = [
102
- {"content" : f"{ message ['sender_full_name' ]} : { message ['content' ]} " , "role" : "user" }
103
- for message in messages
104
- ]
119
+ print ("Conversation URL:" , url )
120
+ print (f"Max summary length: { max_summary_length } " )
105
121
106
- # Provide a instruction if using an `Instruct` model.
107
- if "Instruct" in model :
108
- formatted_messages .append (
109
- {
110
- "content" : """
111
- Summarize the above content within 90 words.
112
- """ ,
113
- "role" : "user" ,
114
- }
115
- )
122
+ intro = f"The following is a chat conversation in the Zulip team chat app. channel: { channel } , topic: { topic } "
123
+ formatted_conversation = format_conversation (result )
124
+ prompt = f"Succinctly summarize this conversation based only on the information provided, in up to { max_summary_length } sentences, for someone who is familiar with the context. Mention key conclusions and actions, if any. Refer to specific people as appropriate. Don't use an intro phrase."
125
+ messages = [make_message (intro , "system" ), make_message (formatted_conversation ), make_message (prompt )]
116
126
117
127
# Send formatted messages to the LLM model for summarization
118
128
response = completion (
119
129
max_tokens = args .max_tokens ,
120
130
model = model ,
121
- messages = formatted_messages ,
131
+ messages = messages ,
122
132
)
123
133
124
- print ("Summarized conversation URL:" , url )
125
- print (
126
- f"Used { response ['usage' ]['total_tokens' ]} tokens to summarize { len (formatted_messages )} Zulip messages."
127
- )
134
+ print (f"Used { response ['usage' ]['completion_tokens' ]} completion tokens to summarize { conversation_length } Zulip messages ({ response ['usage' ]['prompt_tokens' ]} prompt tokens)." )
128
135
print ()
129
136
print (response ["choices" ][0 ]["message" ]["content" ])
0 commit comments