@cobrowser/chatgpt 0.7.35 → 0.7.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -105,43 +105,87 @@ class CopilotService extends BaseService_1.default {
105
105
  * @param message
106
106
  */
107
107
  getAssistantSuggestions(conversation) {
108
- var _a;
108
+ var _a, _b;
109
109
  return __awaiter(this, void 0, void 0, function* () {
110
- // Here we get the last customer message as we dont need the whole conversation
111
- // as we are doing with the other approach.
112
- const conversationArray = conversation.split('\n'), lastCustomerMessage = conversationArray.reverse().find(e => e.includes('customer:'));
113
- if (!lastCustomerMessage) {
114
- logger_1.default.error('Last customer message not found');
115
- return Promise.reject(new Error('Last customer message not found'));
110
+ const conversationLines = conversation.split('\n').filter(line => line.trim());
111
+ const messages = [];
112
+ for (const line of conversationLines) {
113
+ if (line.includes('customer:')) {
114
+ messages.push({
115
+ role: 'user',
116
+ content: line.replace(/^customer:\s*/, '').trim()
117
+ });
118
+ }
119
+ else if (line.includes('agent:')) {
120
+ messages.push({
121
+ role: 'assistant',
122
+ content: line.replace(/^agent:\s*/, '').trim()
123
+ });
124
+ }
125
+ }
126
+ if (messages.length === 0) {
127
+ logger_1.default.error('No valid messages found in conversation');
128
+ return Promise.reject(new Error('No valid messages found in conversation'));
116
129
  }
117
130
  const openai = new openai_1.default({ apiKey: this.openaiApiKey });
118
- let run;
131
+ let thread;
119
132
  if (!this.threadId) {
120
- const thread = yield openai.beta.threads.create();
133
+ thread = yield openai.beta.threads.create({
134
+ metadata: {
135
+ lastMessageIndex: '-1'
136
+ }
137
+ });
121
138
  this.threadId = thread.id;
122
139
  }
123
- const lastThreadMessasges = yield openai.beta.threads.messages.list(this.threadId, { order: "desc", limit: 2 }), isRepeatedMessage = lastThreadMessasges.data.find(msg => msg.content[0].type === 'text' && msg.content[0].text.value === lastCustomerMessage);
124
- // making sure that we're not saving repeated messages
125
- if (isRepeatedMessage) {
126
- const runs = yield openai.beta.threads.runs.list(this.threadId, { order: "desc", limit: 1 });
127
- run = runs.data[0];
128
- }
129
140
  else {
130
- yield openai.beta.threads.messages.create(this.threadId, { role: "user", content: lastCustomerMessage });
131
- run = yield openai.beta.threads.runs.create(this.threadId, { assistant_id: (_a = this.assistantId) !== null && _a !== void 0 ? _a : '' });
141
+ thread = yield openai.beta.threads.retrieve(this.threadId);
132
142
  }
133
- while (['queued', 'in_progress', 'cancelling'].includes(run.status)) {
143
+ const lastMessageIndex = parseInt(((_a = thread.metadata) === null || _a === void 0 ? void 0 : _a.lastMessageIndex) || '-1', 10);
144
+ const newMessages = messages.slice(lastMessageIndex + 1);
145
+ if (newMessages.length === 0) {
146
+ // Retrieve the last assistant message from the thread
147
+ const { data } = yield openai.beta.threads.messages.list(this.threadId, { order: 'desc', limit: 10 });
148
+ const lastAssistantMessage = data.find(msg => msg.role === 'assistant');
149
+ if (lastAssistantMessage) {
150
+ const messagesData = lastAssistantMessage.content.map((content) => content.type === 'text' ? content.text : '').filter(text => text);
151
+ if (messagesData.length) {
152
+ const answers = messagesData.map(message => message.value);
153
+ return {
154
+ data: __classPrivateFieldGet(this, _CopilotService_instances, "m", _CopilotService_processSuggestions).call(this, answers),
155
+ threadId: this.threadId,
156
+ usageTokens: undefined,
157
+ };
158
+ }
159
+ }
160
+ return Promise.reject(new Error('No previous assistant messages found'));
161
+ }
162
+ for (const message of newMessages) {
163
+ yield openai.beta.threads.messages.create(this.threadId, {
164
+ role: message.role,
165
+ content: message.content
166
+ });
167
+ }
168
+ yield openai.beta.threads.update(this.threadId, {
169
+ metadata: {
170
+ lastMessageIndex: (messages.length - 1).toString()
171
+ }
172
+ });
173
+ const run = yield openai.beta.threads.runs.create(this.threadId, {
174
+ assistant_id: (_b = this.assistantId) !== null && _b !== void 0 ? _b : ''
175
+ });
176
+ let currentRun = run;
177
+ while (['queued', 'in_progress', 'cancelling'].includes(currentRun.status)) {
134
178
  yield new Promise(resolve => setTimeout(resolve, 500));
135
- run = yield openai.beta.threads.runs.retrieve(run.thread_id, run.id);
179
+ currentRun = yield openai.beta.threads.runs.retrieve(currentRun.thread_id, currentRun.id);
136
180
  }
137
- if (run.status === 'completed') {
138
- const { data } = yield openai.beta.threads.messages.list(run.thread_id, { order: 'desc', limit: 1 }), messages = data.flatMap((message) => message === null || message === void 0 ? void 0 : message.content.map((content) => ((content.type === 'text' && message.role === 'assistant') ? content.text : ''))), assistantMessages = messages.filter(message => typeof message === 'object' && 'value' in message && typeof message.value === 'string');
181
+ if (currentRun.status === 'completed') {
182
+ const { data } = yield openai.beta.threads.messages.list(currentRun.thread_id, { order: 'desc', limit: 1 }), messagesData = data.flatMap((message) => message === null || message === void 0 ? void 0 : message.content.map((content) => ((content.type === 'text' && message.role === 'assistant') ? content.text : ''))), assistantMessages = messagesData.filter(message => typeof message === 'object' && 'value' in message && typeof message.value === 'string');
139
183
  if (assistantMessages.length) {
140
184
  const answers = assistantMessages.map(message => message.value);
141
185
  return {
142
186
  data: __classPrivateFieldGet(this, _CopilotService_instances, "m", _CopilotService_processSuggestions).call(this, answers),
143
- threadId: run.thread_id,
144
- usageTokens: run.usage,
187
+ threadId: currentRun.thread_id,
188
+ usageTokens: currentRun.usage,
145
189
  };
146
190
  }
147
191
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cobrowser/chatgpt",
3
- "version": "0.7.35",
3
+ "version": "0.7.37",
4
4
  "description": "chatgpt services to connect our projects with chatgpt api",
5
5
  "keywords": [
6
6
  "chatgpt",
@@ -40,5 +40,5 @@
40
40
  "bugs": {
41
41
  "url": "https://bitbucket.org/cobrowser/cb_utils/issues"
42
42
  },
43
- "gitHead": "ae58d4ce169a5f2b8f262b502114040e4d74d538"
43
+ "gitHead": "b72f8b0bd24f523172f83cb4bc833ad605684565"
44
44
  }