From 60bac109b3d2c268c3b7216ed3ccceb9a98cd74f Mon Sep 17 00:00:00 2001 From: Iams4kura <126048986+Iams4kura@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:35:43 +0800 Subject: [PATCH] fix: accept JSON schemas in structured output parser --- scrapegraphai/utils/output_parser.py | 5 ++++- tests/utils/output_parser_test.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/scrapegraphai/utils/output_parser.py b/scrapegraphai/utils/output_parser.py index db216e37..b7d4b667 100644 --- a/scrapegraphai/utils/output_parser.py +++ b/scrapegraphai/utils/output_parser.py @@ -5,8 +5,8 @@ from typing import Any, Callable, Dict, List, Type, Union from langchain_core.exceptions import OutputParserException -from langchain_core.outputs import Generation from langchain_core.output_parsers import JsonOutputParser +from langchain_core.outputs import Generation from pydantic import BaseModel as BaseModelV2 from pydantic.v1 import BaseModel as BaseModelV1 @@ -58,6 +58,9 @@ def get_structured_output_parser( Returns: Callable: The output parser function. """ + if isinstance(schema, dict): + return _dict_output_parser + if issubclass(schema, BaseModelV1): return _base_model_v1_output_parser diff --git a/tests/utils/output_parser_test.py b/tests/utils/output_parser_test.py index 0c8186f0..6ef1e59d 100644 --- a/tests/utils/output_parser_test.py +++ b/tests/utils/output_parser_test.py @@ -5,6 +5,7 @@ from scrapegraphai.utils.output_parser import ( TolerantJsonOutputParser, _strip_doubled_braces, + get_structured_output_parser, ) @@ -22,6 +23,19 @@ def test_strip_doubled_braces_ignores_unbalanced(): assert _strip_doubled_braces(text) == text +def test_structured_output_parser_accepts_json_schema(): + schema = { + "title": "Person", + "type": "object", + "properties": {"name": {"type": "string"}}, + } + output = {"name": "Ada"} + + parser = get_structured_output_parser(schema) + + assert parser(output) == output + + def test_tolerant_parser_parses_clean_json_unchanged(): parser = TolerantJsonOutputParser() assert parser.parse('{"content": "hi"}') == {"content": "hi"}