| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | from collections.abc import Mappingfrom typing import Anyfrom configs import dify_configfrom core.file import Filefrom core.variables import (    ArrayAnySegment,    ArrayFileSegment,    ArrayNumberSegment,    ArrayNumberVariable,    ArrayObjectSegment,    ArrayObjectVariable,    ArrayStringSegment,    ArrayStringVariable,    FileSegment,    FloatSegment,    FloatVariable,    IntegerSegment,    IntegerVariable,    NoneSegment,    ObjectSegment,    ObjectVariable,    SecretVariable,    Segment,    SegmentType,    StringSegment,    StringVariable,    Variable,)from core.variables.exc import VariableErrordef build_variable_from_mapping(mapping: Mapping[str, Any], /) -> Variable:    if (value_type := mapping.get("value_type")) is None:        raise VariableError("missing value type")    if not mapping.get("name"):        raise VariableError("missing name")    if (value := mapping.get("value")) is None:        raise VariableError("missing value")    match value_type:        case SegmentType.STRING:            result = StringVariable.model_validate(mapping)        case SegmentType.SECRET:            result = SecretVariable.model_validate(mapping)        case SegmentType.NUMBER if isinstance(value, int):            result = IntegerVariable.model_validate(mapping)        case SegmentType.NUMBER if isinstance(value, float):            result = FloatVariable.model_validate(mapping)        case SegmentType.NUMBER if not isinstance(value, float | int):            raise VariableError(f"invalid number value {value}")        case SegmentType.OBJECT if isinstance(value, dict):            result = ObjectVariable.model_validate(mapping)        case SegmentType.ARRAY_STRING if isinstance(value, list):            result = ArrayStringVariable.model_validate(mapping)        case SegmentType.ARRAY_NUMBER if isinstance(value, list):            result = ArrayNumberVariable.model_validate(mapping)        case SegmentType.ARRAY_OBJECT if isinstance(value, list):            result = ArrayObjectVariable.model_validate(mapping)        case _:            raise VariableError(f"not supported value type {value_type}")    if result.size > dify_config.MAX_VARIABLE_SIZE:        raise VariableError(f"variable size {result.size} exceeds limit {dify_config.MAX_VARIABLE_SIZE}")    return resultdef build_segment(value: Any, /) -> Segment:    if value is None:        return NoneSegment()    if isinstance(value, str):        return StringSegment(value=value)    if isinstance(value, int):        return IntegerSegment(value=value)    if isinstance(value, float):        return FloatSegment(value=value)    if isinstance(value, dict):        return ObjectSegment(value=value)    if isinstance(value, File):        return FileSegment(value=value)    if isinstance(value, list):        items = [build_segment(item) for item in value]        types = {item.value_type for item in items}        if len(types) != 1:            return ArrayAnySegment(value=value)        match types.pop():            case SegmentType.STRING:                return ArrayStringSegment(value=value)            case SegmentType.NUMBER:                return ArrayNumberSegment(value=value)            case SegmentType.OBJECT:                return ArrayObjectSegment(value=value)            case SegmentType.FILE:                return ArrayFileSegment(value=value)            case _:                raise ValueError(f"not supported value {value}")    raise ValueError(f"not supported value {value}")
 |