Skip to content

Commit

Permalink
🛠️ fix: Minor Fixes in Message, Ask/EditController, `OpenAIClient…
Browse files Browse the repository at this point in the history
…`, and `countTokens` (danny-avila#1463)

* fix(Message): avoid overwriting unprovided properties

* fix(OpenAIClient): return intermediateReply on user abort

* fix(AskController): do not send/save final message if abort was triggered

* fix(countTokens): avoid fetching remote registry and exclusively use cl100k_base or p50k_base weights for token counting

* refactor(Message/messageSchema): rely on messageSchema for default values when saving messages

* fix(EditController): do not send/save final message if abort was triggered

* fix(config/helpers): fix module resolution error
  • Loading branch information
danny-avila authored Dec 30, 2023
1 parent 7a2ad12 commit 98017a8
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 30 deletions.
2 changes: 1 addition & 1 deletion app/clients/OpenAIClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -847,7 +847,7 @@ ${convo}
err?.message?.includes('abort') ||
(err instanceof OpenAI.APIError && err?.message?.includes('abort'))
) {
return '';
return intermediateReply;
}
if (
err?.message?.includes(
Expand Down
14 changes: 7 additions & 7 deletions models/Message.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ module.exports = {
parentMessageId,
sender,
text,
isCreatedByUser = false,
isCreatedByUser,
error,
unfinished,
files,
isEdited = false,
finish_reason = null,
tokenCount = null,
plugin = null,
plugins = null,
model = null,
isEdited,
finish_reason,
tokenCount,
plugin,
plugins,
model,
}) {
try {
const validConvoId = idSchema.safeParse(conversationId);
Expand Down
1 change: 1 addition & 0 deletions models/schema/messageSchema.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const messageSchema = mongoose.Schema(
},
model: {
type: String,
default: null,
},
conversationSignature: {
type: String,
Expand Down
21 changes: 12 additions & 9 deletions server/controllers/AskController.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,16 +118,19 @@ const AskController = async (req, res, next, initializeClient, addTitle) => {
delete userMessage.image_urls;
}

sendMessage(res, {
title: await getConvoTitle(user, conversationId),
final: true,
conversation: await getConvo(user, conversationId),
requestMessage: userMessage,
responseMessage: response,
});
res.end();
if (!abortController.signal.aborted) {
sendMessage(res, {
title: await getConvoTitle(user, conversationId),
final: true,
conversation: await getConvo(user, conversationId),
requestMessage: userMessage,
responseMessage: response,
});
res.end();

await saveMessage({ ...response, user });
}

await saveMessage({ ...response, user });
await saveMessage(userMessage);

if (addTitle && parentMessageId === '00000000-0000-0000-0000-000000000000' && newConvo) {
Expand Down
20 changes: 11 additions & 9 deletions server/controllers/EditController.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,16 +112,18 @@ const EditController = async (req, res, next, initializeClient) => {
response = { ...response, ...metadata };
}

await saveMessage({ ...response, user });
if (!abortController.signal.aborted) {
sendMessage(res, {
title: await getConvoTitle(user, conversationId),
final: true,
conversation: await getConvo(user, conversationId),
requestMessage: userMessage,
responseMessage: response,
});
res.end();

sendMessage(res, {
title: await getConvoTitle(user, conversationId),
final: true,
conversation: await getConvo(user, conversationId),
requestMessage: userMessage,
responseMessage: response,
});
res.end();
await saveMessage({ ...response, user });
}
} catch (error) {
const partialText = getPartialText();
handleAbortError(res, req, error, {
Expand Down
7 changes: 3 additions & 4 deletions server/utils/countTokens.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
const { load } = require('tiktoken/load');
const { Tiktoken } = require('tiktoken/lite');
const registry = require('tiktoken/registry.json');
const models = require('tiktoken/model_to_encoding.json');
const p50k_base = require('tiktoken/encoders/p50k_base.json');
const cl100k_base = require('tiktoken/encoders/cl100k_base.json');
const logger = require('~/config/winston');

const countTokens = async (text = '', modelName = 'gpt-3.5-turbo') => {
let encoder = null;
try {
const model = await load(registry[models[modelName]]);
const model = modelName.includes('text-davinci-003') ? p50k_base : cl100k_base;
encoder = new Tiktoken(model.bpe_ranks, model.special_tokens, model.pat_str);
const tokens = encoder.encode(text);
encoder.free();
Expand Down

0 comments on commit 98017a8

Please sign in to comment.