您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

version.py 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import json
  2. import logging
  3. import httpx
  4. from flask_restx import Resource, fields, reqparse
  5. from packaging import version
  6. from configs import dify_config
  7. from . import api, console_ns
  8. logger = logging.getLogger(__name__)
  9. @console_ns.route("/version")
  10. class VersionApi(Resource):
  11. @api.doc("check_version_update")
  12. @api.doc(description="Check for application version updates")
  13. @api.expect(
  14. api.parser().add_argument(
  15. "current_version", type=str, required=True, location="args", help="Current application version"
  16. )
  17. )
  18. @api.response(
  19. 200,
  20. "Success",
  21. api.model(
  22. "VersionResponse",
  23. {
  24. "version": fields.String(description="Latest version number"),
  25. "release_date": fields.String(description="Release date of latest version"),
  26. "release_notes": fields.String(description="Release notes for latest version"),
  27. "can_auto_update": fields.Boolean(description="Whether auto-update is supported"),
  28. "features": fields.Raw(description="Feature flags and capabilities"),
  29. },
  30. ),
  31. )
  32. def get(self):
  33. """Check for application version updates"""
  34. parser = reqparse.RequestParser()
  35. parser.add_argument("current_version", type=str, required=True, location="args")
  36. args = parser.parse_args()
  37. check_update_url = dify_config.CHECK_UPDATE_URL
  38. result = {
  39. "version": dify_config.project.version,
  40. "release_date": "",
  41. "release_notes": "",
  42. "can_auto_update": False,
  43. "features": {
  44. "can_replace_logo": dify_config.CAN_REPLACE_LOGO,
  45. "model_load_balancing_enabled": dify_config.MODEL_LB_ENABLED,
  46. },
  47. }
  48. if not check_update_url:
  49. return result
  50. try:
  51. response = httpx.get(
  52. check_update_url,
  53. params={"current_version": args["current_version"]},
  54. timeout=httpx.Timeout(connect=3, read=10),
  55. )
  56. except Exception as error:
  57. logger.warning("Check update version error: %s.", str(error))
  58. result["version"] = args["current_version"]
  59. return result
  60. content = json.loads(response.content)
  61. if _has_new_version(latest_version=content["version"], current_version=f"{args['current_version']}"):
  62. result["version"] = content["version"]
  63. result["release_date"] = content["releaseDate"]
  64. result["release_notes"] = content["releaseNotes"]
  65. result["can_auto_update"] = content["canAutoUpdate"]
  66. return result
  67. def _has_new_version(*, latest_version: str, current_version: str) -> bool:
  68. try:
  69. latest = version.parse(latest_version)
  70. current = version.parse(current_version)
  71. # Compare versions
  72. return latest > current
  73. except version.InvalidVersion:
  74. logger.warning("Invalid version format: latest=%s, current=%s", latest_version, current_version)
  75. return False