@@ -786,18 +786,27 @@ static bool llm_check_context (sqlite3_context *context) {
786786// MARK: - Chat Messages -
787787
788788bool 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