Implemented version display in SiteHeader of webui
- Updated API version to 1.2.0 - Stored versions in localStorage
This commit is contained in:
@@ -1 +1 @@
|
|||||||
__api_version__ = "1.0.5"
|
__api_version__ = "1.2.0"
|
||||||
|
@@ -23,9 +23,9 @@ from lightrag.api.utils_api import (
|
|||||||
get_default_host,
|
get_default_host,
|
||||||
display_splash_screen,
|
display_splash_screen,
|
||||||
)
|
)
|
||||||
from lightrag import LightRAG
|
from lightrag import LightRAG, __version__ as core_version
|
||||||
from lightrag.types import GPTKeywordExtractionFormat
|
|
||||||
from lightrag.api import __api_version__
|
from lightrag.api import __api_version__
|
||||||
|
from lightrag.types import GPTKeywordExtractionFormat
|
||||||
from lightrag.utils import EmbeddingFunc
|
from lightrag.utils import EmbeddingFunc
|
||||||
from lightrag.api.routers.document_routes import (
|
from lightrag.api.routers.document_routes import (
|
||||||
DocumentManager,
|
DocumentManager,
|
||||||
@@ -364,9 +364,16 @@ def create_app(args):
|
|||||||
"token_type": "bearer",
|
"token_type": "bearer",
|
||||||
"auth_mode": "disabled",
|
"auth_mode": "disabled",
|
||||||
"message": "Authentication is disabled. Using guest access.",
|
"message": "Authentication is disabled. Using guest access.",
|
||||||
|
"core_version": core_version,
|
||||||
|
"api_version": __api_version__,
|
||||||
}
|
}
|
||||||
|
|
||||||
return {"auth_configured": True, "auth_mode": "enabled"}
|
return {
|
||||||
|
"auth_configured": True,
|
||||||
|
"auth_mode": "enabled",
|
||||||
|
"core_version": core_version,
|
||||||
|
"api_version": __api_version__,
|
||||||
|
}
|
||||||
|
|
||||||
@app.post("/login", dependencies=[Depends(optional_api_key)])
|
@app.post("/login", dependencies=[Depends(optional_api_key)])
|
||||||
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
|
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
|
||||||
@@ -383,6 +390,8 @@ def create_app(args):
|
|||||||
"token_type": "bearer",
|
"token_type": "bearer",
|
||||||
"auth_mode": "disabled",
|
"auth_mode": "disabled",
|
||||||
"message": "Authentication is disabled. Using guest access.",
|
"message": "Authentication is disabled. Using guest access.",
|
||||||
|
"core_version": core_version,
|
||||||
|
"api_version": __api_version__,
|
||||||
}
|
}
|
||||||
|
|
||||||
if form_data.username != username or form_data.password != password:
|
if form_data.username != username or form_data.password != password:
|
||||||
@@ -398,6 +407,8 @@ def create_app(args):
|
|||||||
"access_token": user_token,
|
"access_token": user_token,
|
||||||
"token_type": "bearer",
|
"token_type": "bearer",
|
||||||
"auth_mode": "enabled",
|
"auth_mode": "enabled",
|
||||||
|
"core_version": core_version,
|
||||||
|
"api_version": __api_version__,
|
||||||
}
|
}
|
||||||
|
|
||||||
@app.get("/health", dependencies=[Depends(optional_api_key)])
|
@app.get("/health", dependencies=[Depends(optional_api_key)])
|
||||||
|
@@ -132,6 +132,8 @@ export type AuthStatusResponse = {
|
|||||||
token_type?: string
|
token_type?: string
|
||||||
auth_mode?: 'enabled' | 'disabled'
|
auth_mode?: 'enabled' | 'disabled'
|
||||||
message?: string
|
message?: string
|
||||||
|
core_version?: string
|
||||||
|
api_version?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type LoginResponse = {
|
export type LoginResponse = {
|
||||||
@@ -139,6 +141,8 @@ export type LoginResponse = {
|
|||||||
token_type: string
|
token_type: string
|
||||||
auth_mode?: 'enabled' | 'disabled' // Authentication mode identifier
|
auth_mode?: 'enabled' | 'disabled' // Authentication mode identifier
|
||||||
message?: string // Optional message
|
message?: string // Optional message
|
||||||
|
core_version?: string
|
||||||
|
api_version?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const InvalidApiKeyError = 'Invalid API Key'
|
export const InvalidApiKeyError = 'Invalid API Key'
|
||||||
|
@@ -43,7 +43,7 @@ const LoginPage = () => {
|
|||||||
|
|
||||||
if (!status.auth_configured && status.access_token) {
|
if (!status.auth_configured && status.access_token) {
|
||||||
// If auth is not configured, use the guest token and redirect
|
// If auth is not configured, use the guest token and redirect
|
||||||
login(status.access_token, true)
|
login(status.access_token, true, status.core_version, status.api_version)
|
||||||
if (status.message) {
|
if (status.message) {
|
||||||
toast.info(status.message)
|
toast.info(status.message)
|
||||||
}
|
}
|
||||||
@@ -87,7 +87,7 @@ const LoginPage = () => {
|
|||||||
|
|
||||||
// Check authentication mode
|
// Check authentication mode
|
||||||
const isGuestMode = response.auth_mode === 'disabled'
|
const isGuestMode = response.auth_mode === 'disabled'
|
||||||
login(response.access_token, isGuestMode)
|
login(response.access_token, isGuestMode, response.core_version, response.api_version)
|
||||||
|
|
||||||
if (isGuestMode) {
|
if (isGuestMode) {
|
||||||
// Show authentication disabled notification
|
// Show authentication disabled notification
|
||||||
|
@@ -55,7 +55,11 @@ function TabsNavigation() {
|
|||||||
|
|
||||||
export default function SiteHeader() {
|
export default function SiteHeader() {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { isGuestMode } = useAuthStore()
|
const { isGuestMode, coreVersion, apiVersion } = useAuthStore()
|
||||||
|
|
||||||
|
const versionDisplay = (coreVersion && apiVersion)
|
||||||
|
? `${coreVersion}/${apiVersion}`
|
||||||
|
: null;
|
||||||
|
|
||||||
const handleLogout = () => {
|
const handleLogout = () => {
|
||||||
navigationService.navigateToLogin();
|
navigationService.navigateToLogin();
|
||||||
@@ -67,6 +71,11 @@ export default function SiteHeader() {
|
|||||||
<ZapIcon className="size-4 text-emerald-400" aria-hidden="true" />
|
<ZapIcon className="size-4 text-emerald-400" aria-hidden="true" />
|
||||||
{/* <img src='/logo.png' className="size-4" /> */}
|
{/* <img src='/logo.png' className="size-4" /> */}
|
||||||
<span className="font-bold md:inline-block">{SiteInfo.name}</span>
|
<span className="font-bold md:inline-block">{SiteInfo.name}</span>
|
||||||
|
{versionDisplay && (
|
||||||
|
<span className="ml-2 text-xs text-gray-500 dark:text-gray-400">
|
||||||
|
v{versionDisplay}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div className="flex h-10 flex-1 justify-center">
|
<div className="flex h-10 flex-1 justify-center">
|
||||||
|
@@ -19,7 +19,9 @@ interface BackendState {
|
|||||||
interface AuthState {
|
interface AuthState {
|
||||||
isAuthenticated: boolean;
|
isAuthenticated: boolean;
|
||||||
isGuestMode: boolean; // Add guest mode flag
|
isGuestMode: boolean; // Add guest mode flag
|
||||||
login: (token: string, isGuest?: boolean) => void;
|
coreVersion: string | null;
|
||||||
|
apiVersion: string | null;
|
||||||
|
login: (token: string, isGuest?: boolean, coreVersion?: string | null, apiVersion?: string | null) => void;
|
||||||
logout: () => void;
|
logout: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,15 +86,22 @@ const isGuestToken = (token: string): boolean => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Initialize auth state from localStorage
|
// Initialize auth state from localStorage
|
||||||
const initAuthState = (): { isAuthenticated: boolean; isGuestMode: boolean } => {
|
const initAuthState = (): { isAuthenticated: boolean; isGuestMode: boolean; coreVersion: string | null; apiVersion: string | null } => {
|
||||||
const token = localStorage.getItem('LIGHTRAG-API-TOKEN');
|
const token = localStorage.getItem('LIGHTRAG-API-TOKEN');
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return { isAuthenticated: false, isGuestMode: false };
|
return {
|
||||||
|
isAuthenticated: false,
|
||||||
|
isGuestMode: false,
|
||||||
|
coreVersion: null,
|
||||||
|
apiVersion: null
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
isAuthenticated: true,
|
isAuthenticated: true,
|
||||||
isGuestMode: isGuestToken(token)
|
isGuestMode: isGuestToken(token),
|
||||||
|
coreVersion: localStorage.getItem('LIGHTRAG-CORE-VERSION'),
|
||||||
|
apiVersion: localStorage.getItem('LIGHTRAG-API-VERSION')
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -103,20 +112,36 @@ export const useAuthStore = create<AuthState>(set => {
|
|||||||
return {
|
return {
|
||||||
isAuthenticated: initialState.isAuthenticated,
|
isAuthenticated: initialState.isAuthenticated,
|
||||||
isGuestMode: initialState.isGuestMode,
|
isGuestMode: initialState.isGuestMode,
|
||||||
|
coreVersion: initialState.coreVersion,
|
||||||
|
apiVersion: initialState.apiVersion,
|
||||||
|
|
||||||
login: (token, isGuest = false) => {
|
login: (token, isGuest = false, coreVersion = null, apiVersion = null) => {
|
||||||
localStorage.setItem('LIGHTRAG-API-TOKEN', token);
|
localStorage.setItem('LIGHTRAG-API-TOKEN', token);
|
||||||
|
|
||||||
|
// 存储版本信息到 localStorage
|
||||||
|
if (coreVersion) {
|
||||||
|
localStorage.setItem('LIGHTRAG-CORE-VERSION', coreVersion);
|
||||||
|
}
|
||||||
|
if (apiVersion) {
|
||||||
|
localStorage.setItem('LIGHTRAG-API-VERSION', apiVersion);
|
||||||
|
}
|
||||||
|
|
||||||
set({
|
set({
|
||||||
isAuthenticated: true,
|
isAuthenticated: true,
|
||||||
isGuestMode: isGuest
|
isGuestMode: isGuest,
|
||||||
|
coreVersion,
|
||||||
|
apiVersion
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
logout: () => {
|
logout: () => {
|
||||||
localStorage.removeItem('LIGHTRAG-API-TOKEN');
|
localStorage.removeItem('LIGHTRAG-API-TOKEN');
|
||||||
|
|
||||||
set({
|
set({
|
||||||
isAuthenticated: false,
|
isAuthenticated: false,
|
||||||
isGuestMode: false
|
isGuestMode: false,
|
||||||
|
coreVersion: null,
|
||||||
|
apiVersion: null
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user