File size: 1,630 Bytes
7f4c5ab
 
 
 
 
 
7f117eb
 
 
7f4c5ab
 
 
 
 
 
 
 
7f117eb
 
 
7f4c5ab
 
 
7f117eb
7f4c5ab
 
 
 
 
7f117eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import re
import json
import ast

def extract_json(text: str) -> dict:
    try:
        if isinstance(text, dict) or isinstance(text, list):
            return text

        filtered_text = ""
        filtered_text = re.sub(r'^.*?({|\[)', r'\1', text, flags=re.DOTALL)
        filtered_text  =  re.sub(r'(}|\])(?!.*(\]|\})).*$', r'\1', filtered_text, flags=re.DOTALL)

        try:
            parsed = json.loads(filtered_text, strict=False)
        except json.JSONDecodeError:
            try:
                clean_text = re.sub(r"\\'", "'", filtered_text) 
                clean_text = re.sub(r"\\,", ",", clean_text)
                parsed = ast.literal_eval(clean_text)
            except:
                converted_text = re.sub(r"'([^']*)'", r'"\1"', filtered_text)
                parsed = json.loads(converted_text, strict=False)
        
        return parsed
    
    except Exception as e:
        return {}


def _coerce_to_list(llm_output:str):
    if isinstance(llm_output, list):
        return llm_output

    try:
        result = extract_json(llm_output)
        if result == {} and not (isinstance(llm_output, str) and ('[' in llm_output and ']' in llm_output)):
            raise ValueError("Cannot convert the LLM output to a list value.")
        if not isinstance(result, list):
            raise ValueError(f"Cannot convert the LLM output to a list value. Got {type(result)}")
        return result
    except Exception as e:
        raise ValueError(f"Cannot convert the LLM output to a list value. Underlying error: {e}")

print("Test 1:", _coerce_to_list("""```json
[
    {"key": "value"}
]
```"""))