def merge_struct()

in src/models/struxgpt_v2.py [0:0]


    def merge_struct(title: str, struct_list: Union[List["StructItem"], List[dict]],
                     mode: Literal["concat", 'upgrade']):
        assert len(struct_list)
        if isinstance(struct_list[0], dict):
            struct_list = [StructItem(struct_dict=data_res) for data_res in struct_list]

        data_dict: Dict[str, Union[str, List[str]]] = {
            'scope': title,
            'aspects': [],
            'raw_query': [],
            'raw_response': None
        }
        sent_num_offset = 0
        for struct_res in struct_list:
            data_dict['raw_query'].extend(StruXGPT.remapping_sentence(struct_res.raw_query))

            sent_num = struct_res.aspects[-1].sent_range[1]
            if mode == 'concat':
                for aspect in struct_res.aspects:
                    data_dict['aspects'].append(
                        AspectItem.offset_sent_range(aspect.to_json(), sent_num_offset)
                    )
            elif mode == 'upgrade':
                super_aspect = {
                    'name': struct_res.scope,
                    'sent_range': [
                        sent_num_offset + 1, 
                        sent_num_offset + sent_num
                    ],
                    'subaspects': [
                        AspectItem.offset_sent_range(aspect.to_json(), sent_num_offset) \
                            for aspect in struct_res.aspects
                    ]
                }
                data_dict['aspects'].append(super_aspect)
            else:
                raise NotImplementedError(mode)
            
            sent_num_offset += sent_num
        
        data_dict['raw_query'] = StruXGPT.mapping_sentence(data_dict['raw_query'])

        return StructItem(struct_dict=data_dict)