Skip to content

Commit 1fe0813

Browse files
author
Daniele Briggi
committed
fix(system-prompt): always reserve first message for system prompt
1 parent 2a12ca3 commit 1fe0813

File tree

2 files changed

+192
-114
lines changed

2 files changed

+192
-114
lines changed

src/sqlite-ai.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -786,18 +786,27 @@ static bool llm_check_context (sqlite3_context *context) {
786786
// MARK: - Chat Messages -
787787

788788
bool llm_messages_append (ai_messages *list, const char *role, const char *content) {
789-
if (list->count >= list->capacity) {
789+
if (role == ROLE_SYSTEM && list->count > 0) {
790+
// only one system prompt allowed at the beginning
791+
return false;
792+
}
793+
794+
bool needs_system_message = (list->count == 0 && role != ROLE_SYSTEM);
795+
size_t required = list->count + (needs_system_message ? 1 : 0);
796+
if (required >= list->capacity) {
790797
size_t new_cap = list->capacity ? list->capacity * 2 : MIN_ALLOC_MESSAGES;
791798
llama_chat_message *new_items = sqlite3_realloc64(list->items, new_cap * sizeof(llama_chat_message));
792799
if (!new_items) return false;
793-
800+
794801
list->items = new_items;
795802
list->capacity = new_cap;
796803
}
797804

798-
if (list->count != 0 && role == ROLE_SYSTEM) {
799-
// only one system message allowed at the beginning
800-
return false;
805+
if (needs_system_message) {
806+
// reserve first item for empty system prompt
807+
list->items[list->count].role = ROLE_SYSTEM;
808+
list->items[list->count].content = sqlite_strdup("");
809+
list->count += 1;
801810
}
802811

803812
bool duplicate_role = ((role != ROLE_SYSTEM) && (role != ROLE_USER) && (role != ROLE_ASSISTANT));
@@ -816,8 +825,8 @@ bool llm_messages_set (ai_messages *list, int pos, const char *role, const char
816825

817826
const char *message_role = message->role;
818827
if ((message_role != ROLE_SYSTEM) && (message_role != ROLE_USER) && (message_role != ROLE_ASSISTANT))
819-
sqlite3_free(message_role);
820-
sqlite3_free(message->content);
828+
sqlite3_free((char *)message_role);
829+
sqlite3_free((char *)message->content);
821830

822831
message->role = (duplicate_role) ? sqlite_strdup(role) : role;
823832
message->content = sqlite_strdup(content);

0 commit comments

Comments
 (0)