|  | @@ -3,6 +3,7 @@ import logging
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import requests
 | 
	
		
			
				|  |  |  from flask_restful import Resource, reqparse
 | 
	
		
			
				|  |  | +from packaging import version
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from configs import dify_config
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -47,43 +48,15 @@ class VersionApi(Resource):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def _has_new_version(*, latest_version: str, current_version: str) -> bool:
 | 
	
		
			
				|  |  | -    def parse_version(version: str) -> tuple:
 | 
	
		
			
				|  |  | -        # Split version into parts and pre-release suffix if any
 | 
	
		
			
				|  |  | -        parts = version.split("-")
 | 
	
		
			
				|  |  | -        version_parts = parts[0].split(".")
 | 
	
		
			
				|  |  | -        pre_release = parts[1] if len(parts) > 1 else None
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        # Validate version format
 | 
	
		
			
				|  |  | -        if len(version_parts) != 3:
 | 
	
		
			
				|  |  | -            raise ValueError(f"Invalid version format: {version}")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            # Convert version parts to integers
 | 
	
		
			
				|  |  | -            major, minor, patch = map(int, version_parts)
 | 
	
		
			
				|  |  | -            return (major, minor, patch, pre_release)
 | 
	
		
			
				|  |  | -        except ValueError:
 | 
	
		
			
				|  |  | -            raise ValueError(f"Invalid version format: {version}")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    latest = parse_version(latest_version)
 | 
	
		
			
				|  |  | -    current = parse_version(current_version)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # Compare major, minor, and patch versions
 | 
	
		
			
				|  |  | -    for latest_part, current_part in zip(latest[:3], current[:3]):
 | 
	
		
			
				|  |  | -        if latest_part > current_part:
 | 
	
		
			
				|  |  | -            return True
 | 
	
		
			
				|  |  | -        elif latest_part < current_part:
 | 
	
		
			
				|  |  | -            return False
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # If versions are equal, check pre-release suffixes
 | 
	
		
			
				|  |  | -    if latest[3] is None and current[3] is not None:
 | 
	
		
			
				|  |  | -        return True
 | 
	
		
			
				|  |  | -    elif latest[3] is not None and current[3] is None:
 | 
	
		
			
				|  |  | +    try:
 | 
	
		
			
				|  |  | +        latest = version.parse(latest_version)
 | 
	
		
			
				|  |  | +        current = version.parse(current_version)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        # Compare versions
 | 
	
		
			
				|  |  | +        return latest > current
 | 
	
		
			
				|  |  | +    except version.InvalidVersion:
 | 
	
		
			
				|  |  | +        logging.warning(f"Invalid version format: latest={latest_version}, current={current_version}")
 | 
	
		
			
				|  |  |          return False
 | 
	
		
			
				|  |  | -    elif latest[3] is not None and current[3] is not None:
 | 
	
		
			
				|  |  | -        # Simple string comparison for pre-release versions
 | 
	
		
			
				|  |  | -        return latest[3] > current[3]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return False
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  api.add_resource(VersionApi, "/version")
 |