mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-10-12 08:00:34 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a9a4581a8 |
@@ -11,7 +11,7 @@ func (b *BaseApi) LoadVLLMMonitor(c *gin.Context) {
|
||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||
return
|
||||
}
|
||||
data, err := monitorService.LoadVLLMMonitorData(c.Request.Context(), req)
|
||||
data, err := monitorService.LoadVLLMMonitorData(req)
|
||||
if err != nil {
|
||||
helper.InternalServer(c, err)
|
||||
return
|
||||
|
||||
@@ -127,7 +127,6 @@ type GPUProcess struct {
|
||||
}
|
||||
|
||||
type MonitorVLLMSearch struct {
|
||||
Group string `json:"group" validate:"omitempty,oneof=overview latency requests"`
|
||||
AppInstallID uint `json:"appInstallID" validate:"required"`
|
||||
StartTime time.Time `json:"startTime" validate:"required"`
|
||||
EndTime time.Time `json:"endTime" validate:"required"`
|
||||
|
||||
@@ -79,20 +79,12 @@ type MonitorGPU struct {
|
||||
}
|
||||
|
||||
type MonitorVLLM struct {
|
||||
ID uint `json:"-" gorm:"primarykey;autoIncrement"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
AppInstallID uint `json:"appInstallID"`
|
||||
Status string `json:"status"`
|
||||
RawMetrics string `json:"-"`
|
||||
HistogramDeltas string `json:"-"`
|
||||
IntervalSeconds float64 `json:"intervalSeconds" gorm:"-"`
|
||||
RequestDeltas string `json:"-"`
|
||||
QueueTime *float64 `json:"queueTime"`
|
||||
AverageGenerationTokens *float64 `json:"averageGenerationTokens"`
|
||||
PrefixCacheHitRate *float64 `json:"prefixCacheHitRate"`
|
||||
FinishReasons map[string]float64 `json:"finishReasons" gorm:"-"`
|
||||
PromptDistribution map[string]float64 `json:"promptDistribution" gorm:"-"`
|
||||
GenerationDistribution map[string]float64 `json:"generationDistribution" gorm:"-"`
|
||||
ID uint `json:"-" gorm:"primarykey;autoIncrement"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
AppInstallID uint `json:"appInstallID"`
|
||||
Status string `json:"status"`
|
||||
RawMetrics string `json:"-"`
|
||||
HistogramDeltas string `json:"-"`
|
||||
|
||||
Running *float64 `json:"running"`
|
||||
Waiting *float64 `json:"waiting"`
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package repo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
@@ -16,7 +15,8 @@ type VLLMMonitorRepo struct{}
|
||||
|
||||
type VLLMHistoryPoint struct {
|
||||
model.MonitorVLLM
|
||||
Bucket int64
|
||||
Bucket int64
|
||||
HistogramSamples string
|
||||
}
|
||||
|
||||
func (r *VLLMMonitorRepo) Create(point *model.MonitorVLLM) error {
|
||||
@@ -41,30 +41,16 @@ func (r *VLLMMonitorRepo) DeleteBefore(before time.Time) error {
|
||||
return global.VLLMMonitorDB.Where("created_at < ?", before).Delete(&model.MonitorVLLM{}).Error
|
||||
}
|
||||
|
||||
func (r *VLLMMonitorRepo) Count(ctx context.Context, id uint, start, end time.Time) (int64, error) {
|
||||
func (r *VLLMMonitorRepo) Count(id uint, start, end time.Time) (int64, error) {
|
||||
var count int64
|
||||
db := global.VLLMMonitorDB.WithContext(ctx).Model(&model.MonitorVLLM{}).Where("app_install_id = ? AND created_at >= ? AND created_at <= ?", id, start, end)
|
||||
db := global.VLLMMonitorDB.Model(&model.MonitorVLLM{}).Where("app_install_id = ? AND created_at >= ? AND created_at <= ?", id, start, end)
|
||||
err := db.Count(&count).Error
|
||||
return count, err
|
||||
}
|
||||
|
||||
func (r *VLLMMonitorRepo) History(ctx context.Context, id uint, start, end time.Time, seconds int64, aggregation, group string) ([]VLLMHistoryPoint, error) {
|
||||
db := global.VLLMMonitorDB.WithContext(ctx).Model(&model.MonitorVLLM{}).Where("app_install_id = ? AND created_at >= ? AND created_at <= ?", id, start, end)
|
||||
var metrics []string
|
||||
if group == "" || group == "overview" {
|
||||
metrics = append(metrics, "running", "waiting", "cache_usage", "prompt_throughput", "generation_throughput", "request_throughput")
|
||||
if seconds <= 0 || aggregation == "max" {
|
||||
metrics = append(metrics, "prefix_cache_hit_rate")
|
||||
}
|
||||
}
|
||||
if seconds <= 0 || aggregation == "max" {
|
||||
if group == "" || group == "latency" {
|
||||
metrics = append(metrics, "queue_time", "time_to_first_token", "time_per_output_token", "request_latency", "prefill_time", "decode_time", "time_to_first_token_p50", "time_to_first_token_p90", "time_to_first_token_p95", "time_to_first_token_p99", "time_per_output_token_p50", "time_per_output_token_p90", "time_per_output_token_p95", "time_per_output_token_p99", "request_latency_p50", "request_latency_p90", "request_latency_p95", "request_latency_p99")
|
||||
}
|
||||
if group == "" || group == "requests" {
|
||||
metrics = append(metrics, "average_generation_tokens")
|
||||
}
|
||||
}
|
||||
func (r *VLLMMonitorRepo) History(id uint, start, end time.Time, seconds int64, aggregation string) ([]VLLMHistoryPoint, error) {
|
||||
db := global.VLLMMonitorDB.Model(&model.MonitorVLLM{}).Where("app_install_id = ? AND created_at >= ? AND created_at <= ?", id, start, end)
|
||||
metrics := []string{"running", "waiting", "cache_usage", "prompt_throughput", "generation_throughput", "request_throughput", "time_to_first_token", "time_per_output_token", "request_latency", "prefill_time", "decode_time", "time_to_first_token_p50", "time_to_first_token_p90", "time_to_first_token_p95", "time_to_first_token_p99", "time_per_output_token_p50", "time_per_output_token_p90", "time_per_output_token_p95", "time_per_output_token_p99", "request_latency_p50", "request_latency_p90", "request_latency_p95", "request_latency_p99"}
|
||||
var columns []string
|
||||
if seconds > 0 {
|
||||
operation := "AVG"
|
||||
@@ -73,52 +59,20 @@ func (r *VLLMMonitorRepo) History(ctx context.Context, id uint, start, end time.
|
||||
}
|
||||
columns = []string{fmt.Sprintf("(CAST(strftime('%%s', created_at) AS INTEGER) - %d) / %d AS bucket", start.Unix(), seconds)}
|
||||
for _, column := range metrics {
|
||||
if aggregation != "max" && (strings.HasPrefix(column, "time_to_first_token_p") || strings.HasPrefix(column, "time_per_output_token_p") || strings.HasPrefix(column, "request_latency_p")) {
|
||||
continue
|
||||
}
|
||||
columns = append(columns, operation+"("+column+") AS "+column)
|
||||
}
|
||||
if aggregation != "max" {
|
||||
columns = append(columns, "json_group_array(json(NULLIF(histogram_deltas, ''))) AS histogram_samples")
|
||||
}
|
||||
db = db.Group("bucket").Order("bucket ASC")
|
||||
} else {
|
||||
columns = append([]string{"id", "created_at", "app_install_id", "status"}, metrics...)
|
||||
if group == "" || group == "requests" {
|
||||
columns = append(columns, "histogram_deltas", "request_deltas")
|
||||
}
|
||||
db = db.Order("created_at ASC, id ASC")
|
||||
}
|
||||
var points []VLLMHistoryPoint
|
||||
err := db.Select(strings.Join(columns, ", ")).Scan(&points).Error
|
||||
return points, err
|
||||
}
|
||||
|
||||
func (r *VLLMMonitorRepo) WalkDeltas(ctx context.Context, id uint, start, end time.Time, seconds int64, aggregation, group string, visit func(int64, string, string) error) error {
|
||||
histograms, requests := "''", "''"
|
||||
if group == "" || group == "requests" || (group == "latency" && aggregation != "max") {
|
||||
histograms = "COALESCE(histogram_deltas, '')"
|
||||
}
|
||||
if group == "" || group == "requests" || (group == "overview" && aggregation != "max") {
|
||||
requests = "COALESCE(request_deltas, '')"
|
||||
}
|
||||
if histograms == "''" && requests == "''" {
|
||||
return ctx.Err()
|
||||
}
|
||||
bucket := fmt.Sprintf("(CAST(strftime('%%s', created_at) AS INTEGER) - %d) / %d", start.Unix(), seconds)
|
||||
rows, err := global.VLLMMonitorDB.WithContext(ctx).Model(&model.MonitorVLLM{}).
|
||||
Where("app_install_id = ? AND created_at >= ? AND created_at <= ?", id, start, end).
|
||||
Select(bucket + ", " + histograms + ", " + requests).Rows()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
var index int64
|
||||
var histograms, requests string
|
||||
if err := rows.Scan(&index, &histograms, &requests); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := visit(index, histograms, requests); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return rows.Err()
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ type IMonitorService interface {
|
||||
|
||||
LoadIOOptions() []string
|
||||
LoadNetworkOptions() []string
|
||||
LoadVLLMMonitorData(ctx context.Context, req dto.MonitorVLLMSearch) (dto.MonitorVLLMData, error)
|
||||
LoadVLLMMonitorData(req dto.MonitorVLLMSearch) (dto.MonitorVLLMData, error)
|
||||
LoadVLLMCurrent(ctx context.Context, req dto.MonitorVLLMCurrent) (model.MonitorVLLM, error)
|
||||
CleanVLLMMonitor(req dto.MonitorVLLMClean) error
|
||||
LoadGPUOptions() dto.MonitorGPUOptions
|
||||
|
||||
@@ -31,12 +31,12 @@ var vllmMetricsClient = &http.Client{
|
||||
CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse },
|
||||
}
|
||||
|
||||
func (m *MonitorService) LoadVLLMMonitorData(ctx context.Context, req dto.MonitorVLLMSearch) (dto.MonitorVLLMData, error) {
|
||||
func (m *MonitorService) LoadVLLMMonitorData(req dto.MonitorVLLMSearch) (dto.MonitorVLLMData, error) {
|
||||
data := dto.MonitorVLLMData{Points: []model.MonitorVLLM{}}
|
||||
if !req.EndTime.After(req.StartTime) {
|
||||
return data, fmt.Errorf("invalid vLLM history request")
|
||||
}
|
||||
install, err := appInstallRepo.GetFirstByCtx(ctx, repo.WithByID(req.AppInstallID))
|
||||
install, err := appInstallRepo.GetFirst(repo.WithByID(req.AppInstallID))
|
||||
if err != nil {
|
||||
return data, err
|
||||
}
|
||||
@@ -49,31 +49,23 @@ func (m *MonitorService) LoadVLLMMonitorData(ctx context.Context, req dto.Monito
|
||||
return data, err
|
||||
}
|
||||
req.StartTime, req.EndTime = req.StartTime.In(loc), req.EndTime.In(loc)
|
||||
data.SampleCount, err = vllmMonitorRepo.Count(ctx, req.AppInstallID, req.StartTime, req.EndTime)
|
||||
data.SampleCount, err = vllmMonitorRepo.Count(req.AppInstallID, req.StartTime, req.EndTime)
|
||||
if err != nil || data.SampleCount == 0 {
|
||||
return data, err
|
||||
}
|
||||
if data.SampleCount > 1200 {
|
||||
data.BucketSeconds = (req.EndTime.Unix() - req.StartTime.Unix() + 600) / 600
|
||||
}
|
||||
points, err := vllmMonitorRepo.History(ctx, req.AppInstallID, req.StartTime, req.EndTime, data.BucketSeconds, req.Aggregation, req.Group)
|
||||
points, err := vllmMonitorRepo.History(req.AppInstallID, req.StartTime, req.EndTime, data.BucketSeconds, req.Aggregation)
|
||||
if err != nil {
|
||||
return data, err
|
||||
}
|
||||
if data.BucketSeconds > 0 {
|
||||
aggregates := map[int64]*vllm.HistoryAccumulator{}
|
||||
err = vllmMonitorRepo.WalkDeltas(ctx, req.AppInstallID, req.StartTime, req.EndTime, data.BucketSeconds, req.Aggregation, req.Group, func(bucket int64, histograms, requests string) error {
|
||||
if aggregates[bucket] == nil {
|
||||
aggregates[bucket] = &vllm.HistoryAccumulator{}
|
||||
}
|
||||
return aggregates[bucket].Add(histograms, requests, req.Aggregation, req.Group)
|
||||
})
|
||||
if err != nil {
|
||||
return data, err
|
||||
}
|
||||
for i := range points {
|
||||
if aggregate := aggregates[points[i].Bucket]; aggregate != nil {
|
||||
aggregate.Apply(&points[i].MonitorVLLM, req.Aggregation)
|
||||
if req.Aggregation != "max" {
|
||||
for i := range points {
|
||||
if err := vllm.AggregateHistograms(points[i].HistogramSamples, &points[i].MonitorVLLM); err != nil {
|
||||
return data, err
|
||||
}
|
||||
}
|
||||
}
|
||||
next := 0
|
||||
@@ -101,14 +93,6 @@ func (m *MonitorService) LoadVLLMMonitorData(ctx context.Context, req dto.Monito
|
||||
}
|
||||
interval := time.Duration(intervalSeconds) * time.Second
|
||||
for i, point := range points {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return data, err
|
||||
}
|
||||
var aggregate vllm.HistoryAccumulator
|
||||
if err := aggregate.Add(point.HistogramDeltas, point.RequestDeltas, "max", req.Group); err != nil {
|
||||
return data, err
|
||||
}
|
||||
aggregate.Apply(&point.MonitorVLLM, "max")
|
||||
if i > 0 && point.CreatedAt.Sub(points[i-1].CreatedAt) > 2*interval {
|
||||
data.Points = append(data.Points, model.MonitorVLLM{CreatedAt: points[i-1].CreatedAt.Add(interval), AppInstallID: req.AppInstallID})
|
||||
}
|
||||
|
||||
@@ -113,7 +113,6 @@ func agentDBMigrations() []*gormigrate.Migration {
|
||||
migrations.AddAcceleratorMetrics,
|
||||
migrations.AddVLLMMonitor,
|
||||
migrations.AddMonitorSettings,
|
||||
migrations.AddVLLMRequestMetrics,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1874,10 +1874,3 @@ var AddMonitorSettings = &gormigrate.Migration{
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
var AddVLLMRequestMetrics = &gormigrate.Migration{
|
||||
ID: "20261010-vllm-request-metrics",
|
||||
Migrate: func(tx *gorm.DB) error {
|
||||
return global.VLLMMonitorDB.AutoMigrate(&model.MonitorVLLM{})
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
package vllm
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"math"
|
||||
|
||||
"github.com/1Panel-dev/1Panel/agent/app/model"
|
||||
)
|
||||
|
||||
type HistoryAccumulator struct {
|
||||
histograms map[string]histogram
|
||||
prefixHits float64
|
||||
prefixQueries float64
|
||||
finishReasons map[string]float64
|
||||
finishSeconds map[string]float64
|
||||
}
|
||||
|
||||
func (a *HistoryAccumulator) Add(histograms, requests, aggregation, group string) error {
|
||||
if histograms != "" {
|
||||
var sample map[string]histogram
|
||||
if aggregation == "max" || group == "requests" {
|
||||
var distributions struct {
|
||||
Prompt *histogram `json:"request_prompt_tokens"`
|
||||
Generation *histogram `json:"request_generation_tokens"`
|
||||
}
|
||||
if err := json.Unmarshal([]byte(histograms), &distributions); err != nil {
|
||||
return err
|
||||
}
|
||||
sample = map[string]histogram{}
|
||||
if distributions.Prompt != nil {
|
||||
sample["request_prompt_tokens"] = *distributions.Prompt
|
||||
}
|
||||
if distributions.Generation != nil {
|
||||
sample["request_generation_tokens"] = *distributions.Generation
|
||||
}
|
||||
} else if group == "latency" {
|
||||
var latency struct {
|
||||
FirstToken *histogram `json:"time_to_first_token_seconds"`
|
||||
InterToken *histogram `json:"inter_token_latency_seconds"`
|
||||
Request *histogram `json:"e2e_request_latency_seconds"`
|
||||
Prefill *histogram `json:"request_prefill_time_seconds"`
|
||||
Decode *histogram `json:"request_decode_time_seconds"`
|
||||
Queue *histogram `json:"request_queue_time_seconds"`
|
||||
}
|
||||
if err := json.Unmarshal([]byte(histograms), &latency); err != nil {
|
||||
return err
|
||||
}
|
||||
sample = map[string]histogram{}
|
||||
for name, item := range map[string]*histogram{
|
||||
"time_to_first_token_seconds": latency.FirstToken,
|
||||
"inter_token_latency_seconds": latency.InterToken,
|
||||
"e2e_request_latency_seconds": latency.Request,
|
||||
"request_prefill_time_seconds": latency.Prefill,
|
||||
"request_decode_time_seconds": latency.Decode,
|
||||
"request_queue_time_seconds": latency.Queue,
|
||||
} {
|
||||
if item != nil {
|
||||
sample[name] = *item
|
||||
}
|
||||
}
|
||||
} else if err := json.Unmarshal([]byte(histograms), &sample); err != nil {
|
||||
return err
|
||||
}
|
||||
if a.histograms == nil {
|
||||
a.histograms = map[string]histogram{}
|
||||
}
|
||||
for name, item := range sample {
|
||||
switch name {
|
||||
case "request_prefill_time_seconds", "request_decode_time_seconds", "request_queue_time_seconds":
|
||||
item.Buckets = nil
|
||||
}
|
||||
total, exists := a.histograms[name]
|
||||
if !exists {
|
||||
a.histograms[name] = item
|
||||
continue
|
||||
}
|
||||
total.Seconds += item.Seconds
|
||||
total.Sum += item.Sum
|
||||
total.Count += item.Count
|
||||
if len(total.Buckets) != len(item.Buckets) {
|
||||
total.Buckets = nil
|
||||
}
|
||||
for bound, count := range total.Buckets {
|
||||
addition, ok := item.Buckets[bound]
|
||||
if !ok {
|
||||
total.Buckets = nil
|
||||
break
|
||||
}
|
||||
total.Buckets[bound] = count + addition
|
||||
}
|
||||
a.histograms[name] = total
|
||||
}
|
||||
}
|
||||
if requests == "" {
|
||||
return nil
|
||||
}
|
||||
if group == "overview" {
|
||||
var prefix struct {
|
||||
Seconds float64 `json:"seconds"`
|
||||
Hits *float64 `json:"prefixHits"`
|
||||
Queries *float64 `json:"prefixQueries"`
|
||||
}
|
||||
if err := json.Unmarshal([]byte(requests), &prefix); err != nil {
|
||||
return err
|
||||
}
|
||||
if prefix.Seconds > 0 && prefix.Hits != nil && prefix.Queries != nil {
|
||||
a.prefixHits += *prefix.Hits
|
||||
a.prefixQueries += *prefix.Queries
|
||||
}
|
||||
return nil
|
||||
}
|
||||
var sample requestMetrics
|
||||
if err := json.Unmarshal([]byte(requests), &sample); err != nil {
|
||||
return err
|
||||
}
|
||||
if sample.Seconds <= 0 {
|
||||
return nil
|
||||
}
|
||||
if group == "" && aggregation != "max" && sample.PrefixHits != nil && sample.PrefixQueries != nil {
|
||||
a.prefixHits += *sample.PrefixHits
|
||||
a.prefixQueries += *sample.PrefixQueries
|
||||
}
|
||||
for reason, count := range sample.FinishReasons {
|
||||
if a.finishReasons == nil {
|
||||
a.finishReasons = map[string]float64{}
|
||||
}
|
||||
if aggregation == "max" {
|
||||
a.finishReasons[reason] = math.Max(a.finishReasons[reason], count/sample.Seconds)
|
||||
} else {
|
||||
if a.finishSeconds == nil {
|
||||
a.finishSeconds = map[string]float64{}
|
||||
}
|
||||
a.finishReasons[reason] += count
|
||||
a.finishSeconds[reason] += sample.Seconds
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *HistoryAccumulator) Apply(result *model.MonitorVLLM, aggregation string) {
|
||||
applyHistograms(result, a.histograms, aggregation != "max")
|
||||
for reason, count := range a.finishReasons {
|
||||
if result.FinishReasons == nil {
|
||||
result.FinishReasons = map[string]float64{}
|
||||
}
|
||||
if aggregation == "max" {
|
||||
result.FinishReasons[reason] = count
|
||||
} else {
|
||||
result.FinishReasons[reason] = count / a.finishSeconds[reason]
|
||||
}
|
||||
}
|
||||
if aggregation != "max" && a.prefixQueries > 0 {
|
||||
rate := a.prefixHits / a.prefixQueries * 100
|
||||
result.PrefixCacheHitRate = &rate
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,6 @@ import (
|
||||
type Metrics map[string]map[string]float64
|
||||
|
||||
type histogram struct {
|
||||
Seconds float64 `json:"seconds,omitempty"`
|
||||
Sum float64 `json:"sum"`
|
||||
Count float64 `json:"count"`
|
||||
Buckets map[string]float64 `json:"buckets,omitempty"`
|
||||
@@ -38,16 +37,14 @@ func Parse(reader io.Reader) (Metrics, error) {
|
||||
}
|
||||
name := strings.TrimPrefix(match[1], "vllm:")
|
||||
switch name {
|
||||
case "request_prefill_time_seconds_bucket", "request_decode_time_seconds_bucket", "request_queue_time_seconds_bucket":
|
||||
continue
|
||||
case "num_requests_running", "num_requests_waiting", "kv_cache_usage_perc", "gpu_cache_usage_perc", "prompt_tokens_total", "generation_tokens_total", "request_success_total", "prefix_cache_hits_total", "prefix_cache_queries_total":
|
||||
case "num_requests_running", "num_requests_waiting", "kv_cache_usage_perc", "gpu_cache_usage_perc", "prompt_tokens_total", "generation_tokens_total", "request_success_total":
|
||||
default:
|
||||
base := strings.TrimSuffix(strings.TrimSuffix(strings.TrimSuffix(name, "_sum"), "_count"), "_bucket")
|
||||
if base == name {
|
||||
continue
|
||||
}
|
||||
switch base {
|
||||
case "time_to_first_token_seconds", "time_per_output_token_seconds", "inter_token_latency_seconds", "e2e_request_latency_seconds", "request_prefill_time_seconds", "request_decode_time_seconds", "request_queue_time_seconds", "request_prompt_tokens", "request_generation_tokens":
|
||||
case "time_to_first_token_seconds", "time_per_output_token_seconds", "inter_token_latency_seconds", "e2e_request_latency_seconds", "request_prefill_time_seconds", "request_decode_time_seconds":
|
||||
default:
|
||||
continue
|
||||
}
|
||||
@@ -120,7 +117,7 @@ func Calculate(current, previous Metrics, elapsed float64) (model.MonitorVLLM, e
|
||||
}
|
||||
}
|
||||
histograms := map[string]histogram{}
|
||||
for _, name := range []string{"time_to_first_token_seconds", "inter_token_latency_seconds", "e2e_request_latency_seconds", "request_prefill_time_seconds", "request_decode_time_seconds", "request_queue_time_seconds", "request_prompt_tokens", "request_generation_tokens"} {
|
||||
for _, name := range []string{"time_to_first_token_seconds", "inter_token_latency_seconds", "e2e_request_latency_seconds", "request_prefill_time_seconds", "request_decode_time_seconds"} {
|
||||
source := name
|
||||
if name == "inter_token_latency_seconds" && len(current[name+"_count"]) == 0 {
|
||||
source = "time_per_output_token_seconds"
|
||||
@@ -130,21 +127,9 @@ func Calculate(current, previous Metrics, elapsed float64) (model.MonitorVLLM, e
|
||||
if sum == nil || count == nil {
|
||||
continue
|
||||
}
|
||||
item := histogram{Sum: *sum, Count: *count}
|
||||
switch name {
|
||||
case "request_prefill_time_seconds", "request_decode_time_seconds", "request_queue_time_seconds":
|
||||
default:
|
||||
item.Buckets = bucketDeltas(current[source+"_bucket"], previous[source+"_bucket"], *count)
|
||||
}
|
||||
if name == "request_prompt_tokens" || name == "request_generation_tokens" {
|
||||
item.Seconds = elapsed
|
||||
}
|
||||
histograms[name] = item
|
||||
}
|
||||
applyHistograms(&result, histograms, true)
|
||||
if err := calculateRequestMetrics(current, previous, elapsed, &result); err != nil {
|
||||
return model.MonitorVLLM{}, err
|
||||
histograms[name] = histogram{Sum: *sum, Count: *count, Buckets: bucketDeltas(current[source+"_bucket"], previous[source+"_bucket"], *count)}
|
||||
}
|
||||
applyHistograms(&result, histograms)
|
||||
encoded, err := json.Marshal(histograms)
|
||||
if err != nil {
|
||||
return model.MonitorVLLM{}, err
|
||||
@@ -153,24 +138,43 @@ func Calculate(current, previous Metrics, elapsed float64) (model.MonitorVLLM, e
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func applyHistograms(result *model.MonitorVLLM, histograms map[string]histogram, includeMeans bool) {
|
||||
for name, target := range map[string]*map[string]float64{
|
||||
"request_prompt_tokens": &result.PromptDistribution,
|
||||
"request_generation_tokens": &result.GenerationDistribution,
|
||||
} {
|
||||
item := histograms[name]
|
||||
if item.Seconds <= 0 || len(item.Buckets) == 0 {
|
||||
continue
|
||||
}
|
||||
result.IntervalSeconds = math.Max(result.IntervalSeconds, item.Seconds)
|
||||
*target = make(map[string]float64, len(item.Buckets))
|
||||
for bound, count := range item.Buckets {
|
||||
(*target)[bound] = count / item.Seconds
|
||||
func AggregateHistograms(encoded string, result *model.MonitorVLLM) error {
|
||||
var samples []map[string]histogram
|
||||
if err := json.Unmarshal([]byte(encoded), &samples); err != nil {
|
||||
return err
|
||||
}
|
||||
merged := map[string]histogram{}
|
||||
for _, sample := range samples {
|
||||
for name, item := range sample {
|
||||
if item.Count == 0 {
|
||||
continue
|
||||
}
|
||||
total, exists := merged[name]
|
||||
if !exists {
|
||||
merged[name] = item
|
||||
continue
|
||||
}
|
||||
total.Sum += item.Sum
|
||||
total.Count += item.Count
|
||||
if len(total.Buckets) != len(item.Buckets) {
|
||||
total.Buckets = nil
|
||||
}
|
||||
for bound, count := range total.Buckets {
|
||||
addition, ok := item.Buckets[bound]
|
||||
if !ok {
|
||||
total.Buckets = nil
|
||||
break
|
||||
}
|
||||
total.Buckets[bound] = count + addition
|
||||
}
|
||||
merged[name] = total
|
||||
}
|
||||
}
|
||||
if !includeMeans {
|
||||
return
|
||||
}
|
||||
applyHistograms(result, merged)
|
||||
return nil
|
||||
}
|
||||
|
||||
func applyHistograms(result *model.MonitorVLLM, histograms map[string]histogram) {
|
||||
for _, item := range []struct {
|
||||
name string
|
||||
mean **float64
|
||||
@@ -181,8 +185,6 @@ func applyHistograms(result *model.MonitorVLLM, histograms map[string]histogram,
|
||||
{"e2e_request_latency_seconds", &result.RequestLatency, []**float64{&result.RequestLatencyP50, &result.RequestLatencyP90, &result.RequestLatencyP95, &result.RequestLatencyP99}},
|
||||
{"request_prefill_time_seconds", &result.PrefillTime, nil},
|
||||
{"request_decode_time_seconds", &result.DecodeTime, nil},
|
||||
{"request_queue_time_seconds", &result.QueueTime, nil},
|
||||
{"request_generation_tokens", &result.AverageGenerationTokens, nil},
|
||||
} {
|
||||
histogram, ok := histograms[item.name]
|
||||
if !ok || histogram.Count <= 0 {
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
package vllm
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"strconv"
|
||||
|
||||
"github.com/1Panel-dev/1Panel/agent/app/model"
|
||||
"github.com/1Panel-dev/1Panel/agent/utils/re"
|
||||
)
|
||||
|
||||
type requestMetrics struct {
|
||||
Seconds float64 `json:"seconds"`
|
||||
PrefixHits *float64 `json:"prefixHits,omitempty"`
|
||||
PrefixQueries *float64 `json:"prefixQueries,omitempty"`
|
||||
FinishReasons map[string]float64 `json:"finishReasons,omitempty"`
|
||||
}
|
||||
|
||||
func calculateRequestMetrics(current, previous Metrics, elapsed float64, result *model.MonitorVLLM) error {
|
||||
sample := requestMetrics{Seconds: elapsed, FinishReasons: map[string]float64{}}
|
||||
hits := counterDelta(current["prefix_cache_hits_total"], previous["prefix_cache_hits_total"])
|
||||
queries := counterDelta(current["prefix_cache_queries_total"], previous["prefix_cache_queries_total"])
|
||||
if hits != nil && queries != nil && *hits <= *queries {
|
||||
sample.PrefixHits, sample.PrefixQueries = hits, queries
|
||||
if *queries > 0 {
|
||||
rate := *hits / *queries * 100
|
||||
result.PrefixCacheHitRate = &rate
|
||||
}
|
||||
}
|
||||
before := groupFinishReasons(previous["request_success_total"])
|
||||
for reason, values := range groupFinishReasons(current["request_success_total"]) {
|
||||
if delta := counterDelta(values, before[reason]); delta != nil {
|
||||
sample.FinishReasons[reason] = *delta
|
||||
if result.FinishReasons == nil {
|
||||
result.FinishReasons = map[string]float64{}
|
||||
}
|
||||
result.FinishReasons[reason] = *delta / elapsed
|
||||
}
|
||||
}
|
||||
encoded, err := json.Marshal(sample)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
result.RequestDeltas = string(encoded)
|
||||
return nil
|
||||
}
|
||||
|
||||
func groupFinishReasons(samples map[string]float64) map[string]map[string]float64 {
|
||||
groups := map[string]map[string]float64{}
|
||||
for labels, value := range samples {
|
||||
for _, label := range re.GetRegex(re.VLLMMetricLabelPattern).FindAllStringSubmatch(labels, -1) {
|
||||
if label[1] != "finished_reason" {
|
||||
continue
|
||||
}
|
||||
reason, err := strconv.Unquote(label[2])
|
||||
if err != nil || reason == "" {
|
||||
continue
|
||||
}
|
||||
if groups[reason] == nil {
|
||||
groups[reason] = map[string]float64{}
|
||||
}
|
||||
groups[reason][labels] = value
|
||||
}
|
||||
}
|
||||
return groups
|
||||
}
|
||||
@@ -209,36 +209,18 @@ func buildBaseChainBindingsRestoreScript(output string, bind bool) string {
|
||||
}
|
||||
|
||||
func baseChainBindingCommands(output string, bind bool) []string {
|
||||
chains := BasicChains()
|
||||
lines := make([]string, 0, len(chains)*2)
|
||||
position, insertAt := 0, 1
|
||||
for _, current := range strings.Split(output, "\n") {
|
||||
current = strings.TrimSpace(current)
|
||||
if !strings.HasPrefix(current, "-A "+InputChain+" ") {
|
||||
continue
|
||||
}
|
||||
if chain := strings.TrimPrefix(current, "-A "+InputChain+" -j "); slices.Contains(chains, chain) {
|
||||
lines = append(lines, "-D "+InputChain+" -j "+chain)
|
||||
continue
|
||||
}
|
||||
position++
|
||||
if !bind {
|
||||
continue
|
||||
}
|
||||
fields, err := shellwords.Parse(current)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
for index := 2; index+1 < len(fields); index++ {
|
||||
if fields[index] == "-j" && strings.HasPrefix(fields[index+1], "f2b-") {
|
||||
insertAt = position + 1
|
||||
break
|
||||
lines := make([]string, 0, len(BasicChains())*2)
|
||||
for _, chain := range BasicChains() {
|
||||
binding := "-A " + InputChain + " -j " + chain
|
||||
for _, current := range strings.Split(output, "\n") {
|
||||
if strings.TrimSpace(current) == binding {
|
||||
lines = append(lines, "-D "+InputChain+" -j "+chain)
|
||||
}
|
||||
}
|
||||
}
|
||||
if bind {
|
||||
for index, chain := range chains {
|
||||
lines = append(lines, fmt.Sprintf("-I %s %d -j %s", InputChain, insertAt+index, chain))
|
||||
for index, chain := range BasicChains() {
|
||||
lines = append(lines, fmt.Sprintf("-I %s %d -j %s", InputChain, index+1, chain))
|
||||
}
|
||||
}
|
||||
return lines
|
||||
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
"github.com/go-acme/lego/v5/providers/dns/namecheap"
|
||||
"github.com/go-acme/lego/v5/providers/dns/namedotcom"
|
||||
"github.com/go-acme/lego/v5/providers/dns/namesilo"
|
||||
"github.com/go-acme/lego/v5/providers/dns/netcup"
|
||||
"github.com/go-acme/lego/v5/providers/dns/ovh"
|
||||
"github.com/go-acme/lego/v5/providers/dns/porkbun"
|
||||
"github.com/go-acme/lego/v5/providers/dns/rainyun"
|
||||
@@ -59,7 +58,6 @@ const (
|
||||
NameCheap DnsType = "NameCheap"
|
||||
NameCom DnsType = "NameCom"
|
||||
NameSilo DnsType = "NameSilo"
|
||||
Netcup DnsType = "Netcup"
|
||||
Ovh DnsType = "Ovh"
|
||||
PorkBun DnsType = "PorkBun"
|
||||
RainYun DnsType = "RainYun"
|
||||
@@ -74,27 +72,26 @@ const (
|
||||
)
|
||||
|
||||
type DNSParam struct {
|
||||
ID string `json:"id"`
|
||||
Token string `json:"token"`
|
||||
AccessKey string `json:"accessKey"`
|
||||
SecretKey string `json:"secretKey"`
|
||||
Email string `json:"email"`
|
||||
APIkey string `json:"apiKey"`
|
||||
APIUser string `json:"apiUser"`
|
||||
APISecret string `json:"apiSecret"`
|
||||
APIPrefix string `json:"apiPrefix"`
|
||||
SecretID string `json:"secretID"`
|
||||
ClientID string `json:"clientID"`
|
||||
Password string `json:"password"`
|
||||
Region string `json:"region"`
|
||||
Username string `json:"username"`
|
||||
AuthID string `json:"authID"`
|
||||
SubAuthID string `json:"subAuthID"`
|
||||
AuthPassword string `json:"authPassword"`
|
||||
Endpoint string `json:"endpoint"`
|
||||
AccessToken string `json:"accessToken"`
|
||||
BaseURL string `json:"baseURL"`
|
||||
CustomerNumber string `json:"customerNumber"`
|
||||
ID string `json:"id"`
|
||||
Token string `json:"token"`
|
||||
AccessKey string `json:"accessKey"`
|
||||
SecretKey string `json:"secretKey"`
|
||||
Email string `json:"email"`
|
||||
APIkey string `json:"apiKey"`
|
||||
APIUser string `json:"apiUser"`
|
||||
APISecret string `json:"apiSecret"`
|
||||
APIPrefix string `json:"apiPrefix"`
|
||||
SecretID string `json:"secretID"`
|
||||
ClientID string `json:"clientID"`
|
||||
Password string `json:"password"`
|
||||
Region string `json:"region"`
|
||||
Username string `json:"username"`
|
||||
AuthID string `json:"authID"`
|
||||
SubAuthID string `json:"subAuthID"`
|
||||
AuthPassword string `json:"authPassword"`
|
||||
Endpoint string `json:"endpoint"`
|
||||
AccessToken string `json:"accessToken"`
|
||||
BaseURL string `json:"baseURL"`
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -167,14 +164,6 @@ func getDNSProviderConfig(dnsType DnsType, params string, httpClient *http.Clien
|
||||
config.PropagationTimeout = propagationTimeout
|
||||
config.PollingInterval = pollingInterval
|
||||
p, err = namesilo.NewDNSProviderConfig(config)
|
||||
case Netcup:
|
||||
config := newDNSProviderConfig(netcup.NewDefaultConfig(), httpClient)
|
||||
config.Customer = param.CustomerNumber
|
||||
config.Key = param.APIkey
|
||||
config.Password = param.Password
|
||||
config.PropagationTimeout = propagationTimeout
|
||||
config.PollingInterval = pollingInterval
|
||||
p, err = netcup.NewDNSProviderConfig(config)
|
||||
case Godaddy:
|
||||
config := newDNSProviderConfig(godaddy.NewDefaultConfig(), httpClient)
|
||||
config.APIKey = param.APIkey
|
||||
|
||||
Generated
+15
-179
@@ -27,7 +27,7 @@
|
||||
"crypto-js": "^4.2.0",
|
||||
"dompurify": "^3.4.16",
|
||||
"echarts": "^6.1.0",
|
||||
"element-plus": "2.14.6",
|
||||
"element-plus": "2.14.7",
|
||||
"js-base64": "^3.9.1",
|
||||
"jsencrypt": "^3.3.2",
|
||||
"lodash-es": "^4.18.1",
|
||||
@@ -126,7 +126,6 @@
|
||||
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.29.7",
|
||||
"@babel/generator": "^7.29.7",
|
||||
@@ -1014,7 +1013,6 @@
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1031,7 +1029,6 @@
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1048,7 +1045,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1065,7 +1061,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1082,7 +1077,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1099,7 +1093,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1116,7 +1109,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1133,7 +1125,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1150,7 +1141,6 @@
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1167,7 +1157,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1184,7 +1173,6 @@
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1201,7 +1189,6 @@
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1218,7 +1205,6 @@
|
||||
"cpu": [
|
||||
"mips64el"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1235,7 +1221,6 @@
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1252,7 +1237,6 @@
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1269,7 +1253,6 @@
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1286,7 +1269,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1303,7 +1285,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1320,7 +1301,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1337,7 +1317,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1354,7 +1333,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1371,7 +1349,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1388,7 +1365,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1405,7 +1381,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1422,7 +1397,6 @@
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1439,7 +1413,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -1773,18 +1746,6 @@
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/source-map": {
|
||||
"version": "0.3.11",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
|
||||
"integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/gen-mapping": "^0.3.5",
|
||||
"@jridgewell/trace-mapping": "^0.3.25"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.5.5",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
|
||||
@@ -2013,7 +1974,6 @@
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
|
||||
"integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
@@ -2053,7 +2013,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2074,7 +2033,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2095,7 +2053,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2116,7 +2073,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2137,7 +2093,6 @@
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2158,7 +2113,6 @@
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2179,7 +2133,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2200,7 +2153,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2221,7 +2173,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2242,7 +2193,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2263,7 +2213,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2284,7 +2233,6 @@
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2305,7 +2253,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2350,7 +2297,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2367,7 +2313,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2384,7 +2329,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2401,7 +2345,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2418,7 +2361,6 @@
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2435,7 +2377,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2452,7 +2393,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2469,7 +2409,6 @@
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2486,7 +2425,6 @@
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2503,7 +2441,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2520,7 +2457,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2537,7 +2473,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2554,7 +2489,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2571,7 +2505,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -2978,7 +2911,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
|
||||
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/lodash": "*"
|
||||
}
|
||||
@@ -3010,9 +2942,8 @@
|
||||
"version": "26.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz",
|
||||
"integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~8.9.0"
|
||||
}
|
||||
@@ -3315,7 +3246,6 @@
|
||||
"integrity": "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "8.68.0",
|
||||
"@typescript-eslint/types": "8.68.0",
|
||||
@@ -3999,7 +3929,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz",
|
||||
"integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/web-bluetooth": "^0.0.21",
|
||||
"@vueuse/metadata": "14.4.0",
|
||||
@@ -4046,15 +3975,13 @@
|
||||
"version": "5.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz",
|
||||
"integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/acorn": {
|
||||
"version": "8.18.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
|
||||
"integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
@@ -4295,7 +4222,6 @@
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
@@ -4325,7 +4251,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"baseline-browser-mapping": "^2.11.26",
|
||||
"caniuse-lite": "^1.0.30001812",
|
||||
@@ -4344,7 +4269,7 @@
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/bundle-name": {
|
||||
@@ -4587,7 +4512,6 @@
|
||||
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz",
|
||||
"integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.0.0",
|
||||
"@codemirror/commands": "^6.0.0",
|
||||
@@ -5282,7 +5206,6 @@
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||
"integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"bin": {
|
||||
@@ -5495,9 +5418,9 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/element-plus": {
|
||||
"version": "2.14.6",
|
||||
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.14.6.tgz",
|
||||
"integrity": "sha512-GH0fMoMgVEKkHimoaKvg5B00NmfPbQ+qxX6/JrO7F+dLAC3atrZr2Y2MoccHMxS22M7QE12/s0DG0Zs49iwJ/A==",
|
||||
"version": "2.14.7",
|
||||
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.14.7.tgz",
|
||||
"integrity": "sha512-lrG7pZyCS+mpCNVpzxxyu5r35+T6V0hzkAeIwn7HA6to772XSTHKuYCZG51OfzlqaxGbNegLxs650zAF1j43gA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@ctrl/tinycolor": "^4.2.1",
|
||||
@@ -5671,7 +5594,6 @@
|
||||
"devOptional": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"esbuild": "bin/esbuild"
|
||||
},
|
||||
@@ -5733,7 +5655,6 @@
|
||||
"integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
],
|
||||
@@ -5793,7 +5714,6 @@
|
||||
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"eslint-config-prettier": "bin/cli.js"
|
||||
},
|
||||
@@ -6138,7 +6058,6 @@
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
@@ -6240,7 +6159,6 @@
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
@@ -6720,7 +6638,7 @@
|
||||
"version": "5.1.9",
|
||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
|
||||
"integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/imurmurhash": {
|
||||
@@ -6793,7 +6711,7 @@
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
@@ -6803,7 +6721,7 @@
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
||||
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-extglob": "^2.1.1"
|
||||
@@ -6848,7 +6766,6 @@
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
@@ -6934,7 +6851,7 @@
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
|
||||
"integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"jiti": "lib/jiti-cli.mjs"
|
||||
@@ -7532,15 +7449,13 @@
|
||||
"version": "4.18.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
|
||||
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash-es": {
|
||||
"version": "4.18.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
|
||||
"integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash-unified": {
|
||||
"version": "1.0.3",
|
||||
@@ -7622,7 +7537,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"argparse": "^2.0.1",
|
||||
"entities": "^4.5.0",
|
||||
@@ -7920,7 +7834,6 @@
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
@@ -8086,7 +7999,6 @@
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
|
||||
"integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
@@ -8326,7 +8238,6 @@
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
|
||||
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
@@ -8351,7 +8262,6 @@
|
||||
"resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz",
|
||||
"integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/devtools-api": "^7.7.7"
|
||||
},
|
||||
@@ -8432,7 +8342,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.17",
|
||||
"picocolors": "^1.1.1",
|
||||
@@ -8544,7 +8453,6 @@
|
||||
"integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
@@ -8896,7 +8804,6 @@
|
||||
"integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@oxc-project/types": "=0.143.0",
|
||||
"@rolldown/pluginutils": "^1.0.0"
|
||||
@@ -9006,9 +8913,8 @@
|
||||
"version": "1.105.0",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.105.0.tgz",
|
||||
"integrity": "sha512-4EjSuRTyG8M4yRXXY1PT9OUV5zz23xBxJkbIAprohKHqf6HOU4MCpE3U3vAC+iO1gxobBjESNbcj8rYAQZWnyA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"chokidar": "^5.0.0",
|
||||
"immutable": "^5.1.5",
|
||||
@@ -9191,29 +9097,6 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-support": {
|
||||
"version": "0.5.21",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
|
||||
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"source-map": "^0.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-support/node_modules/source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/spdx-correct": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
|
||||
@@ -9548,34 +9431,6 @@
|
||||
"url": "https://opencollective.com/webpack"
|
||||
}
|
||||
},
|
||||
"node_modules/terser": {
|
||||
"version": "5.44.1",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz",
|
||||
"integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/source-map": "^0.3.3",
|
||||
"acorn": "^8.15.0",
|
||||
"commander": "^2.20.0",
|
||||
"source-map-support": "~0.5.20"
|
||||
},
|
||||
"bin": {
|
||||
"terser": "bin/terser"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/terser/node_modules/commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/text-extensions": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
|
||||
@@ -9657,7 +9512,6 @@
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
|
||||
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
@@ -9669,7 +9523,6 @@
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
@@ -9734,7 +9587,6 @@
|
||||
"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
@@ -9773,7 +9625,7 @@
|
||||
"version": "8.9.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
|
||||
"integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/unimport": {
|
||||
@@ -10163,7 +10015,6 @@
|
||||
"integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"lightningcss": "^1.33.0",
|
||||
"picomatch": "^4.0.5",
|
||||
@@ -10438,7 +10289,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10459,7 +10309,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10480,7 +10329,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10501,7 +10349,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10522,7 +10369,6 @@
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10543,7 +10389,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10564,7 +10409,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10585,7 +10429,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10606,7 +10449,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10627,7 +10469,6 @@
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10648,7 +10489,6 @@
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -10687,7 +10527,6 @@
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.42.tgz",
|
||||
"integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.5.42",
|
||||
"@vue/compiler-sfc": "3.5.42",
|
||||
@@ -10741,7 +10580,6 @@
|
||||
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
@@ -10768,7 +10606,6 @@
|
||||
"integrity": "sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"debug": "^4.4.0",
|
||||
"eslint-scope": "^8.2.0 || ^9.0.0",
|
||||
@@ -11116,7 +10953,6 @@
|
||||
"version": "2.9.1",
|
||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz",
|
||||
"integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"optional": true,
|
||||
"bin": {
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"crypto-js": "^4.2.0",
|
||||
"dompurify": "^3.4.16",
|
||||
"echarts": "^6.1.0",
|
||||
"element-plus": "2.14.6",
|
||||
"element-plus": "2.14.7",
|
||||
"js-base64": "^3.9.1",
|
||||
"jsencrypt": "^3.3.2",
|
||||
"lodash-es": "^4.18.1",
|
||||
|
||||
@@ -216,10 +216,6 @@ export const DNSTypes = [
|
||||
label: 'NameSilo',
|
||||
value: 'NameSilo',
|
||||
},
|
||||
{
|
||||
label: 'Netcup',
|
||||
value: 'Netcup',
|
||||
},
|
||||
{
|
||||
label: 'NameCheap',
|
||||
value: 'NameCheap',
|
||||
|
||||
@@ -1517,24 +1517,6 @@ const message = {
|
||||
extraHeaders: 'Extra Headers',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/s',
|
||||
requestsPerSecond: 'Requests/s',
|
||||
finishReasonLabels: {
|
||||
stop: 'Normal completion',
|
||||
length: 'Length limit reached',
|
||||
abort: 'Aborted',
|
||||
error: 'Error',
|
||||
repetition: 'Repetition',
|
||||
},
|
||||
requestAnalysis: 'Request analysis',
|
||||
promptDistribution: 'Prompt token length distribution',
|
||||
generationDistribution: 'Generation token length distribution',
|
||||
finishReasons: 'Request finish reasons',
|
||||
queueTime: 'Mean queue time',
|
||||
averageGenerationTokens: 'Mean output tokens per request',
|
||||
prefixCacheHitRate: 'Prefix cache hit rate',
|
||||
distributionHelper:
|
||||
'Length distributions show request rates and are unaffected by the average/peak selection.',
|
||||
cleanHelper:
|
||||
'Clear monitoring history only for this vLLM instance? Other instances, host and GPU monitoring are unaffected.',
|
||||
overview: 'Overview',
|
||||
|
||||
@@ -1526,24 +1526,6 @@ const message = {
|
||||
extraHeaders: 'Encabezados adicionales',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/s',
|
||||
requestsPerSecond: 'Solicitudes/s',
|
||||
finishReasonLabels: {
|
||||
stop: 'Finalización normal',
|
||||
length: 'Límite de longitud alcanzado',
|
||||
abort: 'Cancelada',
|
||||
error: 'Error',
|
||||
repetition: 'Repetición',
|
||||
},
|
||||
requestAnalysis: 'Análisis de solicitudes',
|
||||
promptDistribution: 'Distribución de longitud de tokens de entrada',
|
||||
generationDistribution: 'Distribución de longitud de tokens de salida',
|
||||
finishReasons: 'Motivos de finalización de solicitudes',
|
||||
queueTime: 'Tiempo medio en cola',
|
||||
averageGenerationTokens: 'Tokens de salida medios por solicitud',
|
||||
prefixCacheHitRate: 'Tasa de aciertos de caché de prefijos',
|
||||
distributionHelper:
|
||||
'Las distribuciones de longitud muestran tasas de solicitudes y no cambian al seleccionar media o pico.',
|
||||
cleanHelper:
|
||||
'¿Borrar solo el historial de monitoreo de esta instancia de vLLM? No afecta a otras instancias ni al monitoreo del host o de GPU.',
|
||||
overview: 'Resumen',
|
||||
|
||||
@@ -1502,23 +1502,6 @@ const message = {
|
||||
extraHeaders: 'هدرهای اضافی',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/ثانیه',
|
||||
requestsPerSecond: 'درخواست/ثانیه',
|
||||
finishReasonLabels: {
|
||||
stop: 'پایان عادی',
|
||||
length: 'رسیدن به حد طول',
|
||||
abort: 'لغوشده',
|
||||
error: 'خطا',
|
||||
repetition: 'تکرار خروجی',
|
||||
},
|
||||
requestAnalysis: 'تحلیل درخواستها',
|
||||
promptDistribution: 'توزیع طول توکنهای ورودی',
|
||||
generationDistribution: 'توزیع طول توکنهای خروجی',
|
||||
finishReasons: 'دلایل پایان درخواستها',
|
||||
queueTime: 'میانگین زمان انتظار در صف',
|
||||
averageGenerationTokens: 'میانگین توکنهای خروجی هر درخواست',
|
||||
prefixCacheHitRate: 'نرخ اصابت حافظه نهان پیشوند',
|
||||
distributionHelper: 'توزیع طول، نرخ درخواستها را نشان میدهد و از انتخاب میانگین یا اوج تأثیر نمیپذیرد.',
|
||||
cleanHelper:
|
||||
'فقط سابقه نظارت این نمونه vLLM پاک شود؟ سایر نمونه\u200cها و نظارت میزبان و GPU تغییری نمی\u200cکنند.',
|
||||
overview: 'نمای کلی',
|
||||
|
||||
@@ -1505,23 +1505,6 @@ const message = {
|
||||
extraHeaders: '追加ヘッダー',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/秒',
|
||||
requestsPerSecond: 'リクエスト/秒',
|
||||
finishReasonLabels: {
|
||||
stop: '正常終了',
|
||||
length: '長さ上限に到達',
|
||||
abort: '中止',
|
||||
error: 'エラー',
|
||||
repetition: '繰り返し出力',
|
||||
},
|
||||
requestAnalysis: 'リクエスト分析',
|
||||
promptDistribution: '入力トークン長の分布',
|
||||
generationDistribution: '出力トークン長の分布',
|
||||
finishReasons: 'リクエスト終了理由',
|
||||
queueTime: '平均キュー待機時間',
|
||||
averageGenerationTokens: 'リクエストあたりの平均出力トークン数',
|
||||
prefixCacheHitRate: 'プレフィックスキャッシュヒット率',
|
||||
distributionHelper: '長さの分布はリクエストレートで集計され、平均/ピークの切り替えには影響されません。',
|
||||
cleanHelper:
|
||||
'この vLLM インスタンスの監視履歴のみを削除しますか?他のインスタンス、ホスト、GPU の監視には影響しません。',
|
||||
overview: '概要',
|
||||
|
||||
@@ -1490,23 +1490,6 @@ const message = {
|
||||
extraHeaders: '추가 헤더',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/초',
|
||||
requestsPerSecond: '요청/초',
|
||||
finishReasonLabels: {
|
||||
stop: '정상 종료',
|
||||
length: '길이 제한 도달',
|
||||
abort: '중단',
|
||||
error: '오류',
|
||||
repetition: '반복 출력',
|
||||
},
|
||||
requestAnalysis: '요청 분석',
|
||||
promptDistribution: '입력 토큰 길이 분포',
|
||||
generationDistribution: '출력 토큰 길이 분포',
|
||||
finishReasons: '요청 종료 사유',
|
||||
queueTime: '평균 대기 시간',
|
||||
averageGenerationTokens: '요청당 평균 출력 토큰 수',
|
||||
prefixCacheHitRate: '접두사 캐시 적중률',
|
||||
distributionHelper: '길이 분포는 요청 속도로 집계되며 평균/최댓값 선택의 영향을 받지 않습니다.',
|
||||
cleanHelper:
|
||||
'현재 vLLM 인스턴스의 모니터링 기록만 삭제하시겠습니까? 다른 인스턴스, 호스트 및 GPU 모니터링에는 영향을 주지 않습니다.',
|
||||
overview: '개요',
|
||||
|
||||
@@ -1484,23 +1484,6 @@ const message = {
|
||||
extraHeaders: 'Headers ເພີ່ມເຕີມ',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/ວິນາທີ',
|
||||
requestsPerSecond: 'ຄຳຮ້ອງຂໍ/ວິນາທີ',
|
||||
finishReasonLabels: {
|
||||
stop: 'ສຳເລັດປົກກະຕິ',
|
||||
length: 'ເຖິງຂີດຈຳກັດຄວາມຍາວ',
|
||||
abort: 'ຍົກເລີກ',
|
||||
error: 'ຂໍ້ຜິດພາດ',
|
||||
repetition: 'ຜົນອອກຊ້ຳ',
|
||||
},
|
||||
requestAnalysis: 'ການວິເຄາະຄຳຮ້ອງຂໍ',
|
||||
promptDistribution: 'ການແຈກຢາຍຄວາມຍາວໂທເຄັນຂາເຂົ້າ',
|
||||
generationDistribution: 'ການແຈກຢາຍຄວາມຍາວໂທເຄັນຂາອອກ',
|
||||
finishReasons: 'ເຫດຜົນທີ່ຄຳຮ້ອງຂໍສິ້ນສຸດ',
|
||||
queueTime: 'ເວລາລໍຖ້າໃນຄິວສະເລ່ຍ',
|
||||
averageGenerationTokens: 'ຈຳນວນໂທເຄັນຂາອອກສະເລ່ຍຕໍ່ຄຳຮ້ອງຂໍ',
|
||||
prefixCacheHitRate: 'ອັດຕາການພົບໃນແຄດຄຳນຳໜ້າ',
|
||||
distributionHelper: 'ການແຈກຢາຍຄວາມຍາວສະແດງອັດຕາຄຳຮ້ອງຂໍ ແລະ ບໍ່ປ່ຽນຕາມການເລືອກຄ່າສະເລ່ຍ ຫຼື ຄ່າສູງສຸດ.',
|
||||
cleanHelper: 'ລຶບສະເພາະປະຫວັດການຕິດຕາມຂອງ vLLM ນີ້ບໍ? ບໍ່ກະທົບຕໍ່ອິນສະແຕນອື່ນ, ໂຮສ ຫຼື GPU.',
|
||||
overview: 'ພາບລວມ',
|
||||
latencyAnalysis: 'ການວິເຄາະຄວາມລ່າຊ້າ',
|
||||
|
||||
@@ -1531,24 +1531,6 @@ const message = {
|
||||
extraHeaders: 'Pengepala Tambahan',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/s',
|
||||
requestsPerSecond: 'Permintaan/s',
|
||||
finishReasonLabels: {
|
||||
stop: 'Selesai secara normal',
|
||||
length: 'Had panjang dicapai',
|
||||
abort: 'Dibatalkan',
|
||||
error: 'Ralat',
|
||||
repetition: 'Pengulangan',
|
||||
},
|
||||
requestAnalysis: 'Analisis permintaan',
|
||||
promptDistribution: 'Taburan panjang token input',
|
||||
generationDistribution: 'Taburan panjang token output',
|
||||
finishReasons: 'Sebab permintaan tamat',
|
||||
queueTime: 'Purata masa dalam baris gilir',
|
||||
averageGenerationTokens: 'Purata token output setiap permintaan',
|
||||
prefixCacheHitRate: 'Kadar padanan cache awalan',
|
||||
distributionHelper:
|
||||
'Taburan panjang menunjukkan kadar permintaan dan tidak dipengaruhi oleh pilihan purata/puncak.',
|
||||
cleanHelper:
|
||||
'Padamkan sejarah pemantauan untuk instans vLLM ini sahaja? Instans lain serta pemantauan hos dan GPU tidak terjejas.',
|
||||
overview: 'Gambaran keseluruhan',
|
||||
|
||||
@@ -1527,24 +1527,6 @@ const message = {
|
||||
extraHeaders: 'Cabeçalhos extras',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/s',
|
||||
requestsPerSecond: 'Solicitações/s',
|
||||
finishReasonLabels: {
|
||||
stop: 'Conclusão normal',
|
||||
length: 'Limite de comprimento atingido',
|
||||
abort: 'Abortada',
|
||||
error: 'Erro',
|
||||
repetition: 'Repetição',
|
||||
},
|
||||
requestAnalysis: 'Análise de solicitações',
|
||||
promptDistribution: 'Distribuição do comprimento dos tokens de entrada',
|
||||
generationDistribution: 'Distribuição do comprimento dos tokens de saída',
|
||||
finishReasons: 'Motivos de conclusão das solicitações',
|
||||
queueTime: 'Tempo médio na fila',
|
||||
averageGenerationTokens: 'Média de tokens de saída por solicitação',
|
||||
prefixCacheHitRate: 'Taxa de acertos do cache de prefixos',
|
||||
distributionHelper:
|
||||
'As distribuições de comprimento mostram taxas de solicitações e não mudam com a seleção de média ou pico.',
|
||||
cleanHelper:
|
||||
'Limpar apenas o histórico de monitoramento desta instância do vLLM? Outras instâncias e o monitoramento do host e da GPU não serão afetados.',
|
||||
overview: 'Visão geral',
|
||||
|
||||
@@ -1520,24 +1520,6 @@ const message = {
|
||||
extraHeaders: 'Дополнительные заголовки',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/с',
|
||||
requestsPerSecond: 'Запросов/с',
|
||||
finishReasonLabels: {
|
||||
stop: 'Нормальное завершение',
|
||||
length: 'Достигнут лимит длины',
|
||||
abort: 'Прервано',
|
||||
error: 'Ошибка',
|
||||
repetition: 'Повторение',
|
||||
},
|
||||
requestAnalysis: 'Анализ запросов',
|
||||
promptDistribution: 'Распределение длины входных токенов',
|
||||
generationDistribution: 'Распределение длины выходных токенов',
|
||||
finishReasons: 'Причины завершения запросов',
|
||||
queueTime: 'Среднее время в очереди',
|
||||
averageGenerationTokens: 'Среднее число выходных токенов на запрос',
|
||||
prefixCacheHitRate: 'Доля попаданий в кэш префиксов',
|
||||
distributionHelper:
|
||||
'Распределения длины показывают частоту запросов и не зависят от выбора среднего или пикового значения.',
|
||||
cleanHelper:
|
||||
'Удалить историю мониторинга только этого экземпляра vLLM? Другие экземпляры, мониторинг хоста и GPU не будут затронуты.',
|
||||
overview: 'Обзор',
|
||||
|
||||
@@ -1527,23 +1527,6 @@ const message = {
|
||||
extraHeaders: 'Ek Başlıklar',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/sn',
|
||||
requestsPerSecond: 'İstek/sn',
|
||||
finishReasonLabels: {
|
||||
stop: 'Normal tamamlanma',
|
||||
length: 'Uzunluk sınırına ulaşıldı',
|
||||
abort: 'İptal edildi',
|
||||
error: 'Hata',
|
||||
repetition: 'Tekrarlama',
|
||||
},
|
||||
requestAnalysis: 'İstek analizi',
|
||||
promptDistribution: 'Girdi belirteci uzunluk dağılımı',
|
||||
generationDistribution: 'Çıktı belirteci uzunluk dağılımı',
|
||||
finishReasons: 'İstek bitiş nedenleri',
|
||||
queueTime: 'Ortalama kuyruk süresi',
|
||||
averageGenerationTokens: 'İstek başına ortalama çıktı belirteci',
|
||||
prefixCacheHitRate: 'Önek önbelleği isabet oranı',
|
||||
distributionHelper: 'Uzunluk dağılımları istek hızlarını gösterir ve ortalama/tepe seçiminden etkilenmez.',
|
||||
cleanHelper:
|
||||
'Yalnızca bu vLLM örneğinin izleme geçmişi temizlensin mi? Diğer örnekler, ana makine ve GPU izlemesi etkilenmez.',
|
||||
overview: 'Genel bakış',
|
||||
|
||||
@@ -1437,23 +1437,6 @@ const message = {
|
||||
extraHeaders: '額外請求標頭',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/秒',
|
||||
requestsPerSecond: '請求/秒',
|
||||
finishReasonLabels: {
|
||||
stop: '正常結束',
|
||||
length: '達到長度限制',
|
||||
abort: '中止',
|
||||
error: '錯誤',
|
||||
repetition: '重複輸出',
|
||||
},
|
||||
requestAnalysis: '請求分析',
|
||||
promptDistribution: '輸入 Token 長度分佈',
|
||||
generationDistribution: '輸出 Token 長度分佈',
|
||||
finishReasons: '請求結束原因',
|
||||
queueTime: '平均排隊耗時',
|
||||
averageGenerationTokens: '每請求平均輸出 Token 數',
|
||||
prefixCacheHitRate: '前綴快取命中率',
|
||||
distributionHelper: '長度分佈按請求速率彙總,不受平均/峰值切換影響。',
|
||||
cleanHelper: '僅清空目前 vLLM 實例的監控歷史,不影響其他實例、主機或 GPU 監控,是否繼續?',
|
||||
overview: '概覽',
|
||||
latencyAnalysis: '延遲分析',
|
||||
|
||||
@@ -1450,23 +1450,6 @@ const message = {
|
||||
extraHeaders: '额外请求头',
|
||||
},
|
||||
vllmMonitor: {
|
||||
tokensPerSecond: 'tokens/秒',
|
||||
requestsPerSecond: '请求/秒',
|
||||
finishReasonLabels: {
|
||||
stop: '正常结束',
|
||||
length: '达到长度限制',
|
||||
abort: '中止',
|
||||
error: '错误',
|
||||
repetition: '重复输出',
|
||||
},
|
||||
requestAnalysis: '请求分析',
|
||||
promptDistribution: '输入 Token 长度分布',
|
||||
generationDistribution: '输出 Token 长度分布',
|
||||
finishReasons: '请求结束原因',
|
||||
queueTime: '平均排队耗时',
|
||||
averageGenerationTokens: '每请求平均输出 Token 数',
|
||||
prefixCacheHitRate: '前缀缓存命中率',
|
||||
distributionHelper: '长度分布按请求速率汇总,不受平均/峰值切换影响。',
|
||||
cleanHelper: '仅清空当前 vLLM 实例的监控历史,不影响其他实例、主机或 GPU 监控,是否继续?',
|
||||
overview: '概览',
|
||||
latencyAnalysis: '延迟分析',
|
||||
|
||||
@@ -551,8 +551,7 @@ const welcomeOpen = ref();
|
||||
const shadowContainer = ref();
|
||||
|
||||
const chartOption = ref('network');
|
||||
let timer: ReturnType<typeof setInterval> | null = null;
|
||||
let initialSampleTimer: ReturnType<typeof setTimeout> | null = null;
|
||||
let timer: NodeJS.Timer | null = null;
|
||||
let isInit = ref<boolean>(true);
|
||||
let isStatusInit = ref<boolean>(true);
|
||||
let isActive = ref(true);
|
||||
@@ -796,16 +795,14 @@ const onLoadBaseInfo = async (isInit: boolean, range: string) => {
|
||||
const res = await loadBaseInfo(searchInfo.ioOption, searchInfo.netOption);
|
||||
baseInfo.value = res.data;
|
||||
updateCurrentInfo(baseInfo.value.currentInfo);
|
||||
skipNextCurrentInfoDelta.value = !isInit;
|
||||
if (!isInit) {
|
||||
onLoadCurrentInfo();
|
||||
}
|
||||
skipNextCurrentInfoDelta.value = true;
|
||||
onLoadCurrentInfo();
|
||||
isStatusInit.value = false;
|
||||
statusRef.value?.acceptParams(currentInfo.value, baseInfo.value);
|
||||
appRef.value?.acceptParams();
|
||||
if (isInit && isCurrentActive.value) {
|
||||
if (isInit) {
|
||||
clearTimer();
|
||||
const refreshCurrentInfo = async () => {
|
||||
timer = setInterval(async () => {
|
||||
try {
|
||||
if (!isCurrentActive.value) {
|
||||
throw new Error('jump out');
|
||||
@@ -817,9 +814,7 @@ const onLoadBaseInfo = async (isInit: boolean, range: string) => {
|
||||
} catch {
|
||||
clearTimer();
|
||||
}
|
||||
};
|
||||
initialSampleTimer = setTimeout(refreshCurrentInfo, 500);
|
||||
timer = setInterval(refreshCurrentInfo, 3000);
|
||||
}, 3000);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -855,9 +850,7 @@ const jumpPanel = (row: any) => {
|
||||
|
||||
const onLoadCurrentInfo = async () => {
|
||||
const res = await loadCurrentInfo(searchInfo.ioOption, searchInfo.netOption);
|
||||
const timeInterval =
|
||||
(new Date(res.data.shotTime).getTime() - new Date(currentInfo.value.shotTime).getTime()) / 1000;
|
||||
if (skipNextCurrentInfoDelta.value || !Number.isFinite(timeInterval) || timeInterval <= 0) {
|
||||
if (skipNextCurrentInfoDelta.value) {
|
||||
skipNextCurrentInfoDelta.value = false;
|
||||
currentChartInfo.netBytesSent = 0;
|
||||
currentChartInfo.netBytesRecv = 0;
|
||||
@@ -873,6 +866,7 @@ const onLoadCurrentInfo = async () => {
|
||||
currentInfo.value.timeSinceUptime = res.data.timeSinceUptime;
|
||||
currentInfo.value.runningTime = res.data.runningTime;
|
||||
|
||||
let timeInterval = Number(res.data.uptime - currentInfo.value.uptime) || 3;
|
||||
currentChartInfo.netBytesSent =
|
||||
res.data.netBytesSent - currentInfo.value.netBytesSent > 0
|
||||
? Number(((res.data.netBytesSent - currentInfo.value.netBytesSent) / 1024 / timeInterval).toFixed(2))
|
||||
@@ -1152,8 +1146,6 @@ onBeforeRouteUpdate((to, from, next) => {
|
||||
const clearTimer = () => {
|
||||
clearInterval(Number(timer));
|
||||
timer = null;
|
||||
clearTimeout(Number(initialSampleTimer));
|
||||
initialSampleTimer = null;
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
@@ -110,21 +110,6 @@
|
||||
<el-input v-model.trim="account.authorization['token']"></el-input>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div v-if="account.type === 'Netcup'">
|
||||
<el-form-item label="Customer Number" prop="authorization.customerNumber">
|
||||
<el-input v-model.trim="account.authorization['customerNumber']"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="API Key" prop="authorization.apiKey">
|
||||
<el-input v-model.trim="account.authorization['apiKey']"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="API Password" prop="authorization.password">
|
||||
<el-input
|
||||
v-model.trim="account.authorization['password']"
|
||||
type="password"
|
||||
show-password
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div
|
||||
v-if="account.type === 'FreeMyIP' || account.type === 'Vercel' || account.type === 'IonosCloud'"
|
||||
>
|
||||
@@ -260,7 +245,6 @@ const rules = ref<any>({
|
||||
apiPrefix: [Rules.requiredInput],
|
||||
username: [Rules.requiredInput],
|
||||
password: [Rules.requiredInput],
|
||||
customerNumber: [Rules.requiredInput],
|
||||
},
|
||||
});
|
||||
const account = ref({
|
||||
|
||||
Reference in New Issue
Block a user