@@ -43,11 +43,33 @@ common_chat_params peg_generator::generate_parser(const common_chat_template &
4343 const autoparser & autoparser) {
4444 // Create the result structure
4545 common_chat_params data;
46- data.prompt = common_chat_template_direct_apply (tmpl, inputs);
47- data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
48- data.preserved_tokens = autoparser.preserved_tokens ;
46+ data.prompt = common_chat_template_direct_apply (tmpl, inputs);
47+ data.generation_prompt = common_chat_template_generation_prompt (tmpl, inputs);
48+ data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
49+ data.preserved_tokens = autoparser.preserved_tokens ;
50+
51+ std::string parser_generation_prompt = data.generation_prompt ;
52+
53+ if (inputs.continue_final_message != COMMON_CHAT_CONTINUATION_NONE && !inputs.continue_msg .empty ()) {
54+ // Build up generation prompt manually
55+ const auto & msg = inputs.continue_msg ;
56+
57+ if (!autoparser.reasoning .start .empty ()) {
58+ data.generation_prompt = data.generation_prompt .substr (0 , data.generation_prompt .find (autoparser.reasoning .start ));
59+ data.generation_prompt += autoparser.reasoning .start + msg.reasoning_content ;
60+ if (inputs.continue_final_message == COMMON_CHAT_CONTINUATION_CONTENT) {
61+ data.generation_prompt += autoparser.reasoning .end ;
62+ }
63+ }
64+
65+ if (inputs.continue_final_message == COMMON_CHAT_CONTINUATION_CONTENT) {
66+ data.generation_prompt += msg.render_content ();
67+ }
68+
69+ data.prompt += data.generation_prompt ;
70+ }
4971
50- auto parser = autoparser.build_parser (inputs);
72+ auto parser = autoparser.build_parser (inputs, parser_generation_prompt );
5173 data.parser = parser.save ();
5274
5375 // Build grammar if tools are present
@@ -87,7 +109,7 @@ common_chat_params peg_generator::generate_parser(const common_chat_template &
87109 return data;
88110}
89111
90- common_peg_arena autoparser::build_parser (const generation_params & inputs) const {
112+ common_peg_arena autoparser::build_parser (const generation_params & inputs, const std::string & generation_prompt ) const {
91113 if (!analysis_complete) {
92114 throw std::invalid_argument (" Cannot call build_parser on autoparser without performing analysis first, call analyze_template(...)" );
93115 }
@@ -121,7 +143,7 @@ common_peg_arena autoparser::build_parser(const generation_params & inputs) cons
121143 } else {
122144 parser = content.build_parser (ctx);
123145 }
124- return pure_content ? p.prefix (inputs. generation_prompt , reasoning.start ) + parser : p.prefix (inputs. generation_prompt , reasoning.start ) << parser;
146+ return pure_content ? p.prefix (generation_prompt, reasoning.start ) + parser : p.prefix (generation_prompt, reasoning.start ) << parser;
125147 });
126148}
127149
0 commit comments