1- import json
21import logging
32
43import httpx
5- from flask import request
6- from flask_restx import Resource , fields
74from packaging import version
85from pydantic import BaseModel , Field
96
107from configs import dify_config
11-
12- from . import console_ns
8+ from controllers .fastopenapi import console_router
139
1410logger = logging .getLogger (__name__ )
1511
@@ -18,68 +14,60 @@ class VersionQuery(BaseModel):
1814 current_version : str = Field (..., description = "Current application version" )
1915
2016
21- console_ns . schema_model (
22- VersionQuery . __name__ ,
23- VersionQuery . model_json_schema ( ref_template = "#/definitions/{ model}" ),
24- )
17+ class VersionFeatures ( BaseModel ):
18+ can_replace_logo : bool = Field ( description = "Whether logo replacement is supported" )
19+ model_load_balancing_enabled : bool = Field ( description = "Whether model load balancing is enabled" )
20+
2521
22+ class VersionResponse (BaseModel ):
23+ version : str = Field (description = "Latest version number" )
24+ release_date : str = Field (description = "Release date of latest version" )
25+ release_notes : str = Field (description = "Release notes for latest version" )
26+ can_auto_update : bool = Field (description = "Whether auto-update is supported" )
27+ features : VersionFeatures = Field (description = "Feature flags and capabilities" )
2628
27- @console_ns .route ("/version" )
28- class VersionApi (Resource ):
29- @console_ns .doc ("check_version_update" )
30- @console_ns .doc (description = "Check for application version updates" )
31- @console_ns .expect (console_ns .models [VersionQuery .__name__ ])
32- @console_ns .response (
33- 200 ,
34- "Success" ,
35- console_ns .model (
36- "VersionResponse" ,
37- {
38- "version" : fields .String (description = "Latest version number" ),
39- "release_date" : fields .String (description = "Release date of latest version" ),
40- "release_notes" : fields .String (description = "Release notes for latest version" ),
41- "can_auto_update" : fields .Boolean (description = "Whether auto-update is supported" ),
42- "features" : fields .Raw (description = "Feature flags and capabilities" ),
43- },
29+
30+ @console_router .get (
31+ "/version" ,
32+ response_model = VersionResponse ,
33+ tags = ["console" ],
34+ )
35+ def check_version_update (query : VersionQuery ) -> VersionResponse :
36+ """Check for application version updates."""
37+ check_update_url = dify_config .CHECK_UPDATE_URL
38+
39+ result = VersionResponse (
40+ version = dify_config .project .version ,
41+ release_date = "" ,
42+ release_notes = "" ,
43+ can_auto_update = False ,
44+ features = VersionFeatures (
45+ can_replace_logo = dify_config .CAN_REPLACE_LOGO ,
46+ model_load_balancing_enabled = dify_config .MODEL_LB_ENABLED ,
4447 ),
4548 )
46- def get (self ):
47- """Check for application version updates"""
48- args = VersionQuery .model_validate (request .args .to_dict (flat = True )) # type: ignore
49- check_update_url = dify_config .CHECK_UPDATE_URL
50-
51- result = {
52- "version" : dify_config .project .version ,
53- "release_date" : "" ,
54- "release_notes" : "" ,
55- "can_auto_update" : False ,
56- "features" : {
57- "can_replace_logo" : dify_config .CAN_REPLACE_LOGO ,
58- "model_load_balancing_enabled" : dify_config .MODEL_LB_ENABLED ,
59- },
60- }
61-
62- if not check_update_url :
63- return result
64-
65- try :
66- response = httpx .get (
67- check_update_url ,
68- params = {"current_version" : args .current_version },
69- timeout = httpx .Timeout (timeout = 10.0 , connect = 3.0 ),
70- )
71- except Exception as error :
72- logger .warning ("Check update version error: %s." , str (error ))
73- result ["version" ] = args .current_version
74- return result
75-
76- content = json .loads (response .content )
77- if _has_new_version (latest_version = content ["version" ], current_version = f"{ args .current_version } " ):
78- result ["version" ] = content ["version" ]
79- result ["release_date" ] = content ["releaseDate" ]
80- result ["release_notes" ] = content ["releaseNotes" ]
81- result ["can_auto_update" ] = content ["canAutoUpdate" ]
49+
50+ if not check_update_url :
51+ return result
52+
53+ try :
54+ response = httpx .get (
55+ check_update_url ,
56+ params = {"current_version" : query .current_version },
57+ timeout = httpx .Timeout (timeout = 10.0 , connect = 3.0 ),
58+ )
59+ content = response .json ()
60+ except Exception as error :
61+ logger .warning ("Check update version error: %s." , str (error ))
62+ result .version = query .current_version
8263 return result
64+ latest_version = content .get ("version" , result .version )
65+ if _has_new_version (latest_version = latest_version , current_version = f"{ query .current_version } " ):
66+ result .version = latest_version
67+ result .release_date = content .get ("releaseDate" , "" )
68+ result .release_notes = content .get ("releaseNotes" , "" )
69+ result .can_auto_update = content .get ("canAutoUpdate" , False )
70+ return result
8371
8472
8573def _has_new_version (* , latest_version : str , current_version : str ) -> bool :
0 commit comments