mirror of
https://github.com/lordmathis/llamactl.git
synced 2025-11-06 09:04:27 +00:00
Merge pull request #18 from lordmathis/feat/show-version
feat: Show app version on backend and frontend
This commit is contained in:
2
.github/workflows/release.yaml
vendored
2
.github/workflows/release.yaml
vendored
@@ -29,6 +29,8 @@ jobs:
|
|||||||
npm ci
|
npm ci
|
||||||
|
|
||||||
- name: Build Web UI
|
- name: Build Web UI
|
||||||
|
env:
|
||||||
|
VITE_APP_VERSION: ${{ github.ref_name }}
|
||||||
run: |
|
run: |
|
||||||
cd webui
|
cd webui
|
||||||
npm run build
|
npm run build
|
||||||
|
|||||||
@@ -11,6 +11,11 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// version is set at build time using -ldflags "-X main.version=1.0.0"
|
||||||
|
var version string = "unknown"
|
||||||
|
var commitHash string = "unknown"
|
||||||
|
var buildTime string = "unknown"
|
||||||
|
|
||||||
// @title llamactl API
|
// @title llamactl API
|
||||||
// @version 1.0
|
// @version 1.0
|
||||||
// @description llamactl is a control server for managing Llama Server instances.
|
// @description llamactl is a control server for managing Llama Server instances.
|
||||||
@@ -19,6 +24,14 @@ import (
|
|||||||
// @basePath /api/v1
|
// @basePath /api/v1
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
|
// --version flag to print the version
|
||||||
|
if len(os.Args) > 1 && os.Args[1] == "--version" {
|
||||||
|
fmt.Printf("llamactl version: %s\n", version)
|
||||||
|
fmt.Printf("Commit hash: %s\n", commitHash)
|
||||||
|
fmt.Printf("Build time: %s\n", buildTime)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
configPath := os.Getenv("LLAMACTL_CONFIG_PATH")
|
configPath := os.Getenv("LLAMACTL_CONFIG_PATH")
|
||||||
cfg, err := config.LoadConfig(configPath)
|
cfg, err := config.LoadConfig(configPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -26,6 +39,11 @@ func main() {
|
|||||||
fmt.Println("Using default configuration.")
|
fmt.Println("Using default configuration.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set version information
|
||||||
|
cfg.Version = version
|
||||||
|
cfg.CommitHash = commitHash
|
||||||
|
cfg.BuildTime = buildTime
|
||||||
|
|
||||||
// Create the data directory if it doesn't exist
|
// Create the data directory if it doesn't exist
|
||||||
if cfg.Instances.AutoCreateDirs {
|
if cfg.Instances.AutoCreateDirs {
|
||||||
if err := os.MkdirAll(cfg.Instances.InstancesDir, 0755); err != nil {
|
if err := os.MkdirAll(cfg.Instances.InstancesDir, 0755); err != nil {
|
||||||
|
|||||||
@@ -12,9 +12,12 @@ import (
|
|||||||
|
|
||||||
// AppConfig represents the configuration for llamactl
|
// AppConfig represents the configuration for llamactl
|
||||||
type AppConfig struct {
|
type AppConfig struct {
|
||||||
Server ServerConfig `yaml:"server"`
|
Server ServerConfig `yaml:"server"`
|
||||||
Instances InstancesConfig `yaml:"instances"`
|
Instances InstancesConfig `yaml:"instances"`
|
||||||
Auth AuthConfig `yaml:"auth"`
|
Auth AuthConfig `yaml:"auth"`
|
||||||
|
Version string `yaml:"-"`
|
||||||
|
CommitHash string `yaml:"-"`
|
||||||
|
BuildTime string `yaml:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServerConfig contains HTTP server configuration
|
// ServerConfig contains HTTP server configuration
|
||||||
|
|||||||
@@ -28,7 +28,23 @@ func NewHandler(im manager.InstanceManager, cfg config.AppConfig) *Handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// HelpHandler godoc
|
// VersionHandler godoc
|
||||||
|
// @Summary Get llamactl version
|
||||||
|
// @Description Returns the version of the llamactl command
|
||||||
|
// @Tags version
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Produces text/plain
|
||||||
|
// @Success 200 {string} string "Version information"
|
||||||
|
// @Failure 500 {string} string "Internal Server Error"
|
||||||
|
// @Router /version [get]
|
||||||
|
func (h *Handler) VersionHandler() http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "text/plain")
|
||||||
|
fmt.Fprintf(w, "Version: %s\nCommit: %s\nBuild Time: %s\n", h.cfg.Version, h.cfg.CommitHash, h.cfg.BuildTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LlamaServerHelpHandler godoc
|
||||||
// @Summary Get help for llama server
|
// @Summary Get help for llama server
|
||||||
// @Description Returns the help text for the llama server command
|
// @Description Returns the help text for the llama server command
|
||||||
// @Tags server
|
// @Tags server
|
||||||
@@ -37,7 +53,7 @@ func NewHandler(im manager.InstanceManager, cfg config.AppConfig) *Handler {
|
|||||||
// @Success 200 {string} string "Help text"
|
// @Success 200 {string} string "Help text"
|
||||||
// @Failure 500 {string} string "Internal Server Error"
|
// @Failure 500 {string} string "Internal Server Error"
|
||||||
// @Router /server/help [get]
|
// @Router /server/help [get]
|
||||||
func (h *Handler) HelpHandler() http.HandlerFunc {
|
func (h *Handler) LlamaServerHelpHandler() http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
helpCmd := exec.Command("llama-server", "--help")
|
helpCmd := exec.Command("llama-server", "--help")
|
||||||
output, err := helpCmd.CombinedOutput()
|
output, err := helpCmd.CombinedOutput()
|
||||||
@@ -50,7 +66,7 @@ func (h *Handler) HelpHandler() http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// VersionHandler godoc
|
// LlamaServerVersionHandler godoc
|
||||||
// @Summary Get version of llama server
|
// @Summary Get version of llama server
|
||||||
// @Description Returns the version of the llama server command
|
// @Description Returns the version of the llama server command
|
||||||
// @Tags server
|
// @Tags server
|
||||||
@@ -59,7 +75,7 @@ func (h *Handler) HelpHandler() http.HandlerFunc {
|
|||||||
// @Success 200 {string} string "Version information"
|
// @Success 200 {string} string "Version information"
|
||||||
// @Failure 500 {string} string "Internal Server Error"
|
// @Failure 500 {string} string "Internal Server Error"
|
||||||
// @Router /server/version [get]
|
// @Router /server/version [get]
|
||||||
func (h *Handler) VersionHandler() http.HandlerFunc {
|
func (h *Handler) LlamaServerVersionHandler() http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
versionCmd := exec.Command("llama-server", "--version")
|
versionCmd := exec.Command("llama-server", "--version")
|
||||||
output, err := versionCmd.CombinedOutput()
|
output, err := versionCmd.CombinedOutput()
|
||||||
@@ -72,7 +88,7 @@ func (h *Handler) VersionHandler() http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListDevicesHandler godoc
|
// LlamaServerListDevicesHandler godoc
|
||||||
// @Summary List available devices for llama server
|
// @Summary List available devices for llama server
|
||||||
// @Description Returns a list of available devices for the llama server
|
// @Description Returns a list of available devices for the llama server
|
||||||
// @Tags server
|
// @Tags server
|
||||||
@@ -81,7 +97,7 @@ func (h *Handler) VersionHandler() http.HandlerFunc {
|
|||||||
// @Success 200 {string} string "List of devices"
|
// @Success 200 {string} string "List of devices"
|
||||||
// @Failure 500 {string} string "Internal Server Error"
|
// @Failure 500 {string} string "Internal Server Error"
|
||||||
// @Router /server/devices [get]
|
// @Router /server/devices [get]
|
||||||
func (h *Handler) ListDevicesHandler() http.HandlerFunc {
|
func (h *Handler) LlamaServerListDevicesHandler() http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
listCmd := exec.Command("llama-server", "--list-devices")
|
listCmd := exec.Command("llama-server", "--list-devices")
|
||||||
output, err := listCmd.CombinedOutput()
|
output, err := listCmd.CombinedOutput()
|
||||||
|
|||||||
@@ -42,10 +42,12 @@ func SetupRouter(handler *Handler) *chi.Mux {
|
|||||||
r.Use(authMiddleware.AuthMiddleware(KeyTypeManagement))
|
r.Use(authMiddleware.AuthMiddleware(KeyTypeManagement))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r.Get("/version", handler.VersionHandler()) // Get server version
|
||||||
|
|
||||||
r.Route("/server", func(r chi.Router) {
|
r.Route("/server", func(r chi.Router) {
|
||||||
r.Get("/help", handler.HelpHandler())
|
r.Get("/help", handler.LlamaServerHelpHandler())
|
||||||
r.Get("/version", handler.VersionHandler())
|
r.Get("/version", handler.LlamaServerVersionHandler())
|
||||||
r.Get("/devices", handler.ListDevicesHandler())
|
r.Get("/devices", handler.LlamaServerListDevicesHandler())
|
||||||
})
|
})
|
||||||
|
|
||||||
// Instance management endpoints
|
// Instance management endpoints
|
||||||
|
|||||||
@@ -19,6 +19,15 @@ import {
|
|||||||
} from 'lucide-react'
|
} from 'lucide-react'
|
||||||
import { serverApi } from '@/lib/api'
|
import { serverApi } from '@/lib/api'
|
||||||
|
|
||||||
|
// Helper to get version from environment
|
||||||
|
const getAppVersion = (): string => {
|
||||||
|
try {
|
||||||
|
return (import.meta.env as Record<string, string>).VITE_APP_VERSION || 'unknown'
|
||||||
|
} catch {
|
||||||
|
return 'unknown'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface SystemInfoModalProps {
|
interface SystemInfoModalProps {
|
||||||
open: boolean
|
open: boolean
|
||||||
onOpenChange: (open: boolean) => void
|
onOpenChange: (open: boolean) => void
|
||||||
@@ -109,9 +118,20 @@ const SystemInfoDialog: React.FC<SystemInfoModalProps> = ({
|
|||||||
</div>
|
</div>
|
||||||
) : systemInfo ? (
|
) : systemInfo ? (
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
{/* Version Section */}
|
{/* Llamactl Version Section */}
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<h3 className="font-semibold">Version</h3>
|
<h3 className="font-semibold">Llamactl Version</h3>
|
||||||
|
|
||||||
|
<div className="bg-gray-900 rounded-lg p-4">
|
||||||
|
<pre className="text-sm text-gray-300 whitespace-pre-wrap font-mono">
|
||||||
|
{getAppVersion()}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Llama Server Version Section */}
|
||||||
|
<div className="space-y-3">
|
||||||
|
<h3 className="font-semibold">Llama Server Version</h3>
|
||||||
|
|
||||||
<div className="bg-gray-900 rounded-lg p-4">
|
<div className="bg-gray-900 rounded-lg p-4">
|
||||||
<div className="mb-2">
|
<div className="mb-2">
|
||||||
|
|||||||
13
webui/src/vite-env.d.ts
vendored
Normal file
13
webui/src/vite-env.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface ImportMetaEnv {
|
||||||
|
readonly VITE_APP_VERSION?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ImportMeta {
|
||||||
|
readonly env: ImportMetaEnv
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {}
|
||||||
@@ -18,8 +18,9 @@
|
|||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./src/*"]
|
"@/*": ["./src/*"]
|
||||||
}
|
},
|
||||||
|
"types": ["vite/client"]
|
||||||
},
|
},
|
||||||
"include": ["src"],
|
"include": ["src", "src/vite-env.d.ts"],
|
||||||
"references": [{ "path": "./tsconfig.node.json" }]
|
"references": [{ "path": "./tsconfig.node.json" }]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user