version.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import json
  2. import logging
  3. import requests
  4. from flask_restful import Resource, reqparse
  5. from configs import dify_config
  6. from . import api
  7. class VersionApi(Resource):
  8. def get(self):
  9. parser = reqparse.RequestParser()
  10. parser.add_argument("current_version", type=str, required=True, location="args")
  11. args = parser.parse_args()
  12. check_update_url = dify_config.CHECK_UPDATE_URL
  13. result = {
  14. "version": dify_config.CURRENT_VERSION,
  15. "release_date": "",
  16. "release_notes": "",
  17. "can_auto_update": False,
  18. "features": {
  19. "can_replace_logo": dify_config.CAN_REPLACE_LOGO,
  20. "model_load_balancing_enabled": dify_config.MODEL_LB_ENABLED,
  21. },
  22. }
  23. if not check_update_url:
  24. return result
  25. try:
  26. response = requests.get(check_update_url, {"current_version": args.get("current_version")})
  27. except Exception as error:
  28. logging.warning("Check update version error: {}.".format(str(error)))
  29. result["version"] = args.get("current_version")
  30. return result
  31. content = json.loads(response.content)
  32. if _has_new_version(latest_version=content["version"], current_version=f"{args.get('current_version')}"):
  33. result["version"] = content["version"]
  34. result["release_date"] = content["releaseDate"]
  35. result["release_notes"] = content["releaseNotes"]
  36. result["can_auto_update"] = content["canAutoUpdate"]
  37. return result
  38. def _has_new_version(*, latest_version: str, current_version: str) -> bool:
  39. def parse_version(version: str) -> tuple:
  40. # Split version into parts and pre-release suffix if any
  41. parts = version.split("-")
  42. version_parts = parts[0].split(".")
  43. pre_release = parts[1] if len(parts) > 1 else None
  44. # Validate version format
  45. if len(version_parts) != 3:
  46. raise ValueError(f"Invalid version format: {version}")
  47. try:
  48. # Convert version parts to integers
  49. major, minor, patch = map(int, version_parts)
  50. return (major, minor, patch, pre_release)
  51. except ValueError:
  52. raise ValueError(f"Invalid version format: {version}")
  53. latest = parse_version(latest_version)
  54. current = parse_version(current_version)
  55. # Compare major, minor, and patch versions
  56. for latest_part, current_part in zip(latest[:3], current[:3]):
  57. if latest_part > current_part:
  58. return True
  59. elif latest_part < current_part:
  60. return False
  61. # If versions are equal, check pre-release suffixes
  62. if latest[3] is None and current[3] is not None:
  63. return True
  64. elif latest[3] is not None and current[3] is None:
  65. return False
  66. elif latest[3] is not None and current[3] is not None:
  67. # Simple string comparison for pre-release versions
  68. return latest[3] > current[3]
  69. return False
  70. api.add_resource(VersionApi, "/version")