svummidi commited on
Commit
a31ba66
1 Parent(s): 2bff3d3

POC for passive monitoring

Browse files
.DS_Store ADDED
Binary file (10.2 kB). View file
 
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ /text_index/
.idea/.gitignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
.idea/aws.xml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="accountSettings">
4
+ <option name="activeProfile" value="profile:default" />
5
+ <option name="activeRegion" value="us-west-2" />
6
+ <option name="recentlyUsedProfiles">
7
+ <list>
8
+ <option value="profile:default" />
9
+ </list>
10
+ </option>
11
+ <option name="recentlyUsedRegions">
12
+ <list>
13
+ <option value="us-west-2" />
14
+ </list>
15
+ </option>
16
+ </component>
17
+ </project>
.idea/checkstyle-idea.xml ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="CheckStyle-IDEA" serialisationVersion="2">
4
+ <checkstyleVersion>10.3.2</checkstyleVersion>
5
+ <scanScope>JavaOnly</scanScope>
6
+ <option name="activeLocationIds">
7
+ <option value="0357db59-51a7-49e6-a960-58a5b3ef052c" />
8
+ </option>
9
+ <option name="locations">
10
+ <list>
11
+ <ConfigurationLocation id="bundled-sun-checks" type="BUNDLED" scope="All" description="Sun Checks">(bundled)</ConfigurationLocation>
12
+ <ConfigurationLocation id="bundled-google-checks" type="BUNDLED" scope="All" description="Google Checks">(bundled)</ConfigurationLocation>
13
+ <ConfigurationLocation id="0357db59-51a7-49e6-a960-58a5b3ef052c" type="LOCAL_FILE" scope="All" description="Axm">
14
+ $USER_HOME$/Documents/funplace/axm-defaults/codestyle/checkstyle.xml
15
+ <option name="properties">
16
+ <map>
17
+ <entry key="org.checkstyle.google.suppressionfilter.config" value="" />
18
+ <entry key="org.checkstyle.google.suppressionxpathfilter.config" value="" />
19
+ </map>
20
+ </option>
21
+ </ConfigurationLocation>
22
+ </list>
23
+ </option>
24
+ </component>
25
+ </project>
.idea/google-java-format.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="GoogleJavaFormatSettings">
4
+ <option name="enabled" value="true" />
5
+ </component>
6
+ </project>
.idea/jpa-buddy.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="JpaBuddyIdeaProjectConfig">
4
+ <option name="renamerInitialized" value="true" />
5
+ </component>
6
+ </project>
.idea/misc.xml ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <project version="4">
2
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_20" project-jdk-name="Python 3.9 (slackdemo)" project-jdk-type="Python SDK">
3
+ <output url="file://$PROJECT_DIR$/out" />
4
+ </component>
5
+ <component name="ProjectType">
6
+ <option name="id" value="jpab" />
7
+ </component>
8
+ <component name="SaveActionSettings">
9
+ <option name="actions">
10
+ <set>
11
+ <option value="activate" />
12
+ <option value="noActionIfCompileErrors" />
13
+ <option value="organizeImports" />
14
+ <option value="reformat" />
15
+ <option value="rearrange" />
16
+ <option value="fieldCanBeFinal" />
17
+ <option value="methodMayBeStatic" />
18
+ <option value="missingOverrideAnnotation" />
19
+ <option value="suppressAnnotation" />
20
+ <option value="accessCanBeTightened" />
21
+ </set>
22
+ </option>
23
+ <option name="configurationPath" value="" />
24
+ </component>
25
+ </project>
.idea/modules.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/slackdemo.iml" filepath="$PROJECT_DIR$/.idea/slackdemo.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
.idea/slackdemo.iml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="JAVA_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$">
6
+ <excludeFolder url="file://$MODULE_DIR$/venv_ide" />
7
+ </content>
8
+ <orderEntry type="inheritedJdk" />
9
+ <orderEntry type="sourceFolder" forTests="false" />
10
+ </component>
11
+ </module>
.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
app.py CHANGED
@@ -1,8 +1,72 @@
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
- def greet(name):
4
- return "Hello " + name + "!!"
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- iface = gr.Interface(fn=greet, inputs="text", outputs="text")
7
- iface.launch()
8
 
 
 
1
+ import logging
2
+ import os
3
+ import json
4
+ from llama_index.indices.document_summary import DocumentSummaryIndexEmbeddingRetriever
5
+ from llama_index.indices.vector_store import VectorIndexRetriever
6
+ from llama_index.llms import OpenAI
7
+ from llama_index.query_engine import RetrieverQueryEngine
8
+
9
+ logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=os.environ.get("LOGLEVEL", "INFO"))
10
  import gradio as gr
11
+ from llama_index import VectorStoreIndex, StorageContext, download_loader, load_index_from_storage, ServiceContext, \
12
+ get_response_synthesizer
13
+
14
+ cache = {}
15
+ chatgpt = OpenAI(temperature=0, model="gpt-3.5-turbo")
16
+ service_context = ServiceContext.from_defaults(llm=chatgpt, chunk_size=1024)
17
+
18
+
19
+ def load_mapping_from_json(filepath):
20
+ if not os.path.exists(filepath):
21
+ return {}
22
+ with open(filepath, 'r') as file:
23
+ return json.load(file)
24
+
25
+ userIdMapping = load_mapping_from_json('user_id_to_name_mapping.json')
26
+
27
+ def loadData():
28
+ index_root = "./index"
29
+ directory_names = os.listdir(index_root)
30
+ for directory in directory_names:
31
+ if os.path.isdir(f"{index_root}/{directory}"):
32
+ print("Loading from existing index " + directory)
33
+ storage_context = StorageContext.from_defaults(persist_dir=f"{index_root}/{directory}")
34
+ index = load_index_from_storage(storage_context)
35
+ vector_retriever = VectorIndexRetriever(index=index, similarity_top_k=5)
36
+ response_synthesizer = get_response_synthesizer(service_context=service_context,
37
+ response_mode="tree_summarize")
38
+ query_engine = RetrieverQueryEngine(
39
+ retriever=vector_retriever,
40
+ response_synthesizer=response_synthesizer,
41
+ )
42
+ cache[directory] = query_engine
43
+
44
+
45
+ def chatbot(indexName, input_text):
46
+ """
47
+ Chatbot function that takes in a prompt and returns a response
48
+ """
49
+ query = "This data contains updates from multiple teams and sprints - "+ input_text + " Ignore headers in the content."
50
+ response = cache[indexName].query(query)
51
+ answer = response.response.replace('Based on the given context information', 'Based on the available information')
52
+ for userId in userIdMapping:
53
+ answer = answer.replace(userId, userIdMapping[userId])
54
+ return answer
55
+
56
 
57
+ def main():
58
+ loadData()
59
+ iface = gr.Interface(fn=chatbot, inputs=[
60
+ gr.Dropdown(cache.keys(),
61
+ type="value", value="sos", label="Select Channel"),
62
+ gr.Textbox(lines=7, label="Ask any question", placeholder='What are the key topics?')], outputs=gr.Textbox(lines=11, label="Response"),
63
+ title="NLP Demo for Slack Data")
64
+ if 'LOGIN_PASS' in os.environ:
65
+ iface.launch(auth=('axiamatic', os.environ['LOGIN_PASS']),
66
+ auth_message='For access, please check my Slack profile or contact me in Slack.',
67
+ share=False)
68
+ else:
69
+ iface.launch(share=False)
70
 
 
 
71
 
72
+ main()
app_passive.py ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import logging
3
+ import os
4
+ import re
5
+ from functools import lru_cache
6
+
7
+ from llama_index.llms import OpenAI
8
+ from whoosh.query import Or, Term
9
+
10
+ import csv
11
+
12
+ THREAD_ID = "thread_id"
13
+
14
+ logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=os.environ.get("LOGLEVEL", "INFO"))
15
+ import gradio as gr
16
+ from llama_index import ServiceContext, \
17
+ Document, GPTListIndex, VectorStoreIndex
18
+ from whoosh import fields, index
19
+ from whoosh.qparser import QueryParser
20
+
21
+ thread_index = {}
22
+ comment_index = {}
23
+ llama_cache = {}
24
+
25
+ chatgpt = OpenAI(temperature=0, model="gpt-4")
26
+ service_context = ServiceContext.from_defaults(llm=chatgpt, chunk_size=1024)
27
+
28
+
29
+ def passive_topics(index_name, query, topic, summary_type):
30
+ resp = search_keyword_matches(index_name, query)
31
+ if resp is not None:
32
+ print(f"Found {len(resp)} matches for {query}")
33
+ docs_list = [Document(text=content) for content in resp]
34
+ last_llama_index = GPTListIndex.from_documents(documents=docs_list, service_context=service_context)
35
+ llama_cache[index_name] = last_llama_index
36
+ resp = last_llama_index.as_query_engine().query(
37
+ "What are the key negative topics from the discussion? Limit each topic to 30 characters")
38
+ dynamic_topics = resp.response.split('\n')
39
+ return dynamic_topics
40
+
41
+ return []
42
+
43
+
44
+ def load_data(data_sets):
45
+ for data_set in data_sets:
46
+ create_thread_index(data_set)
47
+ create_comment_index(data_set)
48
+
49
+
50
+ def create_thread_index(data_set):
51
+ # Define a schema for the index
52
+ schema = fields.Schema(id=fields.ID(stored=True), content=fields.TEXT(stored=True))
53
+ index_path = f"./text_index/{data_set}"
54
+ # Create the index directory if it doesn't exist
55
+ if not os.path.exists(index_path):
56
+ os.mkdir(index_path)
57
+ build_index = True
58
+ else:
59
+ build_index = False
60
+ print("Loading from existing thread index " + data_set)
61
+ if build_index:
62
+ print("Building thread index for " + data_set)
63
+ # Create an index under "indexdir"
64
+ write_ix = index.create_in(index_path, schema)
65
+
66
+ # Create a writer object to add documents to the index
67
+ writer = write_ix.writer()
68
+
69
+ # Read the CSV file and add documents to the index
70
+ with open(f'csv/{data_set}.csv', 'r') as csvfile:
71
+ reader = csv.DictReader(csvfile)
72
+ for row in reader:
73
+ writer.add_document(id=row['thread_ts'], content=row['messages_json'])
74
+ # Commit the writer and close it
75
+ writer.commit()
76
+ write_ix.close()
77
+ # Open the index
78
+ read_ix = index.open_dir(index_path)
79
+ thread_index[data_set] = read_ix
80
+
81
+
82
+ def create_comment_index(data_set):
83
+ # Define a schema for the index
84
+ schema = fields.Schema(id=fields.ID(stored=True), content=fields.TEXT(stored=True))
85
+ index_path = f"./text_index/{data_set}_comments"
86
+ # Create the index directory if it doesn't exist
87
+ if not os.path.exists(index_path):
88
+ os.mkdir(index_path)
89
+ build_index = True
90
+ else:
91
+ build_index = False
92
+ print("Loading from existing comments index " + data_set)
93
+ if build_index:
94
+ print("Building comments index for " + data_set)
95
+ # Create an index under "indexdir"
96
+ write_ix = index.create_in(index_path, schema)
97
+
98
+ # Create a writer object to add documents to the index
99
+ writer = write_ix.writer()
100
+
101
+ # Read the CSV file and add documents to the index
102
+ count= 0
103
+ with open(f'csv/{data_set}.csv', 'r') as csvfile:
104
+ reader = csv.DictReader(csvfile)
105
+ for row in reader:
106
+ comments = json.loads(row['messages_json'])
107
+ for comment in comments:
108
+ writer.add_document(id=row['thread_ts'], content=comment["content"])
109
+ count += 1
110
+ # Commit the writer and close it
111
+ writer.commit()
112
+ write_ix.close()
113
+ # Open the index
114
+ read_ix = index.open_dir(index_path)
115
+ comment_index[data_set] = read_ix
116
+
117
+
118
+ def search_keyword_matches(ix, input):
119
+ # Create a query parser
120
+ query_parser = QueryParser("content", ix.schema)
121
+ query = query_parser.parse(input)
122
+ return execute_text_search(ix, query)
123
+
124
+
125
+ def search_thread_id_matches(ix, thread_id_list):
126
+ # Create a query parser
127
+ query = Or([Term('id', id_) for id_ in thread_id_list])
128
+ return execute_text_search(ix, query)
129
+
130
+
131
+ def execute_text_search(ix, q):
132
+ # Search the index
133
+ with ix.searcher() as searcher:
134
+ results = searcher.search(q, limit=20)
135
+ if len(results) > 0:
136
+ matches = []
137
+ for result in results:
138
+ matches.append([result['id'], result['content']])
139
+ return matches
140
+ else:
141
+ return None
142
+
143
+
144
+ def gen_insights(index_name, topic, summary_type):
145
+ if topic is not None and len(topic) > 0:
146
+ resp = generate_insights(index_name, topic, summary_type)
147
+ return resp.response
148
+
149
+
150
+ @lru_cache(maxsize=50)
151
+ def generate_insights(index_name, topic, summary_type):
152
+ if llama_cache[index_name] is None:
153
+ return None
154
+ query = f"What is the executive summary for the topic \"{topic}\"? Highlight negative aspects in 100 words"
155
+ if summary_type == "Actions":
156
+ query = f"What are the recommended action items for the topic \"{topic}\"? Limit response to 100 words using bullet points"
157
+ elif summary_type == "Followup":
158
+ query = f"What are the recommended questions to ask team for more clarity and latest status for the topic \"{topic}\"?"
159
+ return llama_cache[index_name].as_query_engine().query(query)
160
+
161
+
162
+ def generate_comment_insights(index_name, topic, summary_type):
163
+ if summary_type == "Show Comments":
164
+ return show_docs(index_name, topic)
165
+ if summary_type == "Show Threads":
166
+ return show_threads(index_name, topic)
167
+ if summary_type == "Show Summary":
168
+ return show_thread_summaries(index_name, topic)
169
+
170
+ return "Not yet implemented"
171
+
172
+
173
+ def retrieve_llama_nodes(index_name, topic):
174
+ llama = llama_cache[index_name]
175
+ if llama is None:
176
+ return None
177
+ retriever = llama.as_retriever()
178
+ return retriever.retrieve(topic)
179
+
180
+
181
+ def show_docs(index_name, topic):
182
+ nodes = retrieve_llama_nodes(index_name, topic)
183
+ if nodes is None:
184
+ return "No matching documents found for the topic " + topic
185
+ text_list = [node_with_score.node.text for node_with_score in nodes]
186
+ return f"Total Matched Comments {len(text_list)}\n" + "\n\n==============\n".join(text_list)
187
+
188
+
189
+ def find_matching_threads(index_name, topic):
190
+ nodes = retrieve_llama_nodes(index_name, topic)
191
+ if nodes is None:
192
+ return None
193
+ thread_ids_list = [node_with_score.node.metadata[THREAD_ID] for node_with_score in nodes]
194
+ matches = search_thread_id_matches(thread_index[index_name], thread_ids_list)
195
+ threads = []
196
+ for thread in matches:
197
+ comments = json.loads(thread[1])
198
+ thread_content = []
199
+ for comment in comments:
200
+ thread_content.append(comment["content"])
201
+ threads.append("\n ->->-> \n ".join(thread_content))
202
+ return threads
203
+
204
+
205
+ def show_threads(index_name, topic):
206
+ threads = find_matching_threads(index_name, topic)
207
+ if threads is None:
208
+ return "No matching documents found for the topic " + topic
209
+ return f"Total Threads {len(threads)}\n" + "\n\n==============\n".join(threads)
210
+
211
+
212
+ @lru_cache(maxsize=50)
213
+ def show_thread_summaries(index_name, topic):
214
+ threads = find_matching_threads(index_name, topic)
215
+ if threads is None:
216
+ return "No matching documents found for the topic " + topic
217
+ docs_list = []
218
+ for thread in threads:
219
+ docs_list.append(Document(text=thread))
220
+ llama_idx = VectorStoreIndex.from_documents(documents=docs_list, service_context=service_context)
221
+ query = f"What is the executive summary for the topic \"{topic}\"? Limit response to 100 words"
222
+ resp = llama_idx.as_query_engine().query(query)
223
+ return resp.response
224
+
225
+
226
+ def remove_leading_numbers(text):
227
+ # Use re.sub to replace any pattern of "<number>." at the beginning of a line.
228
+ return re.sub(r'^\d+[.)]\s*', '', text, flags=re.M)
229
+
230
+ def find_topics_with_llama(index_name, query, matches):
231
+ print(f"Found {len(matches)} matches for {query}")
232
+ docs_list = []
233
+ for match in matches:
234
+ metadata = {THREAD_ID: match[0]}
235
+ docs_list.append(Document(text=match[1], metadata=metadata))
236
+ last_llama_index = VectorStoreIndex.from_documents(documents=docs_list, service_context=service_context)
237
+ llama_cache[index_name] = last_llama_index
238
+ resp = last_llama_index.as_query_engine().query(
239
+ "What are the key negative topics from the discussion? Limit each topic to 30 characters")
240
+ # return resp.response.split('\n')
241
+ # return ["foo", "bar"]
242
+ result_topics = resp.response.split('\n')
243
+ clean_topics = [remove_leading_numbers(topic) for topic in result_topics]
244
+ return clean_topics
245
+
246
+
247
+ def find_topics_by_thread(index_name, query, topic, summary_type):
248
+ resp = search_keyword_matches(thread_index[index_name], query)
249
+ if resp is not None:
250
+ result_topics = find_topics_with_llama(index_name, query, resp)
251
+ return gr.Dropdown.update(choices=result_topics, value=result_topics[0])
252
+
253
+ return "No matches found" if resp is None else resp
254
+
255
+
256
+ def find_topics_by_comments(index_name, query, topic, summary_type):
257
+ resp = search_keyword_matches(comment_index[index_name], query)
258
+ if resp is not None:
259
+ result_topics = find_topics_with_llama(index_name, query, resp)
260
+ return gr.Dropdown.update(choices=result_topics, value=result_topics[0])
261
+
262
+ return "No matches found" if resp is None else resp
263
+
264
+
265
+ def main_demo():
266
+ demo = gr.Blocks()
267
+
268
+ with demo:
269
+ data_sets = ["platform-engg_messages", "apps-ui_messages", "ux-reviews_messages"]
270
+ load_data(data_sets)
271
+ with gr.Tab("Thread"):
272
+ data_sets_dd = gr.Dropdown(data_sets,
273
+ type="value", value=data_sets[0], label="Select Slack Channel")
274
+ keyword_txt = gr.Textbox(lines=2, label="Enter keywords to search", placeholder='CISO, auth0')
275
+ find_topics_button = gr.Button("Find Topics")
276
+ topics_dd = gr.Dropdown([],
277
+ type="value", label="Select Topic with Negative Sentiment", allow_custom_value=True)
278
+
279
+ show_details = gr.Radio(["Summary", "Actions", "Followup"], label="Show Details")
280
+
281
+ find_topics_button.click(find_topics_by_thread,
282
+ inputs=[data_sets_dd, keyword_txt, find_topics_button, topics_dd],
283
+ outputs=topics_dd)
284
+ show_details.change(gen_insights, inputs=[data_sets_dd, topics_dd, show_details],
285
+ outputs=gr.Textbox(lines=11, label="Response"))
286
+
287
+ with gr.Tab("Comment"):
288
+ data_sets_dd = gr.Dropdown(data_sets,
289
+ type="value", value=data_sets[0], label="Select Slack Channel")
290
+ keyword_txt = gr.Textbox(lines=2, label="Enter keywords to search", placeholder='CISO, auth0')
291
+ find_topics_button = gr.Button("Find Topics")
292
+ topics_dd = gr.Dropdown([],
293
+ type="value", label="Select Topic with Negative Sentiment", allow_custom_value=True)
294
+
295
+ show_details = gr.Radio(["Show Comments", "Show Threads", "Show Summary"], label="Show Details")
296
+
297
+ find_topics_button.click(find_topics_by_comments,
298
+ inputs=[data_sets_dd, keyword_txt, find_topics_button, topics_dd],
299
+ outputs=topics_dd)
300
+ show_details.change(generate_comment_insights, inputs=[data_sets_dd, topics_dd, show_details],
301
+ outputs=gr.Textbox(lines=11, label="Response"))
302
+
303
+ demo.launch()
304
+
305
+
306
+ main_demo()
app_summary.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+
4
+ from llama_index.indices.document_summary import DocumentSummaryIndexEmbeddingRetriever
5
+ from llama_index.llms import OpenAI
6
+ from llama_index.query_engine import RetrieverQueryEngine
7
+
8
+ logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=os.environ.get("LOGLEVEL", "DEBUG"))
9
+ import gradio as gr
10
+ from llama_index import VectorStoreIndex, StorageContext, download_loader, load_index_from_storage, ServiceContext, \
11
+ get_response_synthesizer
12
+
13
+ cache = {}
14
+ chatgpt = OpenAI(temperature=0, model="gpt-3.5-turbo")
15
+ service_context = ServiceContext.from_defaults(llm=chatgpt, chunk_size=1024)
16
+
17
+ def loadData():
18
+ index_root = "./summary_index"
19
+ directory_names = os.listdir(index_root)
20
+ for directory in directory_names:
21
+ if os.path.isdir(f"{index_root}/{directory}"):
22
+ print("Loading from existing index " + directory)
23
+ storage_context = StorageContext.from_defaults(persist_dir=f"{index_root}/{directory}")
24
+ index = load_index_from_storage(storage_context)
25
+ retriever = DocumentSummaryIndexEmbeddingRetriever(
26
+ index,
27
+ # choice_select_prompt=choice_select_prompt,
28
+ # choice_batch_size=choice_batch_size,
29
+ # format_node_batch_fn=format_node_batch_fn,
30
+ # parse_choice_select_answer_fn=parse_choice_select_answer_fn,
31
+ service_context=service_context
32
+ )
33
+ # configure response synthesizer
34
+ response_synthesizer = get_response_synthesizer(service_context=service_context)
35
+
36
+ # assemble query engine
37
+ query_engine = RetrieverQueryEngine(retriever=retriever, response_synthesizer=response_synthesizer)
38
+ cache[directory] = query_engine
39
+
40
+
41
+ def chatbot(indexName, input_text):
42
+ """
43
+ Chatbot function that takes in a prompt and returns a response
44
+ """
45
+ response = cache[indexName].query(input_text)
46
+ return response.response
47
+
48
+
49
+ def main():
50
+ loadData()
51
+ iface = gr.Interface(fn=chatbot, inputs=[
52
+ gr.Dropdown(cache.keys(),
53
+ type="value", value="sos", label="Select Channel"),
54
+ gr.Textbox(lines=7, label="Ask any question", placeholder='What are the key topics?')], outputs="text",
55
+ title="NLP Demo for Slack Data")
56
+ if 'LOGIN_PASS' in os.environ:
57
+ iface.launch(auth=('axiamatic', os.environ['LOGIN_PASS']),
58
+ auth_message='For access, please check my Slack profile or contact me in Slack.',
59
+ share=False)
60
+ else:
61
+ iface.launch(share=False)
62
+
63
+ main()
channel_id_mapper.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import requests
4
+
5
+ ID_MAPPING_JSON = 'channel_id_mapping.json'
6
+
7
+
8
+ class ChannelIdMapper:
9
+ def __init__(self, token):
10
+ self.token = token
11
+ self._load_channel_id_mapping()
12
+
13
+ def create_channel_dict(self):
14
+ base_url = 'https://slack.com/api/conversations.list'
15
+ headers = {'Authorization': f'Bearer {self.token}'}
16
+ params = {
17
+ 'types': 'public_channel,private_channel',
18
+ 'limit': 1000
19
+ }
20
+ response = requests.get(base_url, headers=headers, params=params)
21
+ data = response.json()
22
+
23
+ channel_dict = {}
24
+ if data['ok']:
25
+ channels = data['channels']
26
+ for channel in channels:
27
+ channel_name = channel['name']
28
+ channel_id = channel['id']
29
+ channel_dict[channel_name] = channel_id
30
+ else:
31
+ print(f'Error: {data}')
32
+ print(channel_dict)
33
+ return channel_dict
34
+
35
+ def _load_channel_id_mapping(self):
36
+ if os.path.exists(ID_MAPPING_JSON):
37
+ with open(ID_MAPPING_JSON, 'r') as f:
38
+ channel_dict = json.load(f)
39
+ else:
40
+ channel_dict = self.create_channel_dict()
41
+ with open(ID_MAPPING_JSON, 'w') as f:
42
+ json.dump(channel_dict, f, indent=4)
43
+ return channel_dict
44
+
45
+ def get_channel_id(self, channel_name):
46
+ channel_dict = self._load_channel_id_mapping()
47
+ return channel_dict[channel_name]
channel_id_mapping.json ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "company-building": "C025WA74Q87",
3
+ "random": "C02649E3A3Y",
4
+ "general": "C02681AAGCV",
5
+ "engg": "C028U328HMG",
6
+ "intros": "C029N3YNLEA",
7
+ "machine-learning": "C029Y6AKE10",
8
+ "incoming": "C02A4042Y4S",
9
+ "channn124": "C02A5F46ZD1",
10
+ "build-status": "C02AF7ZASP8",
11
+ "customer-feedback": "C02B2299YTZ",
12
+ "design-reviews": "C02BDL8AGNP",
13
+ "merge-requests": "C02BXE5HS00",
14
+ "temp-channel": "C02CB95287Q",
15
+ "platform-engg": "C02CREJ9EJ2",
16
+ "product-adjacencies": "C02DN35KX70",
17
+ "sos-demo-videos": "C02DY77565R",
18
+ "e2e-demos": "C02E6HT7EBC",
19
+ "engg-job-reports": "C02EMQW6SS3",
20
+ "people_ops": "C02FW4L873Q",
21
+ "1-password": "C02GFQPV42Y",
22
+ "discovery-engg": "C02HGENGD34",
23
+ "vms-engg": "C02HWC3APB7",
24
+ "collab-engg": "C02J3KB4XS5",
25
+ "dev-deployments": "C02JB6NHQCA",
26
+ "stage-deployments": "C02JB6U42HG",
27
+ "sos": "C02JEH5KGGN",
28
+ "engg-random": "C02JJAG9PHB",
29
+ "imply-axiamatic": "C02JT5R7RDG",
30
+ "temp-sys-test-setup": "C02KGQH5ZGA",
31
+ "test": "C02LTHE7MLP",
32
+ "referralsataxiamatic": "C02MUD9NA1F",
33
+ "apps-ui": "C02NJB4RCBC",
34
+ "collab-merge-notifications": "C02UZ3J1VLG",
35
+ "onboarding": "C0301BF2CKS",
36
+ "system-test-status": "C0304NZ07SR",
37
+ "reg-alerts-int": "C031JV7T554",
38
+ "biz_ops": "C032E0EPJFQ",
39
+ "collab-jira": "C032YCYS9U5",
40
+ "vms-jira": "C0331C9E3L2",
41
+ "disc-jira": "C0331CD84V9",
42
+ "fcr": "C0337A01TGX",
43
+ "platform-jira": "C033QEJJGG0",
44
+ "aryan": "C033RAKHUGG",
45
+ "alpha-war-room": "C0343R9A3L2",
46
+ "axiamatic-alpha-feedback": "C034BPF2TSP",
47
+ "virtual-coffee-donut-test": "C034EV8CTK4",
48
+ "reg-alerts-stage": "C0374F96UNT",
49
+ "data-engg": "C037AP55UM6",
50
+ "critical-alerts-prod": "C037K3FQSLA",
51
+ "axiamatic-product-messages": "C037PG55FC5",
52
+ "reg-alerts-prod": "C037R99SA7L",
53
+ "rfi": "C0381D0DAPL",
54
+ "kudos": "C0383JF3GKE",
55
+ "critical-alerts-int": "C0388RGF1R6",
56
+ "critical-alerts-stage": "C0388RPB5EU",
57
+ "axm-ff": "C038B4QFQRE",
58
+ "logz-test": "C038ZMM93UP",
59
+ "shuffl-meetups": "C039B4G344X",
60
+ "logz-help": "C039P678D54",
61
+ "_x-shuffl-permissions-check-653b936b": "C03A48WCWKB",
62
+ "prod-deployments": "C03ABH2ACQG",
63
+ "support": "C03BA0QJMAT",
64
+ "frontend": "C03DEA9LBRD",
65
+ "frontend-merge-requests": "C03DGRZ5WPJ",
66
+ "recruting-greylock-candidates": "C03FERPM44W",
67
+ "prod-new-registrations": "C03FQ21RK3Q",
68
+ "notification-system-test": "C03G9P4FAFJ",
69
+ "tools-engg": "C03GD4NSFSL",
70
+ "audit-logs": "C03H2D1QEE8",
71
+ "avenkat-pm-connect": "C03HUB3HE2V",
72
+ "anandhi-connect": "C03J5BAMGSU",
73
+ "opsgenie-axm": "C03K8B1LBND",
74
+ "on-call": "C03KDBFCMM2",
75
+ "cust-onboarding": "C03LKKQV0NS",
76
+ "deployment-requests": "C03MGS3ASCQ",
77
+ "axiamatic-pm-team": "C03N9PC3Y9Y",
78
+ "pooja-connect": "C03NJRS0FQE",
79
+ "teams-permissions-hardening": "C03NS0EPF6W",
80
+ "apps_team_pm_em": "C03P9FH8FRU",
81
+ "pm-qa": "C03PCH22EDS",
82
+ "tagging": "C03Q1CAR3NZ",
83
+ "chris-connect": "C03Q320UU2U",
84
+ "bayarea": "C03S7V02XBQ",
85
+ "value-metrics-reports": "C03UL8V7NJV",
86
+ "csm-flow-room": "C04198V3NDV",
87
+ "development-config-updates": "C041NC7TJN8",
88
+ "triage": "C04214NME9M",
89
+ "user-facing-development": "C042J0TAJPN",
90
+ "cdk-engg": "C042UAJJV7B",
91
+ "jira-triage": "C0435C6BV7A",
92
+ "ui-jira": "C04597HKE3S",
93
+ "kb": "C04AX592DPU",
94
+ "rsc-discussion": "C04BHEM1C81",
95
+ "stage-config-updates": "C04BK1W5TJB",
96
+ "prod-config-updates": "C04BZH5SC83",
97
+ "reports-sessionization-room": "C04CDCHDGUC",
98
+ "ux-reviews": "C04EQMFDPQT",
99
+ "test123": "C04FH312GC8",
100
+ "opsgenie-alerts": "C04GVCB3FNY",
101
+ "recruiting-sales": "C04H4SM5HJT"
102
+ }
csv/apps-ui.csv ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ Start Time,Last Updated,Originator,Unique Users,Unique Users Count,Summary,Message Count,Positive Topics,Negative Topics,Overall Sentiment
2
+ 2023-02-14T08:48:16.402139,2023-02-21T03:33:58.123419,pmangalapuri,"{'pmangalapuri', 'kmarshall', 'rvaidya', 'amishra'}",4,"The key insight from this discussion thread is that there are issues with page load time due to backend API calls and UI issues. There is a need to optimize the fetching of feature flags to reduce redundant calls and improve performance. Additionally, there is a suggestion to use caching for specific file types to further improve page load time.",12,"['backend API calls', 'UI issues', 'optimizing fetching of feature flags', 'caching for specific file types']","['page load time', 'redundant calls', 'performance']",,[]
3
+ 2023-09-08T03:04:21.079979,2023-09-08T03:47:52.769669,aganivada,"{'pmangalapuri', 'dmorampudi', 'aganivada'}",3,"The key insight from this discussion thread is that there were exceptions observed while trying to start the dev-ui locally, and it was determined that the issue may have been caused by recent changes in the axiamatic-ui. The problem was resolved and the change was merged.",6,"['exceptions observed', 'issue resolved', 'change merged']","['dev-ui not starting', 'issue caused by axiamatic-ui changes']",,[]
4
+ 2023-06-16T01:15:32.530969,2023-06-18T07:57:08.370239,bganganna,"{'akasim', 'bganganna', 'rvaidya', 'svummidi'}",4,"The key insight from this discussion thread is that there have been multiple instances of errors and service unavailability in the stage environment, which have been attributed to the message broker continuously restarting. The issue has been resolved by disabling automation tenant's subscriptions.",11,[],"['errors', 'service unavailability', 'message broker continuously restarting']",POSITIVE,['DISC-3178']
5
+ 2023-05-22T02:08:19.060449,2023-05-22T03:26:49.128309,gdahiya,"{'pmangalapuri', 'smurali', 'gdahiya'}",3,"The key insight from this discussion thread is that there is an issue with the pagination feature in the UI, where the page number selected is not being reset when changing filters. This results in empty pulse lists if the selected page does not have the desired filter criteria.",9,['pagination feature'],['empty pulse lists'],,['UI-2036']
6
+ 2023-02-15T11:30:10.385419,2023-02-15T19:51:59.357979,rtaraniganty,"{'rpandey', 'kmarshall', 'rtaraniganty'}",3,"The key insight from this discussion thread is that there was an issue with the date picker in the Chrome browser, but it was determined to be an external dependency and not a bug that could be fixed by the team.",6,['issue with date picker'],"['external dependency', 'bug not fixable']",,"['UI-1324', 'UI-1335']"
7
+ 2023-05-05T15:33:17.993209,2023-05-08T02:49:48.675729,anair,"{'pmangalapuri', 'mli', 'bot_message', 'anair'}",4,"The key insight from this discussion thread is that the team should implement logic to make the ""Enter"" key click the primary button on UI modals, regardless of the input field the user is in. This will ensure consistency and allow users to submit forms or show errors by pressing ""Enter"".",6,['implement logic to make Enter key click primary button on UI modals'],[],,['UI-1971']
8
+ 2023-02-26T20:00:54.128359,2023-02-26T20:02:37.130299,smurali,"{'smurali', 'rvaidya'}",2,"The key insight from this discussion thread is that the API endpoint ""all-products/paged"" is failing with a 500 error for a specific traceId, and the issue is being discussed and investigated by the individuals mentioned.",2,[],[],UNKNOWN,[]
9
+ 2023-06-15T17:13:09.830899,2023-06-15T20:13:06.569459,anair,"{'rvaidya', 'svummidi', 'anair'}",3,"The key insight from this discussion thread is that there is a bug with the email loading from the search box when adding stakeholders. The field goes blank when typing, even with one letter, and the search API is returning empty results.",5,"['bug with email loading from search box', 'search API returning empty results']",[],,[]
csv/apps-ui_messages.csv ADDED
The diff for this file is too large to render. See raw diff
 
csv/apps-ui_threads.csv ADDED
@@ -0,0 +1,389 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1682050855.210139
2
+ 1680770544.290229
3
+ 1675663700.871589
4
+ 1675410685.153119
5
+ 1675908289.895279
6
+ 1684778038.135339
7
+ 1677134613.741599
8
+ 1689582904.661069
9
+ 1676878559.483649
10
+ 1683514362.882309
11
+ 1677558591.315239
12
+ 1684741973.775309
13
+ 1687252699.510079
14
+ 1684477718.902579
15
+ 1685481416.908409
16
+ 1677744035.009729
17
+ 1683004167.144989
18
+ 1683878939.162309
19
+ 1672922399.711569
20
+ 1692168071.100019
21
+ 1691384309.455469
22
+ 1674036533.813039
23
+ 1683217579.600949
24
+ 1674529002.562499
25
+ 1677571243.935709
26
+ 1681924648.003619
27
+ 1686030099.660339
28
+ 1674706768.565549
29
+ 1694461879.634899
30
+ 1694470674.168419
31
+ 1677215389.223609
32
+ 1685579516.656549
33
+ 1677068270.313159
34
+ 1689745448.087509
35
+ 1691500327.144119
36
+ 1694423125.044779
37
+ 1681803913.685359
38
+ 1687516836.079799
39
+ 1691520763.954869
40
+ 1673573932.656169
41
+ 1692247607.953109
42
+ 1682672754.293859
43
+ 1677499083.904809
44
+ 1689123845.270409
45
+ 1692763463.239009
46
+ 1689728371.147419
47
+ 1682598765.419219
48
+ 1680768717.127119
49
+ 1682354487.417139
50
+ 1676264799.151889
51
+ 1692772238.636079
52
+ 1694029824.496749
53
+ 1686957650.916409
54
+ 1691492711.400989
55
+ 1683705145.377459
56
+ 1694760875.954839
57
+ 1673418471.900569
58
+ 1693926606.125839
59
+ 1678205255.985479
60
+ 1682600082.301189
61
+ 1685435250.025929
62
+ 1675073583.836399
63
+ 1673532212.645489
64
+ 1673373228.798489
65
+ 1680473217.611589
66
+ 1675078556.083619
67
+ 1686874389.830899
68
+ 1672852937.071429
69
+ 1680677237.193569
70
+ 1674656323.116449
71
+ 1679618271.182789
72
+ 1676018155.524969
73
+ 1692320841.319489
74
+ 1676646384.611809
75
+ 1678960274.788829
76
+ 1680521644.418279
77
+ 1683024747.129329
78
+ 1692259057.527529
79
+ 1679379354.968549
80
+ 1677080694.982859
81
+ 1682008866.351109
82
+ 1673927328.231009
83
+ 1675318866.767059
84
+ 1676489410.385419
85
+ 1675367246.901689
86
+ 1694583079.042669
87
+ 1691407901.522489
88
+ 1686549205.537259
89
+ 1694430286.354019
90
+ 1674566861.439989
91
+ 1685592156.041139
92
+ 1685426985.534039
93
+ 1676390988.443779
94
+ 1688681925.802109
95
+ 1676393296.402139
96
+ 1685343256.410399
97
+ 1683268438.569479
98
+ 1685591915.853199
99
+ 1676351459.141699
100
+ 1677525184.869859
101
+ 1686241557.239959
102
+ 1674782589.465429
103
+ 1675737761.409489
104
+ 1677656154.120229
105
+ 1678859987.730129
106
+ 1680746451.557969
107
+ 1679679652.902929
108
+ 1681368789.240519
109
+ 1675122732.307569
110
+ 1684784980.006279
111
+ 1679652511.722559
112
+ 1674111000.754359
113
+ 1675912911.958749
114
+ 1676300708.189889
115
+ 1693194347.991769
116
+ 1675147609.481709
117
+ 1675191219.988639
118
+ 1678764870.384369
119
+ 1691491239.882239
120
+ 1691151995.722929
121
+ 1677822302.615289
122
+ 1683257113.625529
123
+ 1673343553.574919
124
+ 1686282403.171439
125
+ 1682595131.320109
126
+ 1680698816.365159
127
+ 1675241176.375509
128
+ 1674643819.064039
129
+ 1673331562.778239
130
+ 1673008880.189219
131
+ 1675082868.728689
132
+ 1672981284.975619
133
+ 1694060811.064519
134
+ 1683279401.286529
135
+ 1686246445.464439
136
+ 1675457926.912849
137
+ 1683103116.654599
138
+ 1675082382.956189
139
+ 1680095623.374109
140
+ 1692247562.553999
141
+ 1683757967.909279
142
+ 1685439264.940699
143
+ 1684746499.060449
144
+ 1673251441.048439
145
+ 1693910782.853039
146
+ 1689691912.155139
147
+ 1677561948.715459
148
+ 1683224840.168189
149
+ 1674672029.231039
150
+ 1677470454.128359
151
+ 1676297535.530579
152
+ 1673588124.121579
153
+ 1692399830.002809
154
+ 1693292900.487869
155
+ 1680542361.659359
156
+ 1675402271.182049
157
+ 1674564345.675799
158
+ 1684629492.601709
159
+ 1686555784.497689
160
+ 1676297846.466549
161
+ 1693481339.058279
162
+ 1675169781.110329
163
+ 1676561451.635509
164
+ 1675402237.525829
165
+ 1674604291.882729
166
+ 1674805420.704459
167
+ 1677774741.643579
168
+ 1685592688.406809
169
+ 1675073187.587199
170
+ 1673493351.548169
171
+ 1675244592.348999
172
+ 1680625105.857989
173
+ 1688384543.545189
174
+ 1675246342.577429
175
+ 1674010529.175759
176
+ 1675900157.351279
177
+ 1692354818.666059
178
+ 1682435939.269419
179
+ 1680569852.121079
180
+ 1688105167.865599
181
+ 1676382635.010789
182
+ 1694204522.323759
183
+ 1677849246.076729
184
+ 1690475900.208779
185
+ 1692299896.303769
186
+ 1690965456.082819
187
+ 1674812187.632999
188
+ 1672705459.466199
189
+ 1685646798.710859
190
+ 1678780143.854389
191
+ 1676382599.253759
192
+ 1680569680.714119
193
+ 1674027156.046659
194
+ 1674028222.102959
195
+ 1679884948.211909
196
+ 1682655985.428839
197
+ 1680005221.828739
198
+ 1684271711.421579
199
+ 1685138021.986199
200
+ 1672775853.817269
201
+ 1692928188.575319
202
+ 1685427653.961269
203
+ 1677827132.066319
204
+ 1691521795.224399
205
+ 1680058265.667049
206
+ 1684130373.140019
207
+ 1679995141.928019
208
+ 1687432736.368929
209
+ 1673349565.502219
210
+ 1674529843.646489
211
+ 1679048725.789369
212
+ 1683054337.319479
213
+ 1679393404.685079
214
+ 1676058522.803929
215
+ 1681208191.477339
216
+ 1681343032.228449
217
+ 1677818811.635639
218
+ 1675334075.851639
219
+ 1684907057.280379
220
+ 1677511514.671249
221
+ 1679677294.121839
222
+ 1675833596.214619
223
+ 1673819855.847079
224
+ 1686050541.912869
225
+ 1684738389.987539
226
+ 1672775646.548929
227
+ 1685054216.945649
228
+ 1685065444.354649
229
+ 1679550748.888169
230
+ 1678214621.630249
231
+ 1675065107.813599
232
+ 1673234078.382489
233
+ 1683262267.261069
234
+ 1678211403.180599
235
+ 1672846055.903789
236
+ 1678877786.846349
237
+ 1694676836.699709
238
+ 1683756186.986289
239
+ 1686030206.631549
240
+ 1683885260.049049
241
+ 1693448406.303549
242
+ 1681847043.993829
243
+ 1679968205.500069
244
+ 1677139521.045149
245
+ 1679544452.201059
246
+ 1684481964.455019
247
+ 1688118923.695519
248
+ 1679491367.290599
249
+ 1679885841.132339
250
+ 1677167563.126949
251
+ 1691133503.582679
252
+ 1675225871.564729
253
+ 1678289865.062989
254
+ 1693464154.245489
255
+ 1682360714.826399
256
+ 1675061015.991089
257
+ 1673582071.751559
258
+ 1686903332.530969
259
+ 1683035756.330339
260
+ 1675934478.652149
261
+ 1692245327.688869
262
+ 1688108132.255539
263
+ 1687850310.128969
264
+ 1683247596.346169
265
+ 1679297987.611129
266
+ 1674791273.595849
267
+ 1687420270.540839
268
+ 1694167461.079979
269
+ 1680866155.568879
270
+ 1678333527.415459
271
+ 1677168306.963469
272
+ 1691476494.807619
273
+ 1673202087.670329
274
+ 1672947041.140229
275
+ 1674583275.339539
276
+ 1675722197.171509
277
+ 1688589903.217139
278
+ 1674550897.127889
279
+ 1673334699.932949
280
+ 1693701257.475979
281
+ 1692208052.716099
282
+ 1676261402.903949
283
+ 1680050333.035289
284
+ 1675380432.578659
285
+ 1672935458.988919
286
+ 1675312527.436469
287
+ 1680175931.994419
288
+ 1689158819.511469
289
+ 1680156000.784489
290
+ 1674832363.819059
291
+ 1679403364.819069
292
+ 1684475471.927829
293
+ 1686210764.430869
294
+ 1680173237.110949
295
+ 1685500805.894969
296
+ 1675394278.468799
297
+ 1680531420.498009
298
+ 1675091722.171429
299
+ 1694153276.376299
300
+ 1683926196.651269
301
+ 1677047326.863599
302
+ 1685560525.248229
303
+ 1679970062.382359
304
+ 1694576484.531609
305
+ 1683325997.993209
306
+ 1681238029.186929
307
+ 1676890839.106189
308
+ 1678993871.713879
309
+ 1686555506.312819
310
+ 1675458254.970209
311
+ 1686672028.620249
312
+ 1689824665.172129
313
+ 1675751426.777669
314
+ 1677827177.542439
315
+ 1694470500.220699
316
+ 1687537810.604859
317
+ 1685575995.369269
318
+ 1676346212.489299
319
+ 1693466682.256059
320
+ 1690803606.684039
321
+ 1673383677.454869
322
+ 1680744887.141709
323
+ 1691645332.108469
324
+ 1690354981.276419
325
+ 1691577844.085309
326
+ 1673927577.706539
327
+ 1687758109.128229
328
+ 1684927079.246829
329
+ 1687258524.962979
330
+ 1675189978.975639
331
+ 1691457914.114959
332
+ 1673507351.762069
333
+ 1688380661.262269
334
+ 1677576593.747269
335
+ 1676021435.590609
336
+ 1687805770.336669
337
+ 1691747903.641789
338
+ 1682488365.714009
339
+ 1692269904.417929
340
+ 1681454115.846469
341
+ 1677652449.035739
342
+ 1686121053.554889
343
+ 1691704761.049649
344
+ 1675904158.519599
345
+ 1675149371.854079
346
+ 1684434965.396049
347
+ 1675241360.221429
348
+ 1673522463.346419
349
+ 1684912340.650519
350
+ 1675810738.429019
351
+ 1674105625.811299
352
+ 1675785031.856289
353
+ 1677690348.103539
354
+ 1679547614.135609
355
+ 1676555742.486039
356
+ 1677502594.236349
357
+ 1680125723.457439
358
+ 1686208330.137789
359
+ 1690486290.384699
360
+ 1678694868.491129
361
+ 1683176183.766819
362
+ 1679641710.076519
363
+ 1675751846.602139
364
+ 1675652964.923189
365
+ 1679960210.023039
366
+ 1694495026.027029
367
+ 1685337450.743679
368
+ 1675804256.490369
369
+ 1674030596.816279
370
+ 1685024900.207689
371
+ 1678244494.156019
372
+ 1681425185.759139
373
+ 1687232805.236489
374
+ 1678417160.304749
375
+ 1675387829.906199
376
+ 1675974251.200119
377
+ 1679367639.341409
378
+ 1682681432.205349
379
+ 1674534805.105749
380
+ 1679638234.947989
381
+ 1678322941.791399
382
+ 1683129775.598219
383
+ 1674025161.759259
384
+ 1678671884.721079
385
+ 1675135249.237569
386
+ 1678068539.157049
387
+ 1678253883.358389
388
+ 1679968385.144999
389
+ 1678300442.320579
csv/platform-engg-updated.csv ADDED
The diff for this file is too large to render. See raw diff
 
csv/platform-engg.csv ADDED
The diff for this file is too large to render. See raw diff
 
csv/platform-engg_messages.csv ADDED
The diff for this file is too large to render. See raw diff
 
csv/platform-engg_threads.csv ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1680538173.801539
2
+ 1692834225.323139
3
+ 1683045441.298179
4
+ 1686879891.330729
5
+ 1681233546.774449
6
+ 1675219088.480769
7
+ 1682507945.086169
8
+ 1686586476.112839
9
+ 1677768700.036509
10
+ 1683044544.602179
11
+ 1679570898.093899
12
+ 1680493987.220499
13
+ 1680797669.930769
14
+ 1688712712.693079
15
+ 1680112156.981489
16
+ 1684215382.904919
17
+ 1685681026.535339
18
+ 1687246118.740619
19
+ 1684318623.949609
20
+ 1676263919.813159
21
+ 1688460874.469649
22
+ 1681234016.534809
23
+ 1680615325.207649
24
+ 1687245425.498079
25
+ 1679400916.716529
26
+ 1690564803.511329
27
+ 1689831702.731509
28
+ 1677555250.894129
29
+ 1694015610.021479
30
+ 1691732236.853499
31
+ 1678193171.898769
32
+ 1681314704.421059
33
+ 1681908421.968619
34
+ 1687152024.202269
35
+ 1682424984.011519
36
+ 1681435534.634889
37
+ 1688698250.047579
38
+ 1689259888.626099
39
+ 1679292204.788369
40
+ 1684814536.276599
41
+ 1685418540.326999
42
+ 1689290415.384039
43
+ 1690555192.578209
44
+ 1688390370.415719
45
+ 1677702192.166039
46
+ 1683618235.853069
47
+ 1687795459.476239
48
+ 1681964605.549509
49
+ 1684241669.302749
50
+ 1691459904.371619
51
+ 1687150990.549739
52
+ 1680018842.813839
53
+ 1685419995.607239
54
+ 1677475296.106199
55
+ 1682400318.581139
56
+ 1684217043.677469
57
+ 1680041665.863659
58
+ 1678428860.996399
59
+ 1679671449.439519
60
+ 1677651752.301219
61
+ 1688678414.314289
62
+ 1689867676.716119
63
+ 1692163734.970809
64
+ 1691776448.652279
65
+ 1691084550.001809
66
+ 1687539640.871109
67
+ 1683532298.230219
68
+ 1680656767.358329
69
+ 1687793876.824139
70
+ 1693381316.844789
71
+ 1690581213.247069
72
+ 1679964500.610319
73
+ 1677351784.805629
74
+ 1685527350.914489
75
+ 1672690702.300859
76
+ 1688449571.430299
77
+ 1689230921.402539
78
+ 1676652075.360069
79
+ 1689140218.535949
80
+ 1692806479.254729
81
+ 1681186785.522409
82
+ 1684748756.014699
83
+ 1676885034.950599
84
+ 1677681912.380929
85
+ 1686149934.127609
86
+ 1677777497.926499
87
+ 1686249255.904479
88
+ 1681206465.460379
89
+ 1677754540.935489
90
+ 1684818317.645079
91
+ 1693993596.265039
92
+ 1685441591.957109
93
+ 1676442504.806239
94
+ 1692605663.262809
95
+ 1679321897.804749
96
+ 1693812530.681339
97
+ 1685708567.882089
98
+ 1679065372.682699
99
+ 1676064650.127899
100
+ 1684993369.283339
101
+ 1680542234.836589
102
+ 1683749391.715059
103
+ 1685965661.110669
104
+ 1686890420.610789
105
+ 1689983654.559019
106
+ 1689324865.208239
107
+ 1684746143.559989
108
+ 1683309101.999949
109
+ 1680581305.085279
110
+ 1689362315.020609
111
+ 1690523608.265049
112
+ 1690589930.189259
113
+ 1673872682.157089
114
+ 1689665941.234589
115
+ 1680835914.112049
116
+ 1690451262.108649
117
+ 1683888514.387719
118
+ 1675224541.007139
119
+ 1690387130.221609
120
+ 1679002147.216069
121
+ 1680740083.605709
122
+ 1684243688.403699
123
+ 1685590689.881599
124
+ 1684344456.651589
125
+ 1691507070.318739
126
+ 1692763234.256229
127
+ 1677573370.171269
128
+ 1693198264.002789
129
+ 1676360439.718969
130
+ 1673888228.254499
131
+ 1680029086.585659
132
+ 1676612549.393719
133
+ 1692263935.187779
134
+ 1673386087.015369
135
+ 1691509328.712319
136
+ 1687851575.183979
137
+ 1689838654.208169
138
+ 1691080034.249959
139
+ 1676565328.500489
140
+ 1689226665.101559
141
+ 1689846860.478529
142
+ 1683142821.777179
143
+ 1672813232.401649
144
+ 1681917522.888679
145
+ 1677823170.289689
146
+ 1684148624.957249
147
+ 1673975093.086339
148
+ 1688638530.550119
149
+ 1677841959.789749
150
+ 1679383614.060059
151
+ 1678821539.394609
152
+ 1684685197.884949
153
+ 1687846600.854389
154
+ 1683263777.157669
155
+ 1683007390.160799
156
+ 1679289980.990969
157
+ 1690059760.859809
158
+ 1688998282.698019
159
+ 1679412406.904519
160
+ 1678865294.433639
161
+ 1683326838.929839
162
+ 1679321938.985919
163
+ 1687334230.646369
164
+ 1677672174.740919
165
+ 1688577977.016289
166
+ 1692823531.019669
167
+ 1686720987.555169
168
+ 1689256591.686259
169
+ 1689244486.577699
170
+ 1680630507.496229
171
+ 1693477195.981009
172
+ 1680286679.473949
173
+ 1689623321.990129
174
+ 1680220860.347599
175
+ 1677130766.792109
176
+ 1688999762.440219
177
+ 1683696958.568249
178
+ 1673348529.785699
179
+ 1678145752.152829
180
+ 1684755000.970569
181
+ 1683658391.433229
182
+ 1684570316.406549
183
+ 1684755867.194579
184
+ 1683147383.857809
185
+ 1690864515.078989
186
+ 1679422220.190789
187
+ 1677623368.389459
188
+ 1690868762.739819
189
+ 1681325132.393469
190
+ 1681280124.499599
191
+ 1676446062.081179
192
+ 1681268605.858639
193
+ 1680755519.784839
194
+ 1682336186.585829
195
+ 1694601295.005059
196
+ 1687950531.285219
197
+ 1675070132.783079
198
+ 1685445029.544959
199
+ 1646873474.414469
200
+ 1688367311.116169
201
+ 1692942863.174719
202
+ 1677582111.906139
203
+ 1684944832.532149
204
+ 1692891034.145749
205
+ 1685693821.105649
206
+ 1678387759.239149
207
+ 1685030656.536229
208
+ 1692878563.301209
209
+ 1672978506.456839
210
+ 1687551279.176689
211
+ 1683197749.854329
212
+ 1685104264.759009
213
+ 1672907416.886919
214
+ 1693403669.267489
215
+ 1685429383.901229
216
+ 1686633495.302029
217
+ 1693803512.798009
218
+ 1683090393.068739
219
+ 1677556536.414679
220
+ 1674771653.249369
221
+ 1681317539.108249
222
+ 1684232022.734789
223
+ 1676879426.013889
224
+ 1681242136.026399
225
+ 1681790429.403909
226
+ 1693312915.384959
227
+ 1689141351.400469
228
+ 1682316318.065599
229
+ 1675676945.028849
230
+ 1689221728.497939
231
+ 1683784308.556359
232
+ 1681877334.429929
233
+ 1679886081.225479
234
+ 1691663919.190519
235
+ 1673478411.493089
236
+ 1678246833.928209
237
+ 1680695120.610419
238
+ 1684257171.549539
239
+ 1694619849.085899
240
+ 1676993223.662999
241
+ 1692360841.807399
242
+ 1676444971.982239
243
+ 1673523711.639469
244
+ 1688386664.908239
245
+ 1676974766.439079
246
+ 1686556314.545279
247
+ 1690365115.404429
248
+ 1686724304.538569
249
+ 1683192179.672009
250
+ 1682490267.147919
251
+ 1673241490.412819
252
+ 1692268179.127169
253
+ 1680516947.597929
254
+ 1681346510.959149
255
+ 1684218586.384089
256
+ 1681341591.089739
257
+ 1691647134.784389
258
+ 1690790135.941269
259
+ 1682556071.572599
260
+ 1690232889.947669
261
+ 1684818084.842979
262
+ 1675178713.484429
263
+ 1677348176.055279
264
+ 1684228947.276629
265
+ 1679580518.710029
266
+ 1692405461.473719
267
+ 1683614386.558849
268
+ 1682308685.484719
269
+ 1676029528.861739
270
+ 1693464104.836679
271
+ 1683644993.173979
272
+ 1683657373.837949
273
+ 1685365174.355399
274
+ 1681108461.234639
275
+ 1678254053.890079
276
+ 1679070698.108989
277
+ 1691467589.197369
278
+ 1684926828.611679
279
+ 1692831799.469639
280
+ 1677848844.306539
281
+ 1687871035.398049
282
+ 1680059545.503019
283
+ 1687958351.883969
284
+ 1684215296.814089
285
+ 1684944658.529099
286
+ 1684394132.359469
287
+ 1690345415.964489
288
+ 1676641211.273499
289
+ 1681280961.862829
290
+ 1693410195.545539
291
+ 1672856401.708739
292
+ 1692894818.879419
293
+ 1689140516.958359
294
+ 1692848933.959189
295
+ 1686264405.265519
296
+ 1685947152.321359
297
+ 1686240468.613329
298
+ 1689004394.218519
299
+ 1692446281.934289
300
+ 1686785392.370739
301
+ 1681799669.540539
302
+ 1685545131.831239
303
+ 1680770423.709189
304
+ 1679400285.396849
305
+ 1675146545.464339
306
+ 1679001893.104389
307
+ 1681315106.697039
308
+ 1683591108.496209
309
+ 1691669913.833899
310
+ 1673333151.941449
311
+ 1682566271.384239
312
+ 1682495527.270939
313
+ 1678777462.829639
314
+ 1676365231.962859
315
+ 1693280392.926099
316
+ 1687434888.524229
317
+ 1689315398.223649
318
+ 1677240533.173869
319
+ 1687173596.532659
320
+ 1692288973.889709
321
+ 1683673303.692929
322
+ 1688566935.678079
323
+ 1691551940.939979
324
+ 1685599417.062969
325
+ 1694161461.533839
326
+ 1681983020.298699
327
+ 1690905827.239689
328
+ 1680068887.069559
329
+ 1680777599.194859
330
+ 1679899671.105509
331
+ 1680244373.213369
332
+ 1676565297.122469
333
+ 1676006557.919879
334
+ 1693540091.898339
335
+ 1680242029.986749
336
+ 1687245312.949629
337
+ 1690518421.919599
338
+ 1682350368.511449
339
+ 1676653770.772179
340
+ 1684944677.070379
csv/ux-reviews.csv ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ Start Time,Last Updated,Originator,Unique Users,Unique Users Count,Summary,Message Count,Positive Topics,Negative Topics,Overall Sentiment
2
+ 2023-01-23T22:48:47.143499,2023-01-24T15:12:29.869649,hchintamreddy,"{'mli', 'hchintamreddy', 'kmarshall'}",3,"The key insight from this discussion thread is that the team has decided to rename ""single choice"" to ""multiple choice"" for clarity. They also discussed implementing a maximum number of responses, a maximum character count, and potentially moving the detailed question breakdown from the Product Details page to the Pulse page.",5,[],[],,[]
3
+ 2023-09-04T16:18:51.264609,2023-09-04T23:06:14.233439,mli,"{'svummidi', 'mli'}",2,The key insight from this discussion thread is that the prioritization of user attributes for filtering engagement comments should be based on their expected usage and value to users. This will determine the default filter order and behavior.,3,[],[],NEUTRAL,[]
4
+ 2023-05-22T05:27:26.707819,2023-05-23T18:02:50.367029,smurali,"{'bot_message', 'mli', 'pmangalapuri', 'smurali'}",4,"The key insight from this discussion thread is that there is a suggestion to remove the ""Modify Template"" button and instead directly allow users to edit the template. Additionally, there is a request to fix the style of the ""Delete Template"" disabled button.",10,"['suggestion to remove Modify Template button', 'allow users to edit template directly']",['request to fix style of Delete Template disabled button'],,['UI-2049']
5
+ 2023-07-09T21:49:02.567219,2023-07-09T21:54:35.874049,smurali,"{'mli', 'smurali'}",2,The key insight from this discussion thread is that there are figma files available for different types of dropdowns used in the app. The links provided in the conversation lead to these files.,2,"['figma files', 'dropdowns']",[],,[]
6
+ 2023-05-09T19:42:06.894629,2023-05-10T14:58:26.063049,avenkataraman,"{'avenkataraman', 'mli', 'rvaidya'}",3,The key insight from this discussion thread is that the Product selector in Product details will be targeted for release in version 0.9.12 instead of 0.9.11.,4,[],[],NEUTRAL,[]
7
+ 2023-02-14T22:04:56.754949,2023-02-15T21:41:03.097969,asaludchua,"{'avenkataraman', 'asaludchua', 'mli', 'svummidi'}",4,"The key insight from this discussion thread is that there is a need to simplify the dropdowns for filtering without removing any functionality. There is also a discussion about introducing a Persona/Dimension toggle, but it is decided to retain the current dropdowns. There are also issues with the existing implementation that need to be addressed.",17,"['simplify dropdowns', 'retain functionality', 'Persona/Dimension toggle']",['issues with existing implementation'],,[]
8
+ 2023-01-08T21:09:34.758529,2023-01-09T03:16:46.721389,avenkataraman,"{'hchintamreddy', 'avenkataraman', 'pmangalapuri', 'rvaidya'}",4,The key insight from this discussion thread is that the team is reviewing the UI and UX for ad-hoc feedback and discussing the feasibility of new features. They are considering options for collecting feedback from the bot and discussing how to store and use the feedback. They also mention the possibility of adding sentiment analysis in the future.,5,"['reviewing UI and UX', 'collecting feedback from the bot', 'discussing feasibility of new features', 'considering options for storing and using feedback']",['none'],POSITIVE,[]
9
+ 2023-06-18T21:59:22.705779,2023-07-09T21:53:17.456149,rpandey,"{'rpandey', 'mli'}",2,The key insight from this discussion thread is that the team is planning to switch to the react-datepicker library for improved user experience and they have identified key variations of date pickers that they will use. They also plan to migrate the existing datepicker across the app.,5,[],[],,[]
csv/ux-reviews_messages.csv ADDED
The diff for this file is too large to render. See raw diff
 
csv/ux-reviews_threads.csv ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1677132499.499759
2
+ 1676368312.978529
3
+ 1694429026.322079
4
+ 1676996853.829589
5
+ 1673240974.758529
6
+ 1687161792.742059
7
+ 1674028718.592689
8
+ 1681911636.808879
9
+ 1685692819.733239
10
+ 1686885531.853399
11
+ 1683686526.894629
12
+ 1676462987.275509
13
+ 1677076953.141079
14
+ 1682329919.737699
15
+ 1674542927.143499
16
+ 1687150762.705779
17
+ 1688964542.567219
18
+ 1680046641.000979
19
+ 1679651971.492669
20
+ 1694123912.807829
21
+ 1675072638.818399
22
+ 1693869531.264609
23
+ 1691771178.234959
24
+ 1692266567.321719
25
+ 1681897527.812889
26
+ 1694120024.651449
27
+ 1680030442.838429
28
+ 1692702374.949889
29
+ 1673249418.093839
30
+ 1693984667.500059
31
+ 1694208118.937009
32
+ 1674673903.920549
33
+ 1683619115.758839
34
+ 1677045474.593479
35
+ 1693485072.682329
36
+ 1674547192.762339
37
+ 1676364063.332999
38
+ 1677142628.661239
39
+ 1680159404.550459
40
+ 1682400315.583469
41
+ 1694064023.092639
42
+ 1679983113.345289
43
+ 1694089383.499369
44
+ 1679898727.181979
45
+ 1691632573.005499
46
+ 1684758446.707819
47
+ 1694370885.921519
48
+ 1673241128.753499
49
+ 1693275536.361679
50
+ 1692283112.583299
51
+ 1677474827.069339
52
+ 1692839869.162239
53
+ 1686867716.602079
54
+ 1692319602.472129
55
+ 1691989212.153659
56
+ 1684216846.481669
57
+ 1677727770.387179
58
+ 1676441096.754949
59
+ 1680009099.455199
60
+ 1674013395.573989
61
+ 1691716955.826809
csv/vms-engg.csv ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Thread Timestamp,Originator,Unique Users,Summary,Message Count,Positive Topics,Negative Topics,Overall Sentiment
2
+ 1693936814.718349,U02SCRTM2M7,"{'U03RSS0S76Y', 'U02GC8SE18V', 'U02SCRTM2M7', 'U0336QZAF98', 'U040RCBPBEC'}","The team discusses an issue where there are pulse instances in the score provider that do not exist in the pulse manager, causing the summary/sidebar to be empty. They consider excluding these old pulses using the pulse manager API. Pulse deletion is no longer supported from the dashboard.",12,"['Issue with pulse instances', 'Excluding old pulses using pulse manager API']",['Pulse deletion not supported from the dashboard'],NEGATIVE,[]
3
+ 1690297147.829179,U0336QZAF98,"{'U0431DZTPJM', 'U0336QZAF98'}",The discussion thread is about errors in the estimation service in INT. The user U0336QZAF98 mentions that there are errors related to the pulse_survey_expire event and asks for it to be removed from the estimation-axm-sqs code. User U0431DZTPJM agrees to do it and provides a link to the commit and merge request.,4,[],"['errors in the estimation service', 'pulse_survey_expire event']",,[]
4
+ 1689930443.185759,U02SCRTM2M7,"{'U02HQ78V9A5', 'U02SCRTM2M7', 'U040RCBPBEC', 'U02GC8SE18V'}","The team discusses an issue with querying the score-provider API. They share the request and response details, and mention creating a JIRA ticket for tracking the issue. They also mention deploying the latest build and checking the commit log for bug fixes. The issue is assigned to U040RCBPBEC for investigation and resolution.",9,"['querying score-provider API', 'sharing request and response details', 'creating JIRA ticket', 'deploying latest build', 'checking commit log', 'assigning issue to U040RCBPBEC']",['issue with querying score-provider API'],,[]
5
+ 1689785132.353669,U055SRY74R0,"{'U055SRY74R0', 'U040RCBPBEC'}",The discussion is about running Llama2 locally on a Mac. U040RCBPBEC suggests using quantization to reduce the number of features in the embeddings for smaller hardware. They also mention that the quality of an earlier version of Llama was not great and it was slow. U055SRY74R0 acknowledges this and mentions that Microsoft Azure offers Llama in their model library for a price of 9K per month with 500GB RAM. No references or links are mentioned.,3,"['running Llama2 locally on a Mac', 'using quantization to reduce features']","['poor quality of earlier version of Llama', 'slow performance of earlier version of Llama']",NEUTRAL,[]
6
+ 1684172726.358769,U02Q02G09QX,"{'U02Q02G09QX', 'U03ML44ADTQ', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about generating pulse questions for templates using AI. The team is seeking feedback on the questions generated by OpenAI. They discuss the number and type of questions, with suggestions for positive, negative, and investigative questions. They also mention the possibility of controlling the question generation parameters from the backend. There is a suggestion to explore product-specific questions by personas. Feedback is given on focusing on factors users have disliked about Splunk, such as pricing, data ingestion, and dashboards. The team discusses the impact of the questions on Splunk users and suggests specific questions related to query language, graphing and charting capabilities, alerting capabilities, and query functionality on logs.",9,"['feedback on questions generated by OpenAI', 'controlling question generation parameters', 'exploring product-specific questions by personas', 'suggestions for specific questions related to query language, graphing and charting capabilities, alerting capabilities, and query functionality on logs']","['focusing on factors users have disliked about Splunk', 'pricing', 'data ingestion', 'dashboards']",MIXED,[]
7
+ 1691606946.827549,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about adding a change to the hotfix branch. The change involves using the JsonJacksonCodec with Redisson to convert key and values to strings. It is suggested to define the ObjectMapper as a bean and pass it as a parameter to the redissonCacheManager. Existing caches need to be cleared and a merge request will be created tomorrow.,7,"['adding change to hotfix branch', 'using JsonJacksonCodec with Redisson', 'defining ObjectMapper as a bean', 'passing ObjectMapper as parameter to redissonCacheManager', 'clearing existing caches', 'creating merge request']",[],,[]
8
+ 1690782580.793189,U03KLHDKL1H,"{'U02Q02G09QX', 'U02BV2DGUKC', 'U03KLHDKL1H', 'U03DHUAJVMK', 'U040RCBPBEC'}","The discussion thread revolves around a cleanup job that is failing due to an incorrect variable name. The Imply host is not active, causing the job to fail. The purpose of the cleanup job is to remove test segments created by end-to-end system tests. The job is considered safe as long as there is no real data within the specified time intervals. There is a suggestion to include scoring-related tests in daily sanity runs for better integration testing. No specific JIRA ticket or links are mentioned in the discussion.",15,"['cleanup job', 'safe job', 'scoring-related tests', 'daily sanity runs', 'integration testing']","['incorrect variable name', 'Imply host not active', 'job failure', 'no real data', 'missing JIRA ticket or links']",NEGATIVE,[]
9
+ 1687248049.813769,U042KRZPXHT,"{'U03KLHDKL1H', 'U0336QZAF98', 'U042KRZPXHT'}",The discussion thread is about the estimation service being down in the INT environment. There was an update going on which caused deployments to fail due to a required dependency. The logs showed liquibase and bean creation errors. The team resolved the issue by deploying to a previous instance once the update was completed. The deployment was successful and the service is now up in INT.,7,"['successful deployment', 'service up in INT']","['estimation service down', 'deployments fail', 'required dependency error', 'liquibase error', 'bean creation error']",,[]
10
+ 1687146626.762489,U03NZ7Z52S2,"{'U0336QZAF98', 'U03NZ7Z52S2', 'U040RCBPBEC', 'U02GC8SE18V'}","The dashboard was not loading due to a failure in the summary API, which was causing an error in getting a connection from the data source. The issue was investigated by rsrinivasan and bganganna rvaidya, and it was found that the connectivity to Druid was broken. After fixing the connectivity issue, the dashboard started loading again. The root cause of the issue was not mentioned in the discussion thread.",8,"['dashboard loading', 'connectivity issue fixed']","['summary API failure', 'connection error', 'Druid connectivity broken']",,[]
11
+ 1683682555.691819,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread includes comments on various code improvements such as fixing a typo in the requirements.txt file, upgrading the llama index, adding more details to the open text comment, renaming a class, implementing back-off handling, generalizing a class, considering caching cohort filter generation, and removing the limit on pulse instances. The thread also mentions the possibility of creating a summary using separate document chunks and suggests doing a POC along with summaries. No specific JIRA ticket or links are mentioned.",2,"['fixing typo in requirements.txt file', 'upgrading llama index', 'adding more details to open text comment', 'renaming a class', 'implementing back-off handling', 'generalizing a class', 'considering caching cohort filter generation', 'removing limit on pulse instances', 'creating summary using separate document chunks', 'doing POC along with summaries']",[],,[]
12
+ 1693256845.409949,U026PMDB1ND,"{'U02Q02G09QX', 'U026PMDB1ND'}","The discussion thread revolves around the deployment issue of the 'vms-askai-service' repository. The user encountered a ""ModuleNotFoundError"" due to a missing module. It was suggested that the environment might not be set correctly. The user confirmed that it was their first time deploying the service from their current laptop. No JIRA ticket or other links were mentioned in the discussion.",51,"['deployment issue', 'vms-askai-service']","['ModuleNotFoundError', 'missing module', 'environment not set correctly', 'first time deploying']",,[]
13
+ 1686821451.928689,U0336QZAF98,"{'U0336QZAF98', 'bot_message'}",The discussion thread is about the AvaticaPolarisHttpClient making a token call for every request. The issue has been logged as COLL-2577 and a task has been created to change the Avatica client to use an API key. The current solution is to add trace logging for acquiring the Polaris connection.,2,"['task created to change Avatica client to use API key', 'trace logging for acquiring Polaris connection']",['AvaticaPolarisHttpClient making token call for every request'],NEUTRAL,[]
14
+ 1693534907.966809,U03DHUAJVMK,"{'U03DHUAJVMK', 'bot_message'}","The user, U03DHUAJVMK, pointed out that they only receive responses for ""factors influencing sentiment"" and get an error for other questions. They asked if this is a configuration change that can be included in version 0.9.14 HF. The bot, cc bganganna, created a bug ticket DAT-1332 to address this issue.",2,"['configuration change', 'version 0.9.14 HF']","['error', 'bug ticket DAT-1332']",,[]
15
+ 1690414991.986729,U040RCBPBEC,"{'U0431DZTPJM', 'U0336QZAF98', 'U040RCBPBEC', 'U026PMDB1ND'}","The discussion thread involves team members discussing deployment issues and code changes related to the askAI service. There are mentions of errors in locating QDRANT_SECRET and QDRANT_URL, a typo in the code, issues with the poetry.lock file, and a revert of changes made by Anzar. The lock file is regenerated and the pipeline passes.",20,"['deployment issues', 'code changes', 'revert of changes', 'regenerated lock file', 'pipeline passes']","['errors in locating QDRANT_SECRET', 'errors in locating QDRANT_URL', 'typo in the code', 'issues with poetry.lock file']",,[]
16
+ 1688621936.658079,U03RSS0S76Y,"{'U03RSS0S76Y', 'U040RCBPBEC'}","The discussion thread is about reviewing initial API specs for the CISO Dashboard. The score-provider gives a score at the project level, with pointDTO representing the current score and pointDiff.comparedTo representing the previous score. The API has been modified to only include trend difference and direction, rather than absolute score values for two periods.",5,"['API specs', 'CISO Dashboard', 'score-provider', 'pointDTO', 'trend difference', 'direction']",['absolute score values'],NEUTRAL,[]
17
+ 1683610546.284609,U0336QZAF98,"{'U02Q02G09QX', 'U0336QZAF98'}","The discussion thread involves U0336QZAF98 and U02Q02G09QX discussing the usage and cost of the OpenAI token for an EC2 instance. U0336QZAF98 mentions that there were requests to the Davinci model on May 6 and May 8, and they analyze the cost based on a previous proof of concept (POC). U02Q02G09QX notices that the token's usage shows $0, indicating that no one has used AI chat that day. U0336QZAF98 confirms that they did not change the token and suggests investigating the surge in requests.",9,"['usage of OpenAI token', 'cost analysis', 'previous proof of concept']","['no usage of AI chat', 'surge in requests']",,[]
18
+ 1678324817.675569,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about reviewing the steps for the 0.9.9 update for the Druid spec. It is mentioned that the details need to be updated for the pulse instance status. The changes were made only for the follow-up comments count feature. There is a request to add instructions for ""pulse_instance_state"" and to merge the changes made in the INT environment.",5,"['reviewing steps', 'changes for follow-up comments count', 'adding instructions for pulse_instance_state', 'merging changes in INT environment']",['details need to be updated for pulse instance status'],NEUTRAL,[]
19
+ 1693497864.592319,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about an issue with the tree summarizer in the llamaindex project. The error is caused by a maximum recursion depth being exceeded while calling a Python object. The impact and possible workaround are discussed, and it is suggested to make the tree summarizer configurable. The use of an org account for public interactions is also mentioned. A comment is removed, and it is suggested to handle the issue of empty input data by throwing an exception instead of disabling the tree summary mode.",7,"['issue with tree summarizer', 'possible workaround', 'making tree summarizer configurable', 'use of org account for public interactions']","['maximum recursion depth exceeded', 'comment removed', 'handling empty input data']",MIXED,[]
20
+ 1693407797.790539,U040RCBPBEC,"{'bot_message', 'U03RSS0S76Y', 'U040RCBPBEC'}","The team discussed adding score drop notifications for the Voice of Team (VOT) feature in the next sprint. They planned to evaluate pulse scores and create an event with details like metadata, engagement and overall scores for both the pulse and product instances. They scheduled a meeting to discuss further details and timeline workflow. The JIRA ticket for this task is DAT-1329.",5,"['adding score drop notifications for VOT feature', 'evaluating pulse scores', 'creating event with metadata, engagement, and overall scores', 'scheduling meeting to discuss further details and timeline workflow']",[],POSITIVE,[]
21
+ 1692793750.494569,U0336QZAF98,"{'U03RSS0S76Y', 'U0336QZAF98'}","The discussion thread is about the latest hotfix deployed in the stage and its impact on trend analysis. The user ""snangia"" asks for confirmation if trend analysis is working as expected. The user ""rsrinivasan"" inquires about any recent changes related to trend analysis. ""snangia"" clarifies that there were no changes in trend analysis, only refactoring of prompts configuration. However, they express uncertainty about potential side effects and request the tenant ID and product instance ID for testing. ""rsrinivasan"" acknowledges that something broke with the new prompts and shares a summary of the issue they encountered. They also mention that the replacement of ""N/A"" with custom code did not work as expected.",8,"['hotfix', 'trend analysis', 'refactoring']","['uncertainty', 'side effects', 'break', 'issue', 'replacement']",,[]
22
+ 1692764252.589389,U0336QZAF98,"{'bot_message', 'U0336QZAF98', 'U040RCBPBEC', 'U02GC8SE18V'}","The discussion thread addresses the issue of duplicate items in the timeline summaries. It was discovered that the duplicates were caused by the score provider. The pulse instance ID ""71936"" appeared in the timeline summaries for June, July, and August. No references to JIRA tickets or other links were mentioned in the thread.",12,"['duplicate items', 'timeline summaries', 'score provider']",[],NEUTRAL,[]
23
+ 1692228867.663659,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}",The discussion is about the mapping of the timestamp column in Qdrant. rsrinivasan asks if it is mapped to the TTL of the pulse or the data ingestion time to Qdrant. akalyta confirms that they are also using it and asks if anyone has verified this. svummidi responds that it is mapped to the endedAt property of pulseInstance. No JIRA ticket or other links are mentioned.,2,"['mapping of timestamp column', 'using timestamp column']",['no JIRA ticket or links mentioned'],NEUTRAL,[]
24
+ 1691163109.909519,U040RCBPBEC,"{'U055SRY74R0', 'U040RCBPBEC'}","U040RCBPBEC asks svummidi to check if their next sprint tasks have been added to the sprint, as they plan to start it in an hour. U055SRY74R0 responds that they have not received their upcoming tasks yet, but will add them once they do.",2,[],[],NEUTRAL,[]
25
+ 1690415903.856139,U040RCBPBEC,"{'U0431DZTPJM', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about confirming tasks for the next sprint. U040RCBPBEC asks ppant and rsrinivasan to confirm their tasks. U0336QZAF98 adds their tasks and plans to check with ppant. U0431DZTPJM also adds their tasks. No JIRA ticket or other links are mentioned.,4,"['confirming tasks', 'adding tasks']",['no JIRA ticket or links mentioned'],,[]
26
+ 1681070696.868299,U042KRZPXHT,"{'U0336QZAF98', 'U042KRZPXHT', 'U040RCBPBEC'}",The discussion thread is about adding a `groupBy` field in the sentiment-analysis timeseries API. The user wants to know which fields are supported in `groupBy` and also requests to add `success` and `error` fields in the API. Another user suggests using HTTP status codes to determine success or error. The conversation includes links to the API documentation.,6,"['groupBy field', 'API documentation']",['error field'],,[]
27
+ 1692205569.595599,U03RSS0S76Y,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread revolves around the issue of the score not changing for the Sprint Execution initiative. It is mentioned that the score did not change due to an ingestion issue, specifically the AskAi URL coming as empty. The team discusses the involvement of AskAi in the score change and suggests showing a message instead of an empty state when there are no significant changes in the pulse feedback. They also discuss the possibility of showing a message when there are no new pulses compared to the previous month.",19,"['Involvement of AskAi in score change', 'Showing message instead of empty state', 'Showing message when no significant changes in pulse feedback']","['Score not changing for Sprint Execution initiative', 'Ingestion issue with AskAi URL', 'No new pulses compared to previous month']",NEUTRAL,[]
28
+ 1691513568.063179,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The team needs a script or tool like retool to easily populate dummy cache data for trend, timeline, and chat. The suggestion is to do it on-demand in this release and then build tooling based on usage patterns. For now, a wiki page explaining how to do it will suffice, with assistance from the data team.",2,"['retool', 'populate dummy cache data', 'wiki page']",['none'],,[]
29
+ 1691089918.186659,U026PMDB1ND,"{'U02Q02G09QX', 'U026PMDB1ND'}","The discussion thread is about why a service is being bounced frequently. The reason is that there are several merges happening daily, and bouncing the service helps in quickly pulling the new image with the same tag. No specific JIRA ticket or other links are mentioned.",5,['quickly pulling new image'],['service being bounced frequently'],NEUTRAL,[]
30
+ 1689603637.708599,U02GC8SE18V,"{'U03RSS0S76Y', 'U040RCBPBEC', 'U02GC8SE18V'}","The discussion is about the significance of the trendTaskId returned when querying for single or multiple tree nodes. The first question is whether the response can be queried using only the trendTaskId. The second question is whether all the nodes need to be queried together or if they can be queried individually with the same trendTaskId. The reason for these questions is to determine the best approach for querying the 2X2 matrix. There is also a suggestion to return task ids even if the data is already in cache, or to use the same API with individual nodes instead of the whole list. Additionally, there is a question about whether the engagementId should be sent by the apps or if the data should include it in the response. No specific details or references to JIRA tickets or other links are mentioned.",3,"['Significance of trendTaskId', 'Querying response using trendTaskId', 'Querying individual nodes with same trendTaskId', 'Returning task ids even if data is in cache', 'Using API with individual nodes', 'Including engagementId in response']",[],,[]
31
+ 1694494882.287169,U0336QZAF98,"{'U03RSS0S76Y', 'U03NZ7Z52S2', 'U02GC8SE18V', 'U02SCRTM2M7', 'U0336QZAF98'}","The discussion thread includes a suggestion to check for caching issues in the estimation service. There is a proposal to exclude pulses where the closeTime is not within the start and end dates. There is also a suggestion to separate pollIds into pollIds and carriedOverIds for better query capabilities. Concerns are raised about additional API calls and the need for precomputed data. The issue of counts not matching when the summary feature flag is on is mentioned, and it is suggested to wait for the summaries to generate and check the close times of the pulses. The API response from the estimation service for the retro tenant, platform engagement is shared.",40,"['caching issues in estimation service', 'separating pollIds into pollIds and carriedOverIds', 'checking closeTime of pulses', 'API response from estimation service']","['additional API calls', 'need for precomputed data', 'counts not matching with summary feature flag on']",NEUTRAL,[]
32
+ 1692285025.842729,U03RSS0S76Y,"{'U03RSS0S76Y', 'U040RCBPBEC'}","The discussion thread is about protecting a specific branch in a GitLab merge request. They also discuss finding a tenant with good data for trend analysis, and mention a tenant on the int environment. There is a formatting issue with the summaries, and they discuss using bullet forms and markdown for better formatting. No specific JIRA ticket or other links are mentioned.",6,"['protecting branch in GitLab merge request', 'finding tenant for trend analysis', 'using bullet forms and markdown for formatting']",['formatting issue with summaries'],,[]
33
+ 1692186927.776359,U03DHUAJVMK,"{'U0431DZTPJM', 'U0336QZAF98', 'U03DHUAJVMK', 'U03RSS0S76Y'}","The discussion thread involves deployment issues with the askai hf on int and stage environments. There were merge requests and fixes made to resolve the issues. The migration job was started in the int environment, and after testing, the deployment was bounced in the stage environment. The thread also mentions summarizing pulses for tenants 15328, 17875, and 16992. No specific JIRA ticket or other links are mentioned.",30,"['merge requests', 'fixes', 'migration job', 'deployment bounce', 'summarizing pulses']",['deployment issues'],NEUTRAL,[]
34
+ 1691464939.124319,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about populating AskAi qdrant data in the retro tenant and releasing it. The plan is to load one pulse at a time using a Python script to avoid hitting thresholds. Another option is to create a migration job and API spec in AskAi to trigger the migration. The steps will be documented for future reference.,6,"['Populating AskAi qdrant data', 'Loading one pulse at a time', 'Using Python script', 'Creating migration job', 'Creating API spec', 'Documenting steps']",['Hitting thresholds'],NEUTRAL,[]
35
+ 1691007887.306349,U03RSS0S76Y,"{'U03RSS0S76Y', 'U040RCBPBEC'}",The discussion thread involves svummidi requesting svummidi to clear the pipeline runner cache for the estimation service and protect a specific branch. snangia confirms that the cache has been cleared and rtaraniganty has changed the branch to a protected one. snangia also requests svummidi to update the branch back to develop after testing is completed. No references to JIRA or other links are mentioned.,3,"['Clearing pipeline runner cache', 'Protecting a specific branch', 'Cache cleared', 'Branch protected', 'Updating branch after testing']",[],,[]
36
+ 1690882996.437169,U0336QZAF98,{'U0336QZAF98'},"The discussion thread is about changing the root path of the vms-services-aski to ""vms-services-askai"" to follow the same convention as other services. The user provides a command to update the remote URL and suggests running it at the root of the local repository. No references to JIRA or other links are mentioned.",4,"['changing root path', 'follow convention']",['no JIRA reference'],,[]
37
+ 1690479597.265909,U040RCBPBEC,"{'U0431DZTPJM', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about an error encountered while installing a package using Poetry. The error is related to a digest mismatch, which is caused by a new build for the events_common package with the same version. The solution is to regenerate the lock file to include the new build. The team also discusses the need to ensure everyone is using the same version of Poetry. A document with common issues and a suggestion to mention the Poetry version in pyproject.toml is mentioned. The thread ends with a plan to include the diff in the merge request for further discussion. No references to JIRA or other links are provided.",11,"['solution to regenerate lock file', 'discussion about ensuring same version of Poetry', 'mentioning Poetry version in pyproject.toml', 'plan to include diff in merge request']","['error encountered while installing package using Poetry', 'digest mismatch caused by new build for events_common package']",NEUTRAL,[]
38
+ 1678560732.520929,U040RCBPBEC,"{'U02Q02G09QX', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread revolves around the exploration of LlamaIndex for summarization use cases. The participants discuss the benefits and applications of LlamaIndex, such as sentiment improvements and holistic data inference. They also mention the possibility of creating a Wiki page to summarize the technology. The thread includes references to the LlamaIndex documentation and an article explaining its functionality. JIRA ticket: <https://pinstripe.atlassian.net/wiki/spaces/PRODUCT/pages/546340912/Creating+custom+GPT+indexes+with+LlamaIndex>",9,"['benefits of LlamaIndex', 'applications of LlamaIndex', 'sentiment improvements', 'holistic data inference', 'creating a Wiki page']",[],POSITIVE,[]
39
+ 1676522127.824829,U02SF36PVKL,"{'U02SF36PVKL', 'U040RCBPBEC', 'U02GC8SE18V'}",The discussion thread is about tracking the relationship between parent questions and follow-up questions in the sentiment heatmap. They discuss passing information such as parentPulseQuestionId while pushing data to VMS and storing the relation in Postgres and Druid. They also mention the need for time range-based queries and additional groupBys in the Druid schema. A JIRA ticket for this discussion is mentioned: <https://pinstripe.atlassian.net/browse/COLL-1913>.,9,"['tracking relationship between parent questions and follow-up questions', 'passing information such as parentPulseQuestionId', 'storing relation in Postgres and Druid', 'time range-based queries', 'additional groupBys in Druid schema']",[],NEUTRAL,[]
40
+ 1676192765.515999,U042KRZPXHT,"{'U0336QZAF98', 'U042KRZPXHT', 'U02GC8SE18V'}","The discussion thread is about the absence of the ""success"" and ""error"" fields in the response of sentiment-analysis APIs. User U042KRZPXHT created a JIRA ticket (DAT-840) to track this issue. User U0336QZAF98 mentions that some APIs in estimation also lack these fields. User U042KRZPXHT and U02GC8SE18V express surprise and suggest that this issue was overlooked previously.",4,['success and error fields in sentiment-analysis APIs'],['absence of success and error fields in sentiment-analysis APIs'],NEUTRAL,[]
41
+ 1694038436.616079,U040RCBPBEC,"{'U0431DZTPJM', 'U02Q02G09QX', 'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread includes plans for the upcoming week. U040RCBPBEC plans to work on refactoring API clients, POC work for passive monitoring, a bug related to score provider, and testing with Lastpass data. Other team members have plans related to fixing NaN values, deduplication, regression testing, chat improvements, retry configuration, hierarchical testing, celery opentelemetry integration, pulse exclusion, pulse responses data migration, event metrics summary, handling pulse close event, and integration test improvements. No specific JIRA tickets or links are mentioned.",7,"['refactoring API clients', 'POC work for passive monitoring', 'testing with Lastpass data', 'fixing NaN values', 'deduplication', 'regression testing', 'chat improvements', 'retry configuration', 'hierarchical testing', 'celery opentelemetry integration', 'pulse exclusion', 'pulse responses data migration', 'event metrics summary', 'handling pulse close event', 'integration test improvements']",['bug related to score provider'],NEUTRAL,[]
42
+ 1692336883.766669,U02SCRTM2M7,"{'U02SCRTM2M7', 'U0336QZAF98'}","The discussion thread is about the failure of the Timeline API on the stage for the dashboard page. The error message indicates a problem with the script, specifically with the 'unpack' function. The issue was resolved after further investigation. No JIRA ticket or other links were mentioned.",4,[],['failure of Timeline API on stage for dashboard page'],NEGATIVE,[]
43
+ 1692316890.207469,U040RCBPBEC,"{'U0431DZTPJM', 'U03RSS0S76Y', 'U040RCBPBEC'}",The discussion thread is about handling N/A summaries in the UI for pulses that closed without any participants. The team discusses clearing the cache at the tenant level and investigates issues with trend analysis summaries. They also mention deploying version 0.0.1.2 in the INT environment. No specific JIRA ticket or links are mentioned.,17,"['Clearing cache at tenant level', 'Deploying version 0.0.1.2 in INT environment']","['Issues with trend analysis summaries', 'Handling N/A summaries in UI for closed pulses without participants']",NEUTRAL,[]
44
+ 1691665111.654759,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about the deployment of code and the use of the CDK. The main branch is still using old code, so deployment is being done from the release/0.9.14 branch or develop branch. There is also mention of editing in Redis directly. One person apologizes for using the incorrect CDK during testing.",4,"['deployment of code', 'use of CDK']","['old code', 'editing in Redis directly', 'incorrect CDK']",,[]
45
+ 1690459135.080949,U02SCRTM2M7,"{'U02SCRTM2M7', 'U040RCBPBEC', 'U02GC8SE18V'}","The discussion thread is about duplicate entries in the response for the timeline API. U02SCRTM2M7 reported the issue and provided all the necessary details in the JIRA ticket DAT-1196. U02GC8SE18V asked for an update on the issue, and U040RCBPBEC apologized for forgetting to fix it but mentioned that the fix has been deployed and verified. U02SCRTM2M7 confirmed that the fix is working.",4,['fix deployed and verified'],['duplicate entries in response'],,[]
46
+ 1689108850.114399,U040RCBPBEC,"{'U02Q02G09QX', 'U040RCBPBEC', 'U02GC8SE18V'}","The discussion thread is about testing data in the 44077 tenant. The user akalyta copied Mattel data from Prod to the tenant with the product name as Acme. The data is considered good for testing because it has user attributes and question dimensions. The user U02Q02G09QX is experiencing an error when logging into the int environment, but svummidi suggests clicking on engagements to see the list of projects. U02GC8SE18V asks svummidi to share the credentials 1:1, as they would like to test sorting heatmap on this data. rvaidya is invited as an admin to the tenant and is provided with the account password.",7,"['testing data', 'good for testing', 'user attributes', 'question dimensions', 'clicking on engagements', 'sorting heatmap']","['error when logging in', 'sharing credentials', 'providing account password']",MIXED,[]
47
+ 1682866750.223539,U03DHUAJVMK,"{'U02BV2DGUKC', 'U03DHUAJVMK', 'U0336QZAF98', 'U042KRZPXHT'}","The discussion thread is about a null value for the date in production tenants. It is mentioned that a new field is being used in the backend to save the date, which may not be populated for old comments. The issue is being addressed by migrating the question created_at and updated_at fields to the estimation service. Repopulation of the data is required either through the PMS API or a database script. No bouncing of the estimation service is necessary. The change has been made for all production tenants.",8,"['new field in backend', 'migrating question created_at and updated_at fields', 'repopulation of data']",['null value for date in production tenants'],,[]
48
+ 1682400569.629159,U040RCBPBEC,"{'U02Q02G09QX', 'U040RCBPBEC'}",The discussion thread involves a conversation between U040RCBPBEC (akalyta) and U02Q02G09QX (svummidi) regarding an issue with getting proper responses in their product. They suspect that the model is confused and are investigating the issue further. They decide to change the model to davinci and discuss the issue with embeddings in the responses. They also mention making updates and fixing errors on the server. No specific JIRA ticket or other links are mentioned.,15,"['model change to davinci', 'discussion on embeddings in responses', 'making updates on server', 'fixing errors on server']","['issue with getting proper responses', 'model confusion']",,[]
49
+ 1682345455.049449,U040RCBPBEC,"{'U02Q02G09QX', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread includes updates on the POC demo, changes made to the EC2 Llama index for security and caching, and new findings for the design. It is mentioned that the stage ECS IP addresses were not added to whitelisting initially, but after adding them, testing in stage was successful. The use of sbert as an alternative to OpenAI embeddings is also discussed. The feedback collection API for the chat UI has not been started yet due to other tasks and cost issues. The issue of caching and loading the model from S3 is mentioned, and it is noted that the huggingface demo is not updated with the fixes.",7,"['POC demo updates', 'Successful testing in stage after adding ECS IP addresses to whitelisting', 'Discussion on using sbert as an alternative to OpenAI embeddings']","['Changes made to EC2 Llama index for security and caching', 'Feedback collection API for chat UI not started yet', 'Issue with caching and loading model from S3', 'Huggingface demo not updated with fixes']",MIXED,[]
50
+ 1678930443.707149,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread involves users U040RCBPBEC and U0336QZAF98. U040RCBPBEC informs U0336QZAF98 about an NPE issue in the estimation service build and mentions making changes to fix it. U0336QZAF98 agrees with the fix and mentions that the implementation of `CollectionUtils.Mergelist` handles null cases. U040RCBPBEC adds that `List.of` is not tolerant of null values. No references to JIRA or other links are mentioned.,3,"['NPE issue fix', 'changes to fix NPE issue', 'implementation of CollectionUtils.Mergelist handles null cases']",['List.of not tolerant of null values'],,[]
51
+ 1672805150.402259,U02GC8SE18V,"{'U02BV2DGUKC', 'bot_message', 'U02GC8SE18V', 'U042KRZPXHT', 'U040RCBPBEC'}","The discussion thread revolves around an issue with the API `/api/v1/value/latest/custom/grouped/{tenantId}`. The user svummidi reported that when using the scoreAggPeriod as ""year"", it returns null, but it works for ""month"". The user U040RCBPBEC suggests using ""month"" for now and creates a task to add a new option for querying all data. There is also a discussion about using the API to get the count of users and the ability to sort the response. A JIRA ticket DAT-765 is created to address the query for all data.",23,"['API issue', 'scoreAggPeriod', 'month', 'querying all data', 'count of users', 'sort response']","['null response', 'year']",,[]
52
+ 1694159001.357959,U03NZ7Z52S2,"{'U0336QZAF98', 'U02SCRTM2M7', 'U03NZ7Z52S2'}","The discussion thread is about a discrepancy in the number of pulse instances and summaries in the retro tenant. It is mentioned that there are 5 responded pulse instances but 8 summaries, with 3 pulses being carried forward since February due to no data for those personas. The question is raised whether the carry forwarded pulse summaries should be shown, as it may cause confusion when showing the dates for the pulses. There is a mention of a fix by sfarooqh to only show pulse summaries within the time range, and it is confirmed that the fix has been deployed in the stage. The discussion concludes with a plan to test the fix once it is deployed. No JIRA ticket or other links are mentioned.",5,"['discrepancy in pulse instances and summaries', 'fix deployed in stage']",['confusion with pulse dates'],,[]
53
+ 1691090298.911729,U026PMDB1ND,"{'U02Q02G09QX', 'U026PMDB1ND'}","The discussion thread is about a command line issue. The user initially used ""sh"" to run a bash script, but it was pointed out that it is not necessary. The user then successfully ran the script without ""sh"". The conversation also mentions a documentation error and a potential problem with a merge to the develop branch. No JIRA ticket or other links are mentioned.",14,"[""Successfully running script without 'sh'""]","['Command line issue', 'Documentation error', 'Potential problem with merge to develop branch']",,[]
54
+ 1686844425.921059,U055SRY74R0,"{'U02HCMTQU3W', 'U055SRY74R0', 'U040RCBPBEC', 'U02GC8SE18V'}","The discussion thread is about the idea of creating a company-wide text document to log meanings and error messages for future reference. The document could be used to create a chatGPT-based FAQ/helper bot. The team currently uses Nexus for externalization of strings and has some UX writing standards. They do not have a tool for documentation yet, but there are plans to prioritize it. The idea is to create a corpus of knowledge while developing features to make it easier and of better quality. The goal is to provide instant responses to user questions about errors or the meaning of certain terms. There is a mention of a JIRA ticket for bringing in a documentation system.",6,"['Creating company-wide text document', 'Logging meanings and error messages', 'Creating a chatGPT-based FAQ/helper bot', 'Developing features for better documentation', 'Providing instant responses to user questions']","['Not having a tool for documentation', 'Lack of a documentation system']",POSITIVE,[]
55
+ 1683689973.147549,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about the availability of the pgvector feature in AWS RDS for PostgreSQL. The feature is only available in version 15.2, so the team needs to upgrade their older versions of common instances to use it. The discussion also mentions conducting experiments with Postgres. No specific JIRA ticket or other links are mentioned.",2,"['pgvector feature', 'conducting experiments with Postgres']",['older versions of common instances'],,[]
56
+ 1677137889.835179,U02GC8SE18V,"{'U0336QZAF98', 'U02GC8SE18V'}",The discussion thread is about deploying the latest score-provider in the INT environment. User U0336QZAF98 agrees to deploy the latest build. No specific details or references to JIRA tickets or other links are mentioned.,2,"['deploying latest score-provider', 'deploy latest build']",[],,[]
57
+ 1692662865.672009,U040RCBPBEC,"{'U0431DZTPJM', 'U02BV2DGUKC', 'bot_message', 'U03KLHDKL1H', 'U026PMDB1ND', 'U040RCBPBEC'}","The discussion thread revolves around the issue of compatibility between the requests library and platform-libs-epoch in Python projects. The team considers downgrading the requests library or upgrading the Python version. They also discuss the possibility of loosening the version constraint for requests in platform-libs-epoch. Finally, they decide to update the requests version in epoch to allow all lambdas to use 2.28.2, while other projects can use any version they prefer. The fix for the coordination lambda has been deployed to production.",27,"['Compatibility between requests library and platform-libs-epoch', 'Updating requests version in epoch', 'Fix for coordination lambda deployed to production']","['Downgrading requests library', 'Upgrading Python version', 'Loosening version constraint for requests in platform-libs-epoch']",POSITIVE,[]
58
+ 1691513756.511789,U03RSS0S76Y,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread focused on improving the interpretation of survey data. They discussed changing question texts and answer choices to provide better context for AI. They also mentioned refining prompts and data storage for better output. They prioritized trimming the summary length and eliminating filler sentences from AskAI. No JIRA ticket or other links were mentioned.,11,"['improving interpretation of survey data', 'changing question texts and answer choices', 'providing better context for AI', 'refining prompts and data storage for better output', 'trimming summary length', 'eliminating filler sentences from AskAI']",[],NEUTRAL,[]
59
+ 1691130426.600749,U040RCBPBEC,"{'U0431DZTPJM', 'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion is about whether to have separate APIs for getting the status and result of a workflow or to combine them into one API. Some suggest combining them into a single API, while others argue for keeping them separate. The idea of having a generic response object for all workflows is also mentioned. No specific JIRA ticket or links are mentioned in the discussion.",11,"['combining APIs', 'generic response object']",['separate APIs'],,[]
60
+ 1689728000.722689,U02Q02G09QX,"{'U02Q02G09QX', 'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about adding integration for the score-provider in the AskAI repository. rsrinivasan snangia suggests generating the necessary score-provider file using pom. svummidi mentions that snangia is likely already working on it. U0336QZAF98 says they will generate the score provider and submit a merge request with a dummy API call for testing.,6,"['integration', 'score-provider', 'generate file', 'merge request', 'dummy API call']",[],,[]
61
+ 1688624422.552659,U040RCBPBEC,"{'U0431DZTPJM', 'U055SRY74R0', 'U03RSS0S76Y', 'U040RCBPBEC'}",The team members are discussing adding a person named svummidi to the project. They mention syncing up with rsrinivasan for more tasks and creating placeholder tasks if needed. They also mention adding more tasks and confirming once svummidi is added. No specific JIRA ticket or other links are mentioned.,6,"['adding svummidi to the project', 'syncing up with rsrinivasan', 'creating placeholder tasks', 'adding more tasks']",[],,[]
62
+ 1685707933.314279,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The user U0336QZAF98 is asking about the time-to-live (ttl) for the logs related to ""Acquiring token from Polaris for Avatica connection."" They mention seeing a large number of these logs in the INT environment. User U040RCBPBEC responds, saying they will fix the issue today. No JIRA ticket or other links are mentioned.",2,"['time-to-live (ttl)', 'logs', 'Acquiring token from Polaris for Avatica connection']","['large number of logs', 'INT environment']",POSITIVE,[]
63
+ 1679983721.528599,U042KRZPXHT,"{'U042KRZPXHT', 'U040RCBPBEC'}","The discussion is about adding a `groupBy` feature to the aggregated counts API, allowing multiple fields to be grouped and the response to be a nested map. This feature would optimize API calls to fetch respondent userIds per question in a pulse instance. The use case is not related to the Reports unknown persona issue. No JIRA ticket or other links are mentioned.",3,"['groupBy feature', 'aggregated counts API', 'nested map', 'optimize API calls']",['Reports unknown persona issue'],,[]
64
+ 1694534367.082639,U0336QZAF98,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","The team discussed adjusting priorities for the sprint to ensure that the apps and UI teams are not blocked on data. They also mentioned cross-team dependencies for showing metric summary and score drop notification. They decided to provide metric name, description, score, and a prompt for executive summary for the metric summary. No specific JIRA ticket or other links were mentioned.",5,"['Adjusting priorities for the sprint', 'Ensuring apps and UI teams are not blocked on data', 'Providing metric name, description, score, and prompt for executive summary']",['Cross-team dependencies for showing metric summary and score drop notification'],NEUTRAL,[]
65
+ 1691050280.119539,U0431DZTPJM,{'U0431DZTPJM'},"The discussion thread mentions that the estimation-service's test coverage is temporarily decreased to 83% for testing purposes. It is stated that the coverage will be reverted back soon. Later, it is mentioned that the coverage is back to 86% in a specific MR. The link to the MR is provided.",2,"['test coverage', 'reverted back']",['temporarily decreased'],POSITIVE,[]
66
+ 1689005902.378459,U0336QZAF98,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about syncing up for specs. svummidi and snangia have created a spec file and plan to go over it. They agree to discuss at 9PM PST or in the data meeting tomorrow. svummidi is asked to review the API specs offline. The updated API specs are shared with cc: rvaidya.,6,"['syncing up for specs', 'creating spec file', 'discussing at 9PM PST', 'discussing in data meeting', 'reviewing API specs offline', 'sharing updated API specs']",[],,[]
67
+ 1685730449.053579,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about changes to the build settings related to parallel tests. The test case ""cubefilter time bound test"" was changed to remove the ""_test"" suffix. The develop branch was deployed on INT, with integration test coverage at 86% and unit test coverage at 58%. The overall code coverage is now 93%, with the bar raised to 90% in the POM file. This change also reduces the overall build time in Gitlab by ~5 minutes.",6,"['changes to build settings', 'parallel tests', 'test case name change', 'deployment on INT', 'integration test coverage', 'unit test coverage', 'code coverage', 'POM file update', 'reduced build time']",[],,[]
68
+ 1692828216.187349,U026PMDB1ND,"{'U040RCBPBEC', 'U026PMDB1ND'}","The discussion thread is about fixing the coverage in the GitLab CI configuration file. User U026PMDB1ND made a change to the file, replacing the coverage file path with a new one. User U040RCBPBEC thanked U026PMDB1ND for fixing the issue. No JIRA ticket or other links were mentioned.",2,"['fixing coverage', 'GitLab CI configuration file']",[],POSITIVE,[]
69
+ 1691517646.699869,U0336QZAF98,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about an issue in the code where the task_result.get() is being called even when the status is not success. One suggestion is to use task_result.ready() instead of checking the status string explicitly. Another suggestion is to handle errors using the Celery API and decide on the client side. It is mentioned that AsyncResult.get() re-raises the same exception with which the task failed in case of failure. The suggestion is to handle it by checking the status as SUCCESS case everywhere. There is also a mention of making changes to the global exception handler. No specific JIRA ticket or other links are mentioned.,6,"['task_result.ready()', 'handle errors using Celery API', 'handle exception in SUCCESS case', 'changes to global exception handler']",['task_result.get() called when status is not success'],NEUTRAL,[]
70
+ 1690781325.882089,U03RSS0S76Y,"{'U03RSS0S76Y', 'U0336QZAF98'}","The discussion is about sending the output of a workflow from Askai service to an estimation service. The question is why only the workflow status is sent and then an API call is made to Askai to get the output, instead of sending the output directly in the event payload. The response mentions that the maximum size of an SNS message is 256 KB and suggests triggering an Askai request when the event is received to avoid an additional API call.",3,"['Sending workflow status', 'Triggering Askai request', 'Avoiding additional API call']","['Sending output directly in event payload', 'Limitation of SNS message size']",NEUTRAL,[]
71
+ 1689749131.579689,U0336QZAF98,"{'U03RSS0S76Y', 'U0336QZAF98'}","The discussion thread is about the .env file needed for local testing of the askai flow via IDE. It includes various configurations such as Celery broker URL, Celery result backend, S2S client ID and secret, S2S token URL, AWS region, user pool ID, JWK URI, API gateway URL, Qdrant URL and secret, Open API key, jobs queue name and URL, PostgreSQL details, FastAPI configurations, and more. It is mentioned that they have switched to using SQS instead of Redis for the Celery broker.",3,"['local testing', 'IDE', 'Celery broker URL', 'Celery result backend', 'S2S client ID', 'S2S secret', 'S2S token URL', 'AWS region', 'user pool ID', 'JWK URI', 'API gateway URL', 'Qdrant URL', 'Open API key', 'jobs queue name', 'PostgreSQL details', 'FastAPI configurations', 'SQS']",['Redis'],POSITIVE,[]
72
+ 1684940086.352399,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","Microsoft has released a new way to do prompting, which can be found on their GitHub page. However, U040RCBPBEC is having trouble understanding it and asks for specific working examples in their application context. No JIRA ticket or other links are mentioned.",2,"['Microsoft released new prompting method', 'GitHub page']","['U040RCBPBEC having trouble understanding', 'No specific working examples', 'No JIRA ticket or other links mentioned']",,[]
73
+ 1694100126.363299,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about sharing the .env file for the stage. The .env file contains various environment variables such as the Celery broker URL, PostgreSQL credentials, job queue details, S2S client information, API gateway URL, Qdrant related details, Open API key, SNS event publisher ARN, FastAPI configuration, and LaunchDarkly environment name and API key. LD_ENV_NAME is set as ""integration"" and may need to be changed for the stage.",3,"['Sharing .env file', 'Environment variables', 'Celery broker URL', 'PostgreSQL credentials', 'Job queue details', 'S2S client information', 'API gateway URL', 'Qdrant related details', 'Open API key', 'SNS event publisher ARN', 'FastAPI configuration', 'LaunchDarkly environment name', 'LaunchDarkly API key']",['LD_ENV_NAME'],NEUTRAL,[]
74
+ 1693316281.740999,U03RSS0S76Y,"{'U02Q02G09QX', 'U03RSS0S76Y'}",Akalyta noticed that a commit in the askai repository is breaking code in the estimation service. Snangia thanked Akalyta for noticing and said they would take a look. Snangia shared the merge request for the estimation service and said they would let Akalyta know once it's merged. Akalyta thanked Snangia and mentioned a question about a spec dependency added in the pom. They said they would merge the merge request for now to unblock.,4,"['noticing the code break', 'thanking for noticing', 'taking a look', 'sharing merge request', 'merging to unblock']","['code break in estimation service', 'question about spec dependency']",,[]
75
+ 1691647040.353409,U040RCBPBEC,"{'U03RSS0S76Y', 'U040RCBPBEC'}","The discussion thread is about adding tasks to the sprint and setting deadlines for various items, such as controlling the length of the summary, verifying the caching feature for demos, and implementing metadata-based filtering. The team also discusses the strategy for creating and releasing hotfixes and suggests testing them in the INT environment before deploying in Stage. A link to the full list of items is provided.",3,"['Adding tasks to the sprint', 'Setting deadlines', 'Controlling the length of the summary', 'Verifying caching feature for demos', 'Implementing metadata-based filtering', 'Creating and releasing hotfixes', 'Testing hotfixes in INT environment']",['None'],NEUTRAL,[]
76
+ 1691041108.761539,U03RSS0S76Y,"{'U03RSS0S76Y', 'U0336QZAF98'}","The discussion thread is about events not being received by the estimation service, despite being published correctly from the askai service. The team is discussing whether a filter for trend analysis completion events was added in the cdk. The queue name for the events is estimation-axm-events-sqs.",3,"['Published events from askai service', 'Estimation service', 'CDK filter for trend analysis completion events']","['Events not being received', 'Queue name: estimation-axm-events-sqs']",NEGATIVE,[]
77
+ 1688393958.210069,U0336QZAF98,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread involves multiple participants discussing issues with the prompt and JSON response in the production environment. They mention issues such as missing mixed responses in prompts and receiving malformed JSON responses. They also discuss testing in the INT environment and making changes to increase token limits. A JIRA ticket is created to track the issues discussed.,17,"['discussion of prompt issues', 'discussion of JSON response issues', 'discussion of testing in INT environment', 'discussion of increasing token limits', 'creation of JIRA ticket']","['missing mixed responses in prompts', 'receiving malformed JSON responses']",MIXED,[]
78
+ 1686731456.284089,U03NZ7Z52S2,"{'U0336QZAF98', 'U03NZ7Z52S2', 'U040RCBPBEC'}","The discussion thread includes observations made regarding the Polaris Migration. Issues such as missing data, null values, and differences in count are mentioned. There is also a mention of a support ticket opened with Imply for further analysis. The Polaris ticket for this issue is provided as well.",7,[],"['missing data', 'null values', 'differences in count']",NEUTRAL,[]
79
+ 1693519474.905259,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread revolves around the issue of the similarity threshold in chat questions. One user suggests reducing the threshold to improve the system's ability to answer basic questions. Another user argues for increasing the threshold to avoid situations where some documents have answers while others do not. The use of MMR and the problem of duplicate chunks are also mentioned. The thread concludes with the understanding that MMR will not solve the refine query problem. No references to JIRA tickets or other links are provided.,4,"['reducing similarity threshold', ""improving system's ability to answer basic questions""]","['increasing similarity threshold', 'avoiding situations with inconsistent answers', 'MMR', 'duplicate chunks', 'refine query problem']",,[]
80
+ 1692879167.141179,U03RSS0S76Y,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about persisting sentiments in AskAI. The design proof of concept (POC) for this feature is reviewed and updated based on feedback. However, it is mentioned that this task is not a priority and can be taken up in future sprints. There is a suggestion to validate the requirement of getting sentiment as metadata in Qdrant, and it is stated that sentiment analysis can be used for trend analysis and other use-cases. The possibility of reusing the GPT model for sentiment analysis is also discussed. No specific JIRA ticket or other links are mentioned.",5,"['design proof of concept (POC) for sentiment persistence', 'feedback-based updates', 'validating sentiment requirement in Qdrant', 'using sentiment analysis for trend analysis', 'reusing GPT model for sentiment analysis']","['task not a priority', 'no specific JIRA ticket or links mentioned']",NEUTRAL,[]
81
+ 1692245041.657209,U040RCBPBEC,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about configuring prompts for chat and resolving issues with Llama index merging results. The team members, rsrinivasan and svummidi, discuss making changes to improve prompts and provide links to documentation and code changes. Another team member, snangia, offers to help with prompt configuration. No specific JIRA ticket or other links are mentioned.",9,"['configuring prompts', 'improving prompts', 'help with prompt configuration']",['resolving issues with Llama index merging results'],,[]
82
+ 1692175062.361149,U03RSS0S76Y,"{'U03RSS0S76Y', 'U0336QZAF98'}","The discussion thread is about the word count for short summaries and whether it can differ per workflow or if it is unified for all. Rsrinivasan confirms that the word count can differ per workflow, with the timeline requiring a smaller count compared to the trend. No JIRA ticket or other links are mentioned.",4,['word count can differ per workflow'],['no JIRA ticket or other links mentioned'],POSITIVE,[]
83
+ 1686325099.114699,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about the issue of the pulse instance state streaming job not running for INT in Polaris. It is suggested to run a command from the Druid spec manager to start the job. It is also mentioned that if there is no data available in the Kinesis stream, the job fails to start. It is proposed to use a push model and a different data store for easier data updating. A change has been made to introduce a postgres storage in the scoring provider service to handle different kinds of exclusions. A merge request will be raised for the changes.",5,"['pulse instance state streaming job', 'run command from Druid spec manager', 'use push model for data updating', 'introduce postgres storage in scoring provider service', 'raise merge request for changes']","['job not running for INT in Polaris', 'job fails to start if no data available in Kinesis stream']",POSITIVE,[]
84
+ 1685709620.751769,U0336QZAF98,"{'U0336QZAF98', 'U028EDANJM9'}",The discussion thread involves gshenoy and pmangalapuri discussing the deployment of a build to publish scores automatically. They mention using a feature branch for a new event and provide a sample payload for the event. They also provide a curl request for syncing on demand. The conversation ends with gshenoy mentioning merging into develop after addressing review comments. No specific JIRA ticket or other links are mentioned.,4,"['deployment of build', 'publishing scores automatically', 'using feature branch', 'sample payload', 'syncing on demand', 'merging into develop']",[],,[]
85
+ 1683580131.403839,U040RCBPBEC,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about the use of GPTDocumentSummaryIndex for routing questions in Llama index. The question is whether it is possible to use OpenSearch for the Document store and Index store in addition to the Vector store. The current design does not require it, but it may be needed for future prototypes. No specific details or references to JIRA tickets or other links are mentioned.",3,"['Use of GPTDocumentSummaryIndex for routing questions', 'Possible use of OpenSearch for Document store and Index store', 'Future prototypes']","['No specific details or references', 'No mention of JIRA tickets or other links']",NEUTRAL,[]
86
+ 1682570683.085479,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}",The user U0336QZAF98 noticed that their token was hardcoded in a file shared by svummidi. They questioned if this was intentional as anyone could see it. User U040RCBPBEC responded that they accidentally added the file and removed the token. No JIRA ticket or other links were mentioned.,2,[],"['token hardcoded in file', 'security concern']",,[]
87
+ 1682560786.137739,U03DHUAJVMK,"{'U02Q02G09QX', 'U03DHUAJVMK', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about testing the ""Ask AI"" feature with real data for accuracy and relevance. The response time is currently over 40 seconds, but improvements have been made. There is a suggestion to keep showing suggested questions on the results screen. Reprocessing data has been suggested to fix null values for some comments' dates. The user also requests to be added as a collaborator or product owner for a specific product.",12,"['accuracy and relevance', 'improvements made', 'showing suggested questions', 'reprocessing data']","['response time over 40 seconds', ""null values for comments' dates"", 'request to be added as collaborator/product owner']",NEUTRAL,[]
88
+ 1678716518.044579,U02GC8SE18V,"{'U02BV2DGUKC', 'U040RCBPBEC', 'U02GC8SE18V'}",The discussion thread is about reviewing the vendor dashboard and requesting input from the score provider. There is also a mention of API changes for dashboard cards and a list of products with overall and engagement scores. There is a suggestion to start a de-comp page for this feature.,4,"['Vendor dashboard review', 'Input from score provider', 'Overall and engagement scores', 'Decomp page suggestion']",['API changes for dashboard cards'],,[]
89
+ 1674621258.763489,U02GC8SE18V,"{'U02SF36PVKL', 'U033PPLNFRU', 'U040RCBPBEC', 'U02GC8SE18V'}",The discussion is about sending qualitative feedback to VMS as soon as it is received. The team is considering two options: adding a new boolean attribute or querying open pulse instances. They also discuss the possibility of using separate APIs for different pulse states. A JIRA ticket will be created to track the implementation of sending qualitative feedback.,8,"['sending qualitative feedback', 'adding new boolean attribute', 'querying open pulse instances', 'using separate APIs for different pulse states', 'creating JIRA ticket']",[],,[]
90
+ 1692731923.943489,U040RCBPBEC,"{'U040RCBPBEC', 'U026PMDB1ND'}",The discussion thread is about sharing a list of tasks and discussing the benefits of using a master list or a list of tasks in Confluence before moving them to Jira. It is suggested that a mindmap might be even better for complex tasks. There is also mention of hierarchy view apps on the Atlassian marketplace that cost $50 to $100 per month.,5,"['benefits of using a master list', 'benefits of using a list of tasks in Confluence', 'benefits of using a mindmap for complex tasks']",['cost of hierarchy view apps on Atlassian marketplace'],,[]
91
+ 1692209593.753829,U0336QZAF98,"{'U0431DZTPJM', 'U0336QZAF98'}","The discussion thread is about creating a hotfix for a bug in the url ingestion. The bug is related to not appending ""askai"" and causing a 404 error. The hotfix branch has been created and changes have been made to the client of ask ai and the test cases. The fix needs to be deployed in int and tested. JIRA ticket: <https://gitlab.com/axiamatic-main/vms-services-ingestion/-/merge_requests/56>",11,"['hotfix', 'bug fix', 'url ingestion', 'client changes', 'test cases', 'deployment', 'JIRA ticket']",['404 error'],,[]
92
+ 1691001466.819129,U02Q02G09QX,"{'U02Q02G09QX', 'U040RCBPBEC'}",The discussion is about a problem with mocking the SummarizationService in the EstimationE2Etest. The issue is that tests relying on the SummarizationService are failing when the mocking is moved to the InsightsTestHelper class. The user asks if anyone has encountered this before or has any ideas on how to deal with it. Another user suggests checking other tests and offers to help if the issue persists. No JIRA ticket or other links are mentioned.,2,[],"['mocking problem', 'SummarizationService', 'EstimationE2Etest', 'tests failing', 'InsightsTestHelper', 'encountered before', 'ideas to deal with', 'no JIRA ticket', 'no links mentioned']",,[]
93
+ 1690872034.620169,U02SCRTM2M7,"{'U02HCMTQU3W', 'U02SCRTM2M7', 'U040RCBPBEC', 'U02GC8SE18V'}",The discussion thread is about creating tickets for sending null values for the aggregated period. The issue is that it currently works at the product level but not at the initiative and dashboard levels. The team has added all the details and sample requests for working and missing null data cases in the ticket descriptions. The team also discusses the possibility of removing all null values to minimize the payload and expanding them in the UI to the desired starting date. They also consider cases where there is no VOT data at all and propose filtering all nulls from the data even for engagements. The proposed changes include returning empty arrays if an engagement or initiative or dashboard don't have any data and getting only one entry in all levels if there are scores only for this month. The JIRA tickets mentioned are DAT-1208 and DAT-1209.,5,"['Adding details and sample requests for working and missing null data cases', 'Removing null values to minimize payload', 'Expanding null values in UI to desired starting date', 'Filtering nulls from data even for engagements', 'Returning empty arrays for entities with no data', 'Getting only one entry in all levels if there are scores only for this month']","['Issue with sending null values for aggregated period', 'Not working at initiative and dashboard levels', 'No VOT data at all']",MIXED,[]
94
+ 1690203553.509529,U0431DZTPJM,"{'U0431DZTPJM', 'U040RCBPBEC'}",The discussion thread is about reviewing options for custom caching key generation in Spring Boot. Option 1 is preferred because it is simple and provides maximum flexibility. Option 2 is considered hacky. There was a suggestion to have a single class for CustomKeyGenerator to reduce code. The code examples and links to the working MR and wiki page are provided.,3,"['Option 1', 'simple', 'maximum flexibility', 'single class', 'CustomKeyGenerator']","['Option 2', 'hacky']",,[]
95
+ 1684339982.515349,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about the support for pgvector on Amazon RDS for Postgres and Aurora Postgres. U0336QZAF98 confirms that pgvector is only supported on Amazon RDS for Postgres, not on Aurora Postgres. U040RCBPBEC asks for documentation and creates a support ticket, and later confirms that there is a feature request for pgvector support on Aurora Postgres. U0336QZAF98 updates the links on a page related to Postgres and pgvector.",4,['pgvector support on Amazon RDS for Postgres'],['pgvector support on Aurora Postgres'],MIXED,[]
96
+ 1677602050.352389,U02GC8SE18V,"{'U04EV0M2VA6', 'U040RCBPBEC', 'U02GC8SE18V'}","The discussion is about adding an API to show sentiment monthly/weekly for a product instance in the timeline view. One suggestion is to make 12 API calls to load the data for the frontend, while another suggestion is to wait for the next release to integrate the bulk API. There is also a suggestion to make the API call on click instead of hover, but it is not favored as it may not be clear that the timeline can be clicked on. No specific JIRA ticket or links are mentioned.",4,"['API to show sentiment monthly/weekly', 'Integrating bulk API in next release']","['Making 12 API calls for frontend', 'API call on click instead of hover']",NEUTRAL,[]
97
+ 1692312916.773879,U040RCBPBEC,"{'U0431DZTPJM', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about a migration job in INT for task ID 5e5a4098-08f7-4c99-baf2-e850cdb7f389. The job took one hour to complete but generated errors related to the content being empty. The team is planning to add safety conditions to handle this issue. There is a JIRA ticket raised by ppant for further investigation.,3,"['migration job', 'completed in one hour', 'team planning to add safety conditions']","['errors related to empty content', 'JIRA ticket raised for investigation']",,[]
98
+ 1691731049.505329,U040RCBPBEC,"{'U0431DZTPJM', 'U040RCBPBEC'}","The discussion is about changing the caching approach for timeline pulse instances. Currently, a list is used for caching, but it is not effective because the list can change daily. The suggestion is to use String for all cache keys and cache individual pulses instead of a list. There is no mention of any JIRA ticket or other links.",2,"['Changing caching approach', 'Using String for cache keys', 'Caching individual pulses']","['Ineffective list caching approach', 'List can change daily']",,[]
99
+ 1690996407.343479,U040RCBPBEC,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","In the discussion thread, svummidi provided credentials for accessing Mattel data in the Acme engagement under tenant 44077. They also mentioned sending an admin invite and suggested using their credentials if needed. Another user, U0336QZAF98, thanked svummidi and confirmed they would use the provided credentials. Later, svummidi mentioned adding responses from Mattel to tenant 51165 on INT. They also reported an issue with the feature not recognizing any data. U0336QZAF98 acknowledged the issue and mentioned that the question text was not populated correctly.",7,"['credentials provided', 'admin invite', 'thank you']","['issue with feature', 'question text not populated correctly']",,[]
100
+ 1687257247.444389,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about a warning that keeps appearing when using PolarisHttpClient. The user suspects that the configuration for Hikari is not matching with the underlying HTTP connection keep alive. The default HTTP keep alive is unknown. The user has submitted a request for support and is waiting for suggestions on any necessary changes. The maxLifetime value is currently set to 60 seconds.,2,"['PolarisHttpClient', 'configuration', 'support', 'suggestions', 'maxLifetime']","['warning', 'Hikari', 'HTTP connection keep alive']",NEUTRAL,[]
101
+ 1692801723.802269,U040RCBPBEC,"{'U03RSS0S76Y', 'U040RCBPBEC'}","In the discussion thread, U03RSS0S76Y asks U040RCBPBEC if they can assign task 3 to themselves since U040RCBPBEC hasn't started on it yet. No other specific details or references are mentioned.",2,[],['task assignment'],,[]
102
+ 1692324222.035889,U040RCBPBEC,"{'U02HCMTQU3W', 'U03RSS0S76Y', 'U040RCBPBEC'}","The discussion thread is about the readiness of three features (Trend Summary, Event Summary, and AskAI) for release. It is mentioned that all three features work as expected in the most happy path, but there are some issues with generating summaries and accuracy in chat responses. It is suggested to curate the list of questions manually for AskAI and to keep the feature disabled for production customers using feature flags. There is also a suggestion to have a feature flag on the UI side to not show the summaries but still generate them in the backend for improvement purposes.",7,"['Trend Summary', 'Event Summary', 'AskAI']","['generating summaries', 'accuracy in chat responses', 'curate list of questions', 'feature flags', 'UI side']",,[]
103
+ 1690980311.800389,U042KRZPXHT,"{'U0431DZTPJM', 'U03RSS0S76Y', 'U042KRZPXHT'}",The discussion thread is about an issue with the AskAI service throwing a 503 error while calling the ask question API in the estimation service. The issue was initially reported by U042KRZPXHT and was confirmed by U0431DZTPJM. The service count was decreased to 0 to complete an update rollback. The issue was resolved after redeploying the AskAI service by rsrinivasan.,9,"['503 error', 'AskAI service', 'ask question API', 'estimation service', 'issue resolved', 'redeploying']",['update rollback'],,[]
104
+ 1687164148.211529,U02GC8SE18V,"{'U040RCBPBEC', 'U02GC8SE18V'}","The discussion thread is about the difference between `rawChange` and `engRawChange` in the widget response. It is clarified that `engRawChange` and `engPercentChange` are related to a new feature for unification of engagement score with value score, but they are not ready yet and should not be used.",2,"['rawChange', 'widget response']","['engRawChange', 'engPercentChange', 'new feature', 'unification', 'engagement score', 'value score']",,[]
105
+ 1683138397.034019,U02Q02G09QX,"{'U02Q02G09QX', 'U0336QZAF98', 'U040RCBPBEC'}",The discussion thread is about implementing logging in the EC2 app_api.py file. rsrinivasan explains that the logging level needs to be initialized before any of the llamaindex imports. U040RCBPBEC thanks rsrinivasan and mentions that akalyta eventually figured it out. No JIRA ticket or other links are mentioned.,3,"['implementing logging', 'logging level initialization']",[],,[]
106
+ 1692292520.089039,U0336QZAF98,"{'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about cache configurations missing in the estimation service. The cache names were changed to prefix the service name for easier identification in Redis. The issue was resolved by adding the cache configurations in the yaml file. The messages about cache miss for pulse instance summaries indicate that the feature flag is enabled but data is not migrated. After data migration, the messages are only seen once on first load. The issue was verified in the stage environment and it looks okay. The relevant commit can be found at <https://gitlab.com/axiamatic-main/vms-estimation-service/-/commit/f96285265e707504730d34231950c0d99fd2fee1>.",4,"['cache configurations added', 'issue resolved', 'data migration completed', 'issue verified in stage environment']","['cache configurations missing', 'cache miss for pulse instance summaries']",POSITIVE,[]
107
+ 1691425546.761109,U0336QZAF98,"{'U03RSS0S76Y', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread is about investigating the issue of multiple calls to the askai/status API while the aksai workflow is in a pending state. The team confirms that the cache is working fine and that the method is executed only once. However, the API calls are being executed twice in quick succession. The team will further investigate the issue. No references to JIRA tickets or other links are mentioned.",8,[],"['multiple calls to askai/status API', 'API calls executed twice']",,[]
108
+ 1691048525.071189,U03RSS0S76Y,"{'U03RSS0S76Y', 'U02GC8SE18V'}",The discussion is about the inclusion of the same pulse instance IDs for both current and previous months in the askai trend workflow. The team is debating whether to exclude the IDs from the previous month to allow for proper trend analysis. The issue is related to timeline analysis and the need for contrasting data. The team is considering the delta value and the closure of pulse instances in determining the inclusion or exclusion of the IDs. The discussion can be found at <https://axiamatic.slack.com/archives/C05D1S3865D/p1690937418437499?thread_ts=1689048143.815829&amp;cid=C05D1S3865D>.,7,"['inclusion of same pulse instance IDs', 'proper trend analysis', 'delta value', 'closure of pulse instances']","['exclusion of IDs from previous month', 'timeline analysis', 'contrasting data']",NEUTRAL,[]
109
+ 1691039532.337609,U0336QZAF98,"{'U02HCMTQU3W', 'U03RSS0S76Y', 'U0336QZAF98', 'U02GC8SE18V'}","The discussion thread is about an error message related to the ""summary_type"" not being supported yet. The error occurred during trend analysis summary for voice arguments. The team discusses the use of ""voc"" (voice of customer) instead of ""voice"" for APIs. They mention checking with pmangalapuri to fix the issue and confirm that the latest app is deployed with ""voc"" and ""metrics"" from the backend to the estimation service. No references to JIRA tickets or other links are provided.",8,"['voc', 'metrics', 'backend']","['summary_type', 'error message', 'trend analysis']",,[]
110
+ 1690790736.042319,U0336QZAF98,"{'U02D4DUKDQC', 'U0336QZAF98', 'U040RCBPBEC'}","The discussion thread involves multiple participants discussing the status of a merge request for the Polaris project. One participant mentions manually copying files into their branch and deploying them. Another participant asks for instructions to be updated for a stage deployment, and suggests adding steps for a production deployment in the VPC. The thread ends with a participant mentioning that they have updated the deployment dependencies page. No specific details or references to JIRA tickets are provided.",4,"['Merge request status', 'Manual file copying', 'Deployment instructions', 'Stage deployment', 'Production deployment', 'VPC', 'Deployment dependencies page']",[],,[]
111
+ 1692894000.139349,U02BV2DGUKC,"{'U0336QZAF98', 'U02BV2DGUKC'}","The discussion is about measuring the health of Polaris. They plan to link the service health check with Polaris, so if Polaris is down, the service will also go down. They will use LB health report to track the number of times Polaris has gone down. They also consider passive monitoring by polling Polaris and reporting the status using allocated resources like Lambda. A sidecar will be started to pull metrics from Polaris. A task will be added to address this.",3,"['linking service health check with Polaris', 'using LB health report to track Polaris downtime', 'passive monitoring by polling Polaris', 'reporting Polaris status using allocated resources', 'starting a sidecar to pull metrics from Polaris', 'adding a task to address the issue']",[],,[]
112
+ 1678856222.260049,U02HCMTQU3W,"{'U02HCMTQU3W', 'bot_message', 'U03MSMV0W66', 'U02GC8SE18V', 'U0336QZAF98', 'U040RCBPBEC'}","The team is discussing an exception causing a 500 error in the Teams->Teammates tab. The exception is related to a SQL query encountering a ClassCastException. They are also discussing the use case for getting the engagement score by user and considering removing the ""avg participation"" column. They are also discussing a bug in the UI not showing the user engagement score. A JIRA ticket (DAT-902) has been created to track the issue.",18,"['exception causing 500 error', 'use case for getting engagement score by user', 'JIRA ticket created']",['bug in UI not showing user engagement score'],,[]
get_users.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ from slack_sdk import WebClient
4
+ from slack_sdk.errors import SlackApiError
5
+
6
+ def get_user_id_to_name_mapping(token):
7
+ client = WebClient(token=token)
8
+ try:
9
+ response = client.users_list()
10
+ users = response['members']
11
+ user_id_to_name = {user['id']: user['name'] for user in users}
12
+ return user_id_to_name
13
+ except SlackApiError as e:
14
+ print(f"Error fetching user list: {e}")
15
+ return {}
16
+
17
+ def save_mapping_to_json(mapping, filepath):
18
+ with open(filepath, 'w') as file:
19
+ json.dump(mapping, file)
20
+
21
+ def load_mapping_from_json(filepath):
22
+ if not os.path.exists(filepath):
23
+ return {}
24
+ with open(filepath, 'r') as file:
25
+ return json.load(file)
26
+
27
+ if __name__ == "__main__":
28
+ # Replace 'YOUR_SLACK_API_TOKEN' with your actual Slack API token
29
+ slack_token = os.environ.get('SLACK_API_TOKEN')
30
+
31
+ # Fetch the user ID to name mapping from Slack
32
+ user_id_to_name_mapping = get_user_id_to_name_mapping(slack_token)
33
+
34
+ # Save the mapping to a JSON file
35
+ save_mapping_to_json(user_id_to_name_mapping, 'user_id_to_name_mapping.json')
36
+
37
+ # Load the mapping from the JSON file (just to demonstrate loading)
38
+ loaded_mapping = load_mapping_from_json('user_id_to_name_mapping.json')
39
+ print(loaded_mapping)
index_slack.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import sys
4
+ from datetime import datetime, timedelta
5
+
6
+ import requests
7
+ from llama_index import VectorStoreIndex, StorageContext, download_loader
8
+
9
+ from channel_id_mapper import ChannelIdMapper
10
+
11
+ token = os.environ.get('SLACK_API_TOKEN') # Retrieve your Slack API token from environment variables
12
+ fromDate = datetime.now() - timedelta(90)
13
+ index_root = './index'
14
+
15
+
16
+
17
+ def index_channels(channels, name_id_map):
18
+ SlackReader = download_loader("SlackReader")
19
+ loader = SlackReader(token, earliest_date=fromDate)
20
+ for channel in channels:
21
+ save_location = f"{index_root}/{channel}"
22
+ if not os.path.exists(save_location):
23
+ os.makedirs(save_location)
24
+ documents = loader.load_data([name_id_map[channel]], reverse_chronological=True)
25
+ storage_context = StorageContext.from_defaults()
26
+ index = VectorStoreIndex.from_documents(documents=documents, storage_context=storage_context)
27
+ storage_context.persist(save_location)
28
+
29
+
30
+ def main():
31
+ if len(sys.argv) < 2:
32
+ print('Usage: python3 index_slack.py channel1,channel2,channel3')
33
+ exit(1)
34
+ slack_token = os.environ.get('SLACK_API_TOKEN')
35
+ if not slack_token:
36
+ print('Please set the SLACK_API_TOKEN environment variable.')
37
+ exit(1)
38
+ channel_id_mapping = ChannelIdMapper(slack_token)
39
+ channel_ids_to_index = []
40
+ channels = sys.argv[1].split(',')
41
+ for channel in channels:
42
+ if channel not in channel_dict:
43
+ print(f'Channel {channel} not found. Available channels: {channel_dict.keys()}')
44
+ exit(1)
45
+ channel_ids_to_index.append(channel_dict[channel])
46
+ index_channels(channels, channel_dict)
47
+
48
+
49
+
50
+
51
+ if __name__ == '__main__':
52
+ main()
metadata_extracter.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from enum import Enum
2
+ from typing import List, Optional
3
+
4
+ from llama_index import ServiceContext
5
+ from llama_index.llms import OpenAI
6
+ from llama_index.llms.base import LLM
7
+ from llama_index.llms.openai_utils import to_openai_function
8
+ from pydantic import BaseModel, ValidationError
9
+
10
+
11
+ class SentimentEnum(str, Enum):
12
+ """
13
+ Enum for predicted overall sentiment of a discussion thread
14
+ """
15
+
16
+ POSITIVE = "POSITIVE"
17
+ NEGATIVE = "NEGATIVE"
18
+ NEUTRAL = "NEUTRAL"
19
+ MIXED = "MIXED"
20
+ UNKNOWN = "UNKNOWN"
21
+
22
+
23
+ class DiscussionStatusEnum(str, Enum):
24
+ """
25
+ Enum for representing the predicted status of the discussion thread
26
+ """
27
+
28
+ ON_GOING = "ON_GOING"
29
+ RESOLVED_OR_CLOSED = "RESOLVED_OR_CLOSED"
30
+ UNKNOWN = "UNKNOWN"
31
+
32
+
33
+ class ThreadMetadata(BaseModel):
34
+ """ Metadata of a discussion thread for topics and sentiment. Topics must be under 50 characters. """
35
+ list_of_positive_topics: List[str]
36
+ list_of_negative_topics: List[str]
37
+ overall_sentiment: Optional[SentimentEnum]
38
+ discussion_status_enum: Optional[DiscussionStatusEnum]
39
+
40
+
41
+ class MetadataExtractor:
42
+ def __init__(self, llm: LLM):
43
+ self.llm = llm
44
+
45
+ def extract_metadata(self, thread_summary: str) -> Optional[ThreadMetadata]:
46
+ """
47
+ Extracts the metadata from the thread summary
48
+ :param thread_summary: of the thread
49
+ :return: metadata of the thread
50
+ """
51
+ api_spec = to_openai_function(ThreadMetadata)
52
+ response = self.llm.complete(
53
+ "Analyze the thread summary: " + thread_summary,
54
+ functions=[api_spec],
55
+ )
56
+ function_call_resp = response.additional_kwargs["function_call"]["arguments"]
57
+ # print(f"Function calling spec: {function_call_resp}")
58
+ try:
59
+ return ThreadMetadata.parse_raw(function_call_resp)
60
+ except ValidationError:
61
+ print(f"Error while parsing the detected question metadata: {function_call_resp}")
62
+ return None
63
+
64
+
65
+ if __name__ == "__main__":
66
+ import csv
67
+
68
+ gpt_turbo: OpenAI = OpenAI(temperature=0, model="gpt-3.5-turbo")
69
+ service_context = ServiceContext.from_defaults(llm=gpt_turbo, chunk_size=1024)
70
+ metadata_extractor = MetadataExtractor(gpt_turbo)
71
+
72
+ # Input CSV file name
73
+ input_csv = "csv/platform-engg.csv"
74
+ # Output CSV file name
75
+ output_csv = "csv/platform-engg-updated.csv"
76
+ # Column header to read from
77
+ column_to_read = "Summary"
78
+ new_column_header = "Predicted Status"
79
+
80
+ metadata_extractor = MetadataExtractor(gpt_turbo)
81
+ # Initialize lists to hold the headers and rows
82
+ headers = []
83
+ rows = []
84
+
85
+ # Reading the input CSV file
86
+ with open(input_csv, mode='r', newline='', encoding='utf-8') as infile:
87
+ csvreader = csv.reader(infile)
88
+ headers = next(csvreader)
89
+
90
+ # Check if the column exists in the CSV
91
+ if column_to_read not in headers:
92
+ print(f"Error: Column '{column_to_read}' not found in the CSV file.")
93
+ exit(1)
94
+
95
+ # Get index of the column to read
96
+ index_to_read = headers.index(column_to_read)
97
+
98
+ # Read the rows into a list
99
+ for row in csvreader:
100
+ rows.append(row)
101
+
102
+ # Create a new header for the new column
103
+
104
+ # Add the new header to the headers list
105
+ headers.append(new_column_header)
106
+
107
+ # Iterate over each row to create a new column
108
+ for row in rows:
109
+ old_value = row[index_to_read]
110
+ metadata = metadata_extractor.extract_metadata(old_value)
111
+ new_value = "UNKNOWN"
112
+ if metadata is not None and metadata.discussion_status_enum is not None:
113
+ if (metadata.discussion_status_enum.value == "RESOLVED_OR_CLOSED" or
114
+ metadata.discussion_status_enum.value == "ON_GOING" or
115
+ metadata.discussion_status_enum.value == "UNKNOWN"):
116
+ new_value = metadata.discussion_status_enum.value
117
+ row.append(new_value)
118
+
119
+ # Writing to the output CSV file
120
+ with open(output_csv, mode='w', newline='', encoding='utf-8') as outfile:
121
+ csvwriter = csv.writer(outfile)
122
+ csvwriter.writerow(headers)
123
+ for row in rows:
124
+ csvwriter.writerow(row)
125
+
126
+ print(f"Successfully added a new column '{new_column_header}' to the '{output_csv}' file.")
requirements.txt ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ llama-index==0.7.6
2
+ openai==0.27.8
3
+ transformers
4
+ beautifulsoup4
5
+ requests~=2.31.0
6
+ gradio==3.44.1
7
+ slackclient~=2.9.4
8
+ slack~=0.0.2
9
+
10
+ fastapi~=0.100.0
11
+ pydantic>=1.10.5,<2
12
+
13
+ ratelimit~=2.2.1
slack_reader.py ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import datetime
2
+ import os
3
+ from slack_sdk import WebClient
4
+
5
+
6
+ class SlackChannelReader:
7
+ def __init__(self, token, channel_id):
8
+ self.client = WebClient(token=token)
9
+ self.channel_id = channel_id
10
+
11
+ def read_messages(self, start_date):
12
+ start_timestamp = int(start_date.timestamp())
13
+ cursor = None
14
+ has_more = True
15
+
16
+ while has_more:
17
+ response = self.client.conversations_history(
18
+ channel=self.channel_id,
19
+ limit=100,
20
+ oldest=start_timestamp,
21
+ cursor=cursor
22
+ )
23
+
24
+ messages = response["messages"]
25
+ threads = self._group_messages_by_thread(messages)
26
+
27
+ self._write_threads_to_files(threads)
28
+
29
+ has_more = response["has_more"]
30
+ if has_more:
31
+ cursor = response["response_metadata"]["next_cursor"]
32
+
33
+ @staticmethod
34
+ def _group_messages_by_thread(messages):
35
+ threads = {}
36
+
37
+ for message in messages:
38
+ if "thread_ts" in message:
39
+ thread_ts = message["thread_ts"]
40
+ user = message["user"]
41
+ timestamp = message["ts"]
42
+ content = message["text"]
43
+
44
+ if thread_ts in threads:
45
+ threads[thread_ts].append((user, timestamp, content))
46
+ else:
47
+ threads[thread_ts] = [(user, timestamp, content)]
48
+
49
+ return threads
50
+
51
+ @staticmethod
52
+ def _write_threads_to_files(threads):
53
+ for thread_ts, thread_messages in threads.items():
54
+ file_name = f"slack_data/{thread_ts}_{thread_messages[0][0]}.txt"
55
+ with open(file_name, "w") as file:
56
+ for user, timestamp, content in thread_messages:
57
+ file.write(f"User: {user}\n")
58
+ file.write(f"Timestamp: {timestamp}\n")
59
+ file.write(f"Content: {content}\n\n")
60
+
61
+
62
+ def main():
63
+ token = os.environ.get('SLACK_API_TOKEN')
64
+ channel_id = "C02JEH5KGGN"
65
+ start_date = datetime.datetime(2023, 1, 1)
66
+
67
+ reader = SlackChannelReader(token, channel_id)
68
+ reader.read_messages(start_date)
69
+
70
+
71
+ main()
slack_summary.py ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import datetime
2
+ import functools
3
+ import json
4
+ import os
5
+ import shelve
6
+ import sys
7
+ from typing import List, Optional
8
+ import re
9
+ import openai
10
+ import slack_sdk
11
+ from llama_index import Document, GPTListIndex, ServiceContext
12
+ from llama_index.llms import OpenAI
13
+ from ratelimit import limits, sleep_and_retry
14
+
15
+ import csv
16
+ from channel_id_mapper import ChannelIdMapper
17
+ from metadata_extracter import MetadataExtractor, ThreadMetadata
18
+
19
+ SKIP_AI = False
20
+ gpt_turbo: OpenAI = OpenAI(temperature=0, model="gpt-3.5-turbo")
21
+ service_context = ServiceContext.from_defaults(llm=gpt_turbo, chunk_size=1024)
22
+ metadata_extractor = MetadataExtractor(gpt_turbo)
23
+
24
+
25
+ @functools.lru_cache(maxsize=1024)
26
+ def cached_shelve_read(key):
27
+ with shelve.open("mydata.db") as db:
28
+ return db.get(key, None)
29
+
30
+
31
+ def cached_shelve_write(key, value):
32
+ with shelve.open("mydata.db") as db:
33
+ db[key] = value
34
+ cached_shelve_read.cache_clear()
35
+
36
+
37
+ def load_mapping_from_json(filepath):
38
+ if not os.path.exists(filepath):
39
+ return {}
40
+ with open(filepath, 'r') as file:
41
+ return json.load(file)
42
+
43
+
44
+ userIdMapping = load_mapping_from_json('user_id_to_name_mapping.json')
45
+
46
+
47
+ class SlackMessage:
48
+ def __init__(self, user, timestamp, content):
49
+ self.user = userIdMapping.get(user, user)
50
+ self.timestamp = timestamp
51
+ self.content = content
52
+
53
+
54
+ class SlackThread:
55
+ def __init__(self, min_ts: str, max_ts: str, user: str, unique_users: set[str], summary: str, message_count: int,
56
+ detected_metadata: Optional[ThreadMetadata], jira_tickets: list[str] = None):
57
+ self.min_ts = min_ts
58
+ self.max_ts = max_ts
59
+ self.user = user
60
+ self.unique_users = unique_users
61
+ self.unique_users_count = len(unique_users)
62
+ self.summary = SlackChannelReader.replace_user_ids_with_names_in_summary(summary)
63
+ self.message_count = message_count
64
+ self.positive_topics: list[str] = detected_metadata.list_of_positive_topics if detected_metadata else []
65
+ self.negative_topics: list[str] = detected_metadata.list_of_negative_topics if detected_metadata else []
66
+ self.overall_sentiment: str = detected_metadata.overall_sentiment if detected_metadata else None
67
+ self.jira_tickets: list[str] = jira_tickets if jira_tickets else []
68
+
69
+
70
+ class SlackChannelReader:
71
+ def __init__(self, token, channel_id, channel_name, openai_api_key):
72
+ self.client = slack_sdk.WebClient(token=token)
73
+ self.channel_id = channel_id
74
+ self.channel_name = channel_name
75
+ openai.api_key = openai_api_key
76
+
77
+ @staticmethod
78
+ def replace_user_ids_with_names(text):
79
+ def replacer(match):
80
+ user_id = match.group(1)
81
+ return userIdMapping.get(user_id, match.group(0))
82
+
83
+ return re.sub(r'<@(\w+)>', replacer, text)
84
+
85
+ @staticmethod
86
+ def replace_user_ids_with_names_in_summary(summary):
87
+ # This is a workaround, better to replace ahead of time
88
+ words = summary.split()
89
+
90
+ # Translate each word if it exists in the dictionary, otherwise keep the word as-is
91
+ translated_words = [userIdMapping.get(word, word) for word in words]
92
+
93
+ # Join the translated words back into a single string
94
+ translated_text = ' '.join(translated_words)
95
+
96
+ return translated_text
97
+
98
+ @staticmethod
99
+ def extract_jira_tickets(text: str):
100
+ # Define the pattern for JIRA tickets. Assuming that project names do not contain numbers.
101
+ jira_ticket_pattern = r'\b[A-Z]+-\d+\b'
102
+ # Use findall to get all occurrences of the pattern
103
+ tickets = re.findall(jira_ticket_pattern, text)
104
+ return tickets
105
+
106
+ def save_messages(self, db: shelve.Shelf, msg_csv_file: str):
107
+ count = 0
108
+ with open(msg_csv_file, 'w', newline='') as csvfile:
109
+ writer = csv.writer(csvfile)
110
+ writer.writerow(
111
+ ['thread_id', 'timestamp', 'user', 'content'])
112
+ for thread_ts, thread_messages in db.items():
113
+ writer.writerow([thread_ts, thread_messages[0].timestamp, thread_messages[0].user,
114
+ thread_messages[0].content, thread_messages[0].jira_tickets])
115
+ count += 1
116
+ print(f"Saved {count} messages for channel {self.channel_name} to csv")
117
+
118
+ def summarize_threads(self, thread_id_set: set):
119
+ thread_messages_file = f'csv/{self.channel_name}_messages.csv'
120
+ if not os.path.exists(thread_messages_file):
121
+ print(f"Thread messages file not exists, collecting thread messages for channel {self.channel_name}")
122
+ with open(thread_messages_file, 'w', newline='') as csvfile:
123
+ writer = csv.writer(csvfile)
124
+ writer.writerow(
125
+ ['thread_ts', 'messages_json'])
126
+ thread_count = 0
127
+ for thread_ts in thread_id_set:
128
+ thread_messages = self.read_thread_messages(self.channel_id, thread_ts)
129
+ message_dicts = [msg.__dict__ for msg in thread_messages]
130
+ writer.writerow([thread_ts, json.dumps(message_dicts)])
131
+ thread_count += 1
132
+ if thread_count % 100 == 0:
133
+ print(f"Collected messages for {thread_count} threads")
134
+ print(f"Collecting thread messages completed for : {len(thread_id_set)} threads")
135
+
136
+ # From file read messages and generate threads to another CSV
137
+ messages_count = 0
138
+ with open(f'csv/{self.channel_name}.csv', 'w', newline='') as csvfile:
139
+ writer = csv.writer(csvfile)
140
+ writer.writerow(
141
+ ['Start Time', 'Last Updated', 'Originator', 'Unique Users', 'Unique Users Count', 'Summary',
142
+ 'Message Count',
143
+ 'Positive Topics',
144
+ 'Negative Topics', 'Overall Sentiment'])
145
+ max_thread_size = 0
146
+ thread_count = 0
147
+ with open(thread_messages_file, 'r', newline='', encoding='utf-8') as csvfile_msgs:
148
+ csv_reader = csv.DictReader(csvfile_msgs)
149
+ for row in csv_reader:
150
+ thread_ts = str(row['thread_ts']).strip()
151
+ thread_messages_dict = json.loads(str(row['messages_json']))
152
+ thread_messages: list[SlackMessage] = [SlackMessage(d['user'], d['timestamp'], d['content']) for d
153
+ in thread_messages_dict]
154
+ messages_count += len(thread_messages)
155
+ print(f"Summarizing thread {thread_ts} with {len(thread_messages)} messages")
156
+ slack_thread = self._get_thread_summary(thread_messages)
157
+ max_thread_size = max(max_thread_size, len(thread_messages))
158
+ if slack_thread:
159
+ writer.writerow(slack_thread.__dict__.values())
160
+ thread_count += 1
161
+ print(f"Max thread size: {max_thread_size}")
162
+ return messages_count
163
+
164
+ def read_messages(self, start_date):
165
+ threads_file = f'csv/{self.channel_name}_threads.csv'
166
+ if not os.path.exists(threads_file):
167
+ print(f"Threads file not exists, collecting thread ids for channel {self.channel_name}")
168
+ start_timestamp = str(start_date.timestamp())
169
+ cursor = None
170
+ has_more = True
171
+ thread_id_set = set()
172
+ while has_more:
173
+ response_data = self.read_slack_conversations(cursor, start_timestamp).data
174
+ for response in response_data["messages"]:
175
+ if "thread_ts" in response:
176
+ thread_id_set.add(response["thread_ts"])
177
+ has_more = response_data["has_more"]
178
+ if has_more:
179
+ cursor = response_data["response_metadata"]["next_cursor"]
180
+ print(f"Collected {len(thread_id_set)} thread ids for channel {self.channel_name}")
181
+ with open(threads_file, 'w') as f:
182
+ for element in thread_id_set:
183
+ f.write(element + '\n')
184
+ with open(threads_file) as f:
185
+ thread_id_set = set(f.readlines())
186
+ message_count = self.summarize_threads(thread_id_set)
187
+ return message_count, len(thread_id_set)
188
+
189
+ @sleep_and_retry
190
+ @limits(calls=1, period=1)
191
+ def read_slack_conversations(self, cursor, start_timestamp):
192
+ response = self.client.conversations_history(
193
+ channel=self.channel_id,
194
+ limit=1000,
195
+ oldest=start_timestamp,
196
+ cursor=cursor
197
+ )
198
+ return response
199
+
200
+ def read_thread_messages(self, channel_id, thread_ts) -> List[SlackMessage]:
201
+ all_messages: list[SlackMessage] = []
202
+ next_cursor = None
203
+ has_more = True
204
+ while has_more:
205
+ # Call the conversations.replies method using the WebClient
206
+ result = self.read_slack_thread_messages(channel_id, next_cursor, thread_ts)
207
+
208
+ messages = result['messages']
209
+ for message in messages:
210
+ try:
211
+ if 'user' in message:
212
+ all_messages.append(SlackMessage(message['user'], message['ts'], message['text']))
213
+ elif 'subtype' in message:
214
+ all_messages.append(SlackMessage(message['subtype'], message['ts'], message['text']))
215
+ else:
216
+ print(f"Unknown message type: {message}")
217
+ except KeyError:
218
+ print(f"KeyError for message: {message}")
219
+ has_more = result["has_more"]
220
+ if has_more:
221
+ next_cursor = result["response_metadata"]["next_cursor"]
222
+ return all_messages
223
+
224
+ @sleep_and_retry
225
+ @limits(calls=2, period=1)
226
+ def read_slack_thread_messages(self, channel_id, next_cursor, thread_ts):
227
+ result = self.client.conversations_replies(
228
+ channel=channel_id,
229
+ ts=thread_ts,
230
+ cursor=next_cursor
231
+ )
232
+ return result
233
+
234
+ @staticmethod
235
+ def _get_thread_summary(thread_messages: List[SlackMessage]) -> Optional[SlackThread]:
236
+
237
+ if len(thread_messages) == 1:
238
+ return None
239
+ documents = []
240
+ unique_users = set()
241
+ jira_tickets = []
242
+ min_timestamp = datetime.datetime.now()
243
+ max_timestamp = datetime.datetime(1970, 1, 1)
244
+ for slack_message in thread_messages:
245
+ unique_users.add(slack_message.user)
246
+ updated_msg = SlackChannelReader.replace_user_ids_with_names(str(slack_message.content))
247
+ msg = str(slack_message.user) + " : " + str(updated_msg)
248
+ documents.append(Document(text=msg))
249
+ tickets = SlackChannelReader.extract_jira_tickets(updated_msg)
250
+ if tickets:
251
+ jira_tickets.extend(tickets)
252
+ min_timestamp = min(min_timestamp, datetime.datetime.fromtimestamp(float(slack_message.timestamp)))
253
+ max_timestamp = max(max_timestamp, datetime.datetime.fromtimestamp(float(slack_message.timestamp)))
254
+ if SKIP_AI or (len(thread_messages) == 1 and len(thread_messages[0].content) < 50):
255
+ summary = thread_messages[0].content
256
+ else:
257
+ qe = GPTListIndex.from_documents(documents).as_query_engine(service_context=service_context)
258
+ resp = qe.query(
259
+ "What is the key insight from this discussion thread, describe in less than 50 words"
260
+ )
261
+ summary = resp.response
262
+ metadata: Optional[ThreadMetadata] = metadata_extractor.extract_metadata(summary) if not SKIP_AI else None
263
+
264
+ return SlackThread(min_timestamp.isoformat(), max_timestamp.isoformat(), thread_messages[0].user, unique_users,
265
+ summary,
266
+ len(thread_messages), metadata, jira_tickets)
267
+
268
+
269
+ def main():
270
+ start_date = datetime.datetime(2023, 1, 1)
271
+ token = os.environ.get('SLACK_API_TOKEN')
272
+ openai_api_key = os.environ.get('OPENAI_API_KEY')
273
+ if not token:
274
+ print('Please set the SLACK_API_TOKEN environment variable.')
275
+ exit(1)
276
+ if not openai_api_key:
277
+ print('Please set the OPENAI_API_KEY environment variable.')
278
+ exit(1)
279
+ if len(sys.argv) < 2:
280
+ print('Usage: python3 index_slack.py channel1,channel2,channel3')
281
+ exit(1)
282
+ channel_id_mapping = ChannelIdMapper(token)
283
+ channels = sys.argv[1].split(',')
284
+ for channel in channels:
285
+ print(f'Indexing channel {channel} with id {channel_id_mapping.get_channel_id(channel)} from: {start_date}')
286
+ reader = SlackChannelReader(token, channel_id_mapping.get_channel_id(channel), channel, openai_api_key)
287
+ message_count, thread_count = reader.read_messages(start_date)
288
+ print(f'Indexed {thread_count} threads created from {message_count} messages for channel {channel}')
289
+
290
+
291
+ main()
spacy_topics.py ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spacy
2
+ import numpy as np
3
+
4
+ nlp = spacy.load("en_core_web_md")
5
+
6
+
7
+ def cosine_similarity(a, b):
8
+ return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
9
+
10
+
11
+ def find_representative_sub_topic(sub_topics):
12
+ sub_topic_vectors = [np.mean([nlp(word.lower()).vector for word in topic.split()], axis=0) for topic in sub_topics]
13
+
14
+ avg_similarities = {}
15
+ for i, vec1 in enumerate(sub_topic_vectors):
16
+ total_sim = 0
17
+ for j, vec2 in enumerate(sub_topic_vectors):
18
+ if i != j:
19
+ total_sim += cosine_similarity(vec1, vec2)
20
+ avg_similarities[sub_topics[i]] = total_sim / (len(sub_topic_vectors) - 1)
21
+
22
+ most_representative_sub_topic = max(avg_similarities, key=avg_similarities.get)
23
+
24
+ return most_representative_sub_topic
25
+
26
+
27
+ sub_topics1 = ['Machine Learning', 'Deep Learning', 'Supervised Learning']
28
+ sub_topics2 = ['Web Development', 'Web Design', 'Website Building']
29
+ sub_topics3 = ['Healthy Eating', 'Nutrition', 'Balanced Diet', 'Wellness']
30
+ sub_topics4 = ['Hours Support', 'Working Hours', 'Morning Brief Calls']
31
+
32
+ print(f"Representative sub-topic for {sub_topics1}: {find_representative_sub_topic(sub_topics1)}")
33
+ print(f"Representative sub-topic for {sub_topics2}: {find_representative_sub_topic(sub_topics2)}")
34
+ print(f"Representative sub-topic for {sub_topics3}: {find_representative_sub_topic(sub_topics3)}")
35
+ print(f"Representative sub-topic for {sub_topics4}: {find_representative_sub_topic(sub_topics4)}")
summary_index_slack.py ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+ import sys
4
+ from datetime import datetime, timedelta
5
+
6
+ import requests
7
+ logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=os.environ.get("LOGLEVEL", "DEBUG"))
8
+ from llama_index import VectorStoreIndex, StorageContext, download_loader, DocumentSummaryIndex, ServiceContext, \
9
+ get_response_synthesizer
10
+ from llama_index.llms import OpenAI
11
+
12
+ token = os.environ.get('SLACK_API_TOKEN') # Retrieve your Slack API token from environment variables
13
+ fromDate = datetime.now() - timedelta(365)
14
+ index_root = './summary_index'
15
+
16
+
17
+ def create_channel_dict():
18
+ base_url = 'https://slack.com/api/conversations.list'
19
+ headers = {'Authorization': f'Bearer {token}'}
20
+ params = {
21
+ 'types': 'public_channel,private_channel',
22
+ 'limit': 1000
23
+ }
24
+ response = requests.get(base_url, headers=headers, params=params)
25
+ data = response.json()
26
+
27
+ channel_dict = {}
28
+ if data['ok']:
29
+ channels = data['channels']
30
+ for channel in channels:
31
+ channel_name = channel['name']
32
+ channel_id = channel['id']
33
+ channel_dict[channel_name] = channel_id
34
+ else:
35
+ print(f'Error: {data}')
36
+ #print(channel_dict)
37
+ return channel_dict
38
+
39
+
40
+ def index_channels(channels):
41
+ SlackReader = download_loader("SlackReader")
42
+ loader = SlackReader(token, earliest_date=fromDate)
43
+ chatgpt = OpenAI(temperature=0, model="gpt-3.5-turbo")
44
+ service_context = ServiceContext.from_defaults(llm=chatgpt, chunk_size=1024)
45
+ response_synthesizer = get_response_synthesizer(
46
+ response_mode="tree_summarize", use_async=True
47
+ )
48
+ for channel in channels:
49
+ documents = loader.load_data(channel_ids=['C02JEH5KGGN'], reverse_chronological=False)
50
+ storage_context = StorageContext.from_defaults()
51
+ summary_query = (
52
+ "Give a concise summary of this document in bullet points. Also describe some of the questions "
53
+ "that this document can answer. "
54
+ )
55
+ index = DocumentSummaryIndex.from_documents(
56
+ documents=documents,
57
+ service_context=service_context,
58
+ response_synthesizer=response_synthesizer,
59
+ storage_context=storage_context,
60
+ )
61
+ #index = VectorStoreIndex.from_documents(documents=documents, storage_context=storage_context)
62
+ save_location = f"{index_root}/{channel}"
63
+ if not os.path.exists(save_location):
64
+ os.makedirs(save_location)
65
+ storage_context.persist(save_location)
66
+
67
+
68
+ def main():
69
+ if len(sys.argv) < 2:
70
+ print('Usage: python3 index_slack.py channel1,channel2,channel3')
71
+ exit(1)
72
+ channels = sys.argv[1].split(',')
73
+ channel_dict = create_channel_dict()
74
+ for channel in channels:
75
+ if channel not in channel_dict:
76
+ print(f'Channel {channel} not found. Available channels: {channel_dict.keys()}')
77
+ exit(1)
78
+ index_channels(channels)
79
+
80
+
81
+ if __name__ == '__main__':
82
+ main()
topic_analysis.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import csv
2
+ from collections import Counter
3
+
4
+ # Initialize Counter object to keep track of the frequency of each topic
5
+ topic_counter = Counter()
6
+ include_positive = False
7
+ interested_topics = ["none", "error", "issue", "high cpu utilization", "lambdas", "authentication issue",
8
+ "error message"]
9
+ summary_list = []
10
+ topic_summary_list = {}
11
+ # Read the CSV file
12
+ try:
13
+ with open('csv/platform-engg-updated.csv', 'r', newline='', encoding='utf-8') as csvfile:
14
+ csv_reader = csv.DictReader(csvfile)
15
+
16
+ for row in csv_reader:
17
+ # Extract the Positive Topics and Negative Topics fields and evaluate them as Python lists
18
+ positive_topics = eval(row['Positive Topics'])
19
+ negative_topics = eval(row['Negative Topics'])
20
+
21
+ # Update the counter based on the topics in this row
22
+
23
+ if include_positive:
24
+ for topic in positive_topics:
25
+ topic_counter[topic.lower()] += 1
26
+
27
+ for topic in negative_topics:
28
+ topic_counter[topic.lower()] += 1
29
+ if topic.lower() in interested_topics:
30
+ summary_list.append(row['Summary'])
31
+ if topic.lower() in topic_summary_list:
32
+ topic_summary_list[topic.lower()].append(row['Summary'])
33
+ else:
34
+ topic_summary_list[topic.lower()] = [row['Summary']]
35
+
36
+ # Display the consolidated list of topics along with their frequency
37
+ print(f"Consolidated List of Topics with Frequency({len(topic_counter.items())}):")
38
+ for topic, freq in topic_counter.most_common():
39
+ print(f"{topic}, {freq}")
40
+ print("Short listed summaries:")
41
+ for topic in topic_summary_list:
42
+ print(f"-------------------{topic}-------------------------------" )
43
+ for summary in topic_summary_list[topic]:
44
+ print(summary)
45
+ print(" ")
46
+ except FileNotFoundError:
47
+ print("File not found. Please make sure the file 'your_file.csv' exists in the same directory as this script.")
48
+ except Exception as e:
49
+ print(f"An error occurred: {e}")
user_id_to_name_mapping.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"USLACKBOT": "slackbot", "U02681CCLFP": "rgupta", "U026B1ZN27L": "knarayan", "U026B21NXFC": "psomasamudram", "U026B81UJE7": "sschrage", "U026BRL5S7M": "minukolunu", "U026JDJCFU3": "googledrive", "U026PMDB1ND": "rtaraniganty", "U026QDFHVE0": "google_calendar", "U0270L50YJG": "onedrive_sharepoint", "U027C0CQW6B": "zoom", "U0281D3GWHL": "psomasamudram563", "U028EDANJM9": "gshenoy", "U029C08M0KH": "abaveja", "U029QCXG2NB": "polly", "U02A285R6KX": "axmtest", "U02AFPFQ3ML": "gitlab_webhook", "U02B3N7PT6F": "automateio", "U02BAM136GH": "jirabot", "U02BV2DGUKC": "aganivada", "U02BWMV7UQ3": "confluence", "U02CCJPSSQY": "kholikatti", "U02CRMH6KK9": "box", "U02D4DUKDQC": "hchintamreddy", "U02D55CUDD3": "outlook_calendar", "U02DFBF4EAG": "microsoft_teams_calls", "U02DUHUV77W": "workstreams", "U02E8H1367Q": "lever", "U02EMH12UJ0": "jcook", "U02F3Q70N3V": "axmpoll", "U02F5L7CSF4": "arai", "U02FJGUFR7A": "rvasishth", "U02FJLCEAD9": "lbailey", "U02FJLCGXMH": "skurdiukov", "U02FW45VACF": "rpathi", "U02G6SMGXF0": "1password", "U02GC8SE18V": "rvaidya", "U02HCMTQU3W": "pmangalapuri", "U02HQ78V9A5": "akasim", "U02J4ENC7D4": "deployment_notifier", "U02JA9ALAUB": "loom", "U02JRTQLTEH": "axmritutest", "U02KAQREWUU": "wb_bot_a02ky8us18q", "U02KY9M6UN8": "simplepoll", "U02LS3DTCNT": "onloop", "U02LWSR17K4": "axiamatic_development", "U02M5245LLD": "axiamatic_gitlab", "U02M8A2HJNP": "jdanny", "U02MVLH88EB": "dsandic", "U02PDCWQY1K": "wb_bot_a02pjjxgze0", "U02PQEYFW7P": "tmoroz", "U02Q02G09QX": "akalyta", "U02RC6VTFC0": "sbhojwani", "U02RE8S0FP0": "wb_bot_a02rluhurne", "U02RQ5QTAG7": "figma", "U02RXLK867P": "kmarshall", "U02SCRTM2M7": "sfarooqh", "U02SF36PVKL": "mnirmal", "U02SRUH332B": "wb_bot_a02tw9drk96", "U02T0M6F40P": "wb_bot_a02tcca8z1b", "U02T4E0BVA8": "sparashar", "U02TJR2GSLD": "todo", "U02TVMF3CR4": "sjain", "U02U4LVEK3N": "akumar", "U02U64PRV7G": "todoist", "U02UBTH6U3H": "wb_bot_a02uur97w3e", "U02ULESR97B": "sdt", "U02UR191AH5": "powerful_app", "U02UZGPSPK4": "wb_bot_a02uss8dcq6", "U02V55MF6G1": "wb_bot_a03028e0x08", "U02V8M481H8": "wb_bot_a02vb0q6qq4", "U02VB0N97RS": "wb_bot_a02v218mhej", "U0307M5KJ6N": "gitlab_notifications", "U031HPTBDGF": "lightstep", "U031PNP8JQ4": "iris", "U031V63V5EF": "wlee", "U032RAJ4BN1": "ppradhan", "U03358L7YP5": "axiamatic_bot_int", "U0336QZAF98": "rsrinivasan", "U033H4KN7HV": "shgupta", "U033PPLNFRU": "anair", "U033W7L0EFR": "axiamatic_bot_stage", "U034D8U473M": "donut", "U034NNPQXGQ": "wb_bot_a034bjpc77b", "U034NUHQ7GQ": "wb_bot_a034bqgdt41", "U034RLJA97X": "sranjan", "U036E561K6E": "mshashikant", "U036M0VFVAP": "deployment_bot", "U0386E882AE": "wb_bot_a0383hjldjr", "U038K35HBMX": "wb_bot_a037rsbv6jk", "U038W6W19Q8": "wb_bot_a037zpxgbfy", "U038ZMMJT71": "logz_alerts__reg-int_", "U038ZSFRGF9": "logz_alerts_reg_prod", "U0397QLJNCE": "logz_alerts_reg_stage", "U039BFN3MT7": "logz_alerts_reg_int", "U039GQJKFU4": "logz_alerts_critica2", "U039YQQ9MEC": "wb_bot_a0392cjfk9c", "U03A470696U": "logz_alerts", "U03A47RNGGY": "logz_alerts_critica3", "U03AFD0K8M6": "shuffl", "U03ATME145V": "data_team_minion", "U03BJ688PB8": "wb_bot_a03bj6886uw", "U03BPNY5AGM": "pkarthikeyan", "U03D5DEEKMJ": "wb_bot_a03cnf34klp", "U03DHUAJVMK": "araman", "U03DLS1FN3D": "rpandey", "U03DLSJS5QT": "shosakatti", "U03DSMQJ2TZ": "wb_bot_a03e79v48cb", "U03DUDT4Z38": "wb_bot_a03e3dd2544", "U03DZENJPKR": "wb_bot_a03f3qw2tlg", "U03EBHT8E9H": "wb_bot_a03dx0eggq7", "U03EQAE747R": "srao", "U03ERBMMJ2V": "wb_bot_a03ef3ftbul", "U03GP7DMG5U": "registrar_office", "U03GY6U5MJ8": "logz_receiver", "U03H7MMHY3S": "adatta", "U03J85E154Y": "local_axiamatic_bot", "U03JFF9L2GM": "ssamantray", "U03JP3U0VSA": "opsgenie", "U03JY3HNT36": "opsgenie_for_alerting", "U03K42D7NUR": "wb_bot_a03k42d62bt", "U03KFN4C08Y": "wb_bot_a03jrvc6vmg", "U03KLHDKL1H": "askumar", "U03L9E3PC6A": "system_health_reporte", "U03LC2EMKHR": "axiamatic_app_sanket", "U03LCE8SD6Z": "trello", "U03LT2A0L75": "wb_bot_a03lcfqeq95", "U03ML44ADTQ": "avenkataraman", "U03ML44G5RC": "sbhosale", "U03MSMV0W66": "smurali", "U03MZ2ENZ8U": "axiamatic", "U03NZ7Z52S2": "bganganna", "U03P6607C10": "wb_bot_a03p64cfysx", "U03P90RUSJ2": "ragarwal", "U03P99MNLBC": "beta", "U03PTKB04P4": "ksingh", "U03RQDE3QUS": "nsrivastava", "U03RSS0S76Y": "snangia", "U040QFUGC2Z": "rogupta", "U040RCBPBEC": "svummidi", "U042KRZPXHT": "gdahiya", "U042NMTGJ03": "asaludchua", "U0431DZTPJM": "ppant", "U043K9ER6TZ": "wb_bot_a043t7xdhb8", "U043YU326MR": "wb_bot_a043yu30tef", "U044687Q3ME": "local_axiamatic_botlo", "U044UL2LANQ": "github", "U046ATZ12RL": "apatole", "U04A29R8J81": "gamemonk", "U04A2C30R97": "dpurushothaman", "U04ARFN3WQP": "amishra", "U04BWHQP5DM": "wb_bot_a04cpp2kn57", "U04DFELB1U6": "tollgate", "U04EV0M2VA6": "mli", "U04FA31LK9B": "wb_bot_a04fd1f897c", "U04GJ1TMVUL": "ksmith", "U04HT5THKQF": "axolo", "U04JRMUL7HN": "pwinslow", "U04JT69T00K": "pjha", "U04L2HKL3FA": "lucidchart", "U04N1EQRYHH": "asana", "U04NPHNJMCP": "ahaefner", "U04PE2HUDE3": "rattle", "U04R185PK54": "operations", "U04RCHF3H55": "thegist", "U04RE00SABC": "geekbot", "U04RUV6SGU9": "vtiwari", "U04RZQLT1QT": "focus", "U04TL3AUPQA": "salesforce", "U04U6FLBLMQ": "wb_bot_a04trv27e5v", "U04UR378KK3": "chorus", "U04VDAR8F0U": "wb_bot_a04vasmt60j", "U04VDGWLEPP": "zendesk", "U055SFZLY73": "surveysparrow", "U055SRY74R0": "hsingh", "U055X02CXGS": "dmorampudi", "U056U7K4A14": "powerful_app2", "U058BLP51U2": "llama", "U058XBVBURM": "gitlab", "U05D3HNDW3D": "bkathi", "U05DR9X8QT1": "kagarwal", "U05EEUZ62DS": "lalmeida", "U05H239ESCX": "statusio"}