@@ -1361,6 +1361,26 @@ static common_chat_params common_chat_params_init_gpt_oss(const common_chat_temp
1361
1361
" <|end|>" ,
1362
1362
};
1363
1363
1364
+ if (!inputs.json_schema .is_null ()) {
1365
+ data.grammar_lazy = false ;
1366
+ data.grammar = build_grammar ([&](const common_grammar_builder & builder) {
1367
+ auto schema = inputs.json_schema ;
1368
+ builder.resolve_refs (schema);
1369
+
1370
+ auto not_end = builder.add_rule (" not-end" ,
1371
+ " [^<] | \" <\" [^|] | \" <|\" [^e] | \" <|e\" [^n] | \" <|en\" [^d] | \" <|end\" [^|] | \" <|end|\" [^>]" );
1372
+ auto analysis = builder.add_rule (" analysis" ,
1373
+ " \" <|channel|>analysis<|message|>\" ( " + not_end + " )* \" <|end|>\" " );
1374
+ auto constraint = builder.add_rule (" constraint" , " \" <|constrain|>\" ? [a-zA-Z0-9_-]+" );
1375
+ auto final = builder.add_rule (" final" ,
1376
+ " \" <|channel|>final\" ( \" \" " + constraint + " )? \" <|message|>\" " +
1377
+ builder.add_schema (" response" , schema)
1378
+ );
1379
+
1380
+ builder.add_rule (" root" , " ( " + analysis + " \" <|start|>assistant\" )? " + final );
1381
+ });
1382
+ }
1383
+
1364
1384
if (inputs.tools .is_array () && !inputs.tools .empty ()) {
1365
1385
data.grammar_lazy = inputs.tool_choice != COMMON_CHAT_TOOL_CHOICE_REQUIRED;
1366
1386
data.grammar = build_grammar ([&](const common_grammar_builder & builder) {
@@ -2121,7 +2141,7 @@ static common_chat_params common_chat_templates_apply_jinja(
2121
2141
}
2122
2142
2123
2143
// GPT-OSS
2124
- if (src.find (" <|channel|>" ) != std::string::npos && params. json_schema . is_null () ) {
2144
+ if (src.find (" <|channel|>" ) != std::string::npos) {
2125
2145
return common_chat_params_init_gpt_oss (tmpl, params);
2126
2146
}
2127
2147
0 commit comments