factory.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from collections.abc import Mapping
  2. from typing import Any
  3. from configs import dify_config
  4. from .exc import VariableError
  5. from .segments import (
  6. ArrayAnySegment,
  7. FloatSegment,
  8. IntegerSegment,
  9. NoneSegment,
  10. ObjectSegment,
  11. Segment,
  12. StringSegment,
  13. )
  14. from .types import SegmentType
  15. from .variables import (
  16. ArrayNumberVariable,
  17. ArrayObjectVariable,
  18. ArrayStringVariable,
  19. FloatVariable,
  20. IntegerVariable,
  21. ObjectVariable,
  22. SecretVariable,
  23. StringVariable,
  24. Variable,
  25. )
  26. def build_variable_from_mapping(mapping: Mapping[str, Any], /) -> Variable:
  27. if (value_type := mapping.get('value_type')) is None:
  28. raise VariableError('missing value type')
  29. if not mapping.get('name'):
  30. raise VariableError('missing name')
  31. if (value := mapping.get('value')) is None:
  32. raise VariableError('missing value')
  33. match value_type:
  34. case SegmentType.STRING:
  35. result = StringVariable.model_validate(mapping)
  36. case SegmentType.SECRET:
  37. result = SecretVariable.model_validate(mapping)
  38. case SegmentType.NUMBER if isinstance(value, int):
  39. result = IntegerVariable.model_validate(mapping)
  40. case SegmentType.NUMBER if isinstance(value, float):
  41. result = FloatVariable.model_validate(mapping)
  42. case SegmentType.NUMBER if not isinstance(value, float | int):
  43. raise VariableError(f'invalid number value {value}')
  44. case SegmentType.OBJECT if isinstance(value, dict):
  45. result = ObjectVariable.model_validate(mapping)
  46. case SegmentType.ARRAY_STRING if isinstance(value, list):
  47. result = ArrayStringVariable.model_validate(mapping)
  48. case SegmentType.ARRAY_NUMBER if isinstance(value, list):
  49. result = ArrayNumberVariable.model_validate(mapping)
  50. case SegmentType.ARRAY_OBJECT if isinstance(value, list):
  51. result = ArrayObjectVariable.model_validate(mapping)
  52. case _:
  53. raise VariableError(f'not supported value type {value_type}')
  54. if result.size > dify_config.MAX_VARIABLE_SIZE:
  55. raise VariableError(f'variable size {result.size} exceeds limit {dify_config.MAX_VARIABLE_SIZE}')
  56. return result
  57. def build_segment(value: Any, /) -> Segment:
  58. if value is None:
  59. return NoneSegment()
  60. if isinstance(value, str):
  61. return StringSegment(value=value)
  62. if isinstance(value, int):
  63. return IntegerSegment(value=value)
  64. if isinstance(value, float):
  65. return FloatSegment(value=value)
  66. if isinstance(value, dict):
  67. return ObjectSegment(value=value)
  68. if isinstance(value, list):
  69. return ArrayAnySegment(value=value)
  70. raise ValueError(f'not supported value {value}')