| 
														 | 
														 | 
														 | 
														 | 
														 | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														import requests | 
														 | 
														 | 
														import requests | 
													
													
												
													
														 | 
														 | 
														from flask_restful import Resource, reqparse | 
														 | 
														 | 
														from flask_restful import Resource, reqparse | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														from packaging import version | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														from configs import dify_config | 
														 | 
														 | 
														from configs import dify_config | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
											
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														 | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														def _has_new_version(*, latest_version: str, current_version: str) -> bool: | 
														 | 
														 | 
														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 | 
														 | 
														 | 
														        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") | 
														 | 
														 | 
														api.add_resource(VersionApi, "/version") |