| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import json
- import logging
-
- import httpx
- from flask_restx import Resource, fields, reqparse
- from packaging import version
-
- from configs import dify_config
-
- from . import api, console_ns
-
- logger = logging.getLogger(__name__)
-
-
- @console_ns.route("/version")
- class VersionApi(Resource):
- @api.doc("check_version_update")
- @api.doc(description="Check for application version updates")
- @api.expect(
- api.parser().add_argument(
- "current_version", type=str, required=True, location="args", help="Current application version"
- )
- )
- @api.response(
- 200,
- "Success",
- api.model(
- "VersionResponse",
- {
- "version": fields.String(description="Latest version number"),
- "release_date": fields.String(description="Release date of latest version"),
- "release_notes": fields.String(description="Release notes for latest version"),
- "can_auto_update": fields.Boolean(description="Whether auto-update is supported"),
- "features": fields.Raw(description="Feature flags and capabilities"),
- },
- ),
- )
- def get(self):
- """Check for application version updates"""
- parser = reqparse.RequestParser()
- parser.add_argument("current_version", type=str, required=True, location="args")
- args = parser.parse_args()
- check_update_url = dify_config.CHECK_UPDATE_URL
-
- result = {
- "version": dify_config.project.version,
- "release_date": "",
- "release_notes": "",
- "can_auto_update": False,
- "features": {
- "can_replace_logo": dify_config.CAN_REPLACE_LOGO,
- "model_load_balancing_enabled": dify_config.MODEL_LB_ENABLED,
- },
- }
-
- if not check_update_url:
- return result
-
- try:
- response = httpx.get(
- check_update_url,
- params={"current_version": args["current_version"]},
- timeout=httpx.Timeout(connect=3, read=10),
- )
- except Exception as error:
- logger.warning("Check update version error: %s.", str(error))
- result["version"] = args["current_version"]
- return result
-
- content = json.loads(response.content)
- if _has_new_version(latest_version=content["version"], current_version=f"{args['current_version']}"):
- result["version"] = content["version"]
- result["release_date"] = content["releaseDate"]
- result["release_notes"] = content["releaseNotes"]
- result["can_auto_update"] = content["canAutoUpdate"]
- return result
-
-
- def _has_new_version(*, latest_version: str, current_version: str) -> bool:
- try:
- latest = version.parse(latest_version)
- current = version.parse(current_version)
-
- # Compare versions
- return latest > current
- except version.InvalidVersion:
- logger.warning("Invalid version format: latest=%s, current=%s", latest_version, current_version)
- return False
|