|
1 | 1 | import base64 |
2 | 2 | import random |
3 | 3 | from io import BytesIO |
| 4 | +from collections import OrderedDict |
4 | 5 | from typing import Optional, List, Set, Union, Tuple |
5 | 6 |
|
6 | 7 | import cv2 |
7 | 8 | import numpy as np |
8 | 9 | from PIL import Image |
9 | 10 | from loguru import logger |
10 | | -from pydantic import BaseModel, Field, model_validator, field_validator, model_serializer |
| 11 | +from pydantic import BaseModel, Field, model_serializer, model_validator, field_validator |
11 | 12 |
|
12 | 13 | from novelai_python.sdk.ai._enum import Sampler, UCPresetTypeAlias, NoiseSchedule, ImageBytesTypeAlias, ControlNetModel, \ |
13 | 14 | Model |
@@ -128,11 +129,22 @@ def _serialize(self, handler): |
128 | 129 | Custom serializer to force include specific fields even when they are None |
129 | 130 | """ |
130 | 131 | data = handler(self) |
131 | | - # Just add None values for strong fields |
132 | | - for field in self.__strong_values__: |
133 | | - if field not in data: |
134 | | - data[field] = getattr(self, field, None) |
135 | | - return data |
| 132 | + |
| 133 | + # Force include strong fields and ensure proper ordering |
| 134 | + # Create ordered dict following JavaScript field order |
| 135 | + ordered_fields = list(self.__class__.model_fields.keys()) |
| 136 | + ordered_data = OrderedDict() |
| 137 | + |
| 138 | + for field_name in ordered_fields: |
| 139 | + if field_name in data: |
| 140 | + # Field exists in data, include it |
| 141 | + ordered_data[field_name] = data[field_name] |
| 142 | + elif field_name in self.__strong_values__: |
| 143 | + # Since we iterate from `self.__class__.model_fields`,、 |
| 144 | + # the field is guaranteed to exist. The previous safety check was redundant. |
| 145 | + ordered_data[field_name] = getattr(self, field_name, None) |
| 146 | + |
| 147 | + return ordered_data |
136 | 148 | # endregion |
137 | 149 |
|
138 | 150 | @model_validator(mode="after") |
|
0 commit comments