factory.py 3.2 KB

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