Skip to content

Commit b136b62

Browse files
authored
fix: Fix broken structured output when using $refs in json_schema (ggml-org#21699)
1 parent 81069a8 commit b136b62

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

common/chat-auto-parser-generator.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ common_chat_params peg_generator::generate_parser(const common_chat_template &
6969
auto schema = function.contains("parameters") ? function.at("parameters") : json::object();
7070
builder.resolve_refs(schema);
7171
});
72+
if (has_response_format) {
73+
auto schema = inputs.json_schema;
74+
builder.resolve_refs(schema);
75+
}
7276
parser.build_grammar(builder, data.grammar_lazy);
7377
});
7478

common/chat.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -865,9 +865,10 @@ static common_chat_params common_chat_params_init_ministral_3(const common_chat_
865865
adjusted_messages.push_back(adjusted);
866866
}
867867

868-
auto has_tools = inputs.tools.is_array() && !inputs.tools.empty();
869-
auto extract_reasoning = inputs.reasoning_format != COMMON_REASONING_FORMAT_NONE;
870-
auto include_grammar = true;
868+
auto has_tools = inputs.tools.is_array() && !inputs.tools.empty();
869+
auto has_response_format = inputs.json_schema.is_object() && !inputs.json_schema.empty();
870+
auto extract_reasoning = inputs.reasoning_format != COMMON_REASONING_FORMAT_NONE;
871+
auto include_grammar = true;
871872

872873
data.supports_thinking = true;
873874
data.thinking_start_tag = "[THINK]";
@@ -887,7 +888,7 @@ static common_chat_params common_chat_params_init_ministral_3(const common_chat_
887888
extract_reasoning ? p.optional("[THINK]" + p.reasoning(p.until("[/THINK]")) + "[/THINK]") : p.eps();
888889

889890
// Response format parser
890-
if (inputs.json_schema.is_object() && !inputs.json_schema.empty()) {
891+
if (has_response_format) {
891892
// Ministral wants to emit json surrounded by code fences
892893
return generation_prompt + (reasoning << "```json" << p.content(p.schema(p.json(), "response-format", inputs.json_schema)) << "```");
893894
}
@@ -928,6 +929,10 @@ static common_chat_params common_chat_params_init_ministral_3(const common_chat_
928929
auto schema = function.at("parameters");
929930
builder.resolve_refs(schema);
930931
});
932+
if (has_response_format) {
933+
auto schema = inputs.json_schema;
934+
builder.resolve_refs(schema);
935+
}
931936
parser.build_grammar(builder, data.grammar_lazy);
932937
});
933938

@@ -1063,6 +1068,10 @@ static common_chat_params common_chat_params_init_gpt_oss(const common_chat_temp
10631068
auto schema = function.at("parameters");
10641069
builder.resolve_refs(schema);
10651070
});
1071+
if (has_response_format) {
1072+
auto schema = inputs.json_schema;
1073+
builder.resolve_refs(schema);
1074+
}
10661075
parser.build_grammar(builder, data.grammar_lazy);
10671076
});
10681077

@@ -1193,6 +1202,10 @@ static common_chat_params common_chat_params_init_gemma4(const common_chat_templ
11931202
auto schema = function.at("parameters");
11941203
builder.resolve_refs(schema);
11951204
});
1205+
if (has_response_format) {
1206+
auto schema = inputs.json_schema;
1207+
builder.resolve_refs(schema);
1208+
}
11961209
parser.build_grammar(builder, data.grammar_lazy);
11971210
});
11981211

0 commit comments

Comments
 (0)