@acarmisc/backstage-plugin-litellm 0.18.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SearchInput.d.ts +1 -0
- package/dist/components/SearchInput.d.ts +9 -0
- package/dist/index.cjs.js +36 -13
- package/dist/index.cjs.js.map +3 -3
- package/dist/index.esm.js +30 -7
- package/dist/index.esm.js.map +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface SearchInputProps {
|
|
3
|
+
label?: string;
|
|
4
|
+
onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
5
|
+
value: string;
|
|
6
|
+
onInputChange?: (value: string) => void;
|
|
7
|
+
}
|
|
8
|
+
declare const SearchInput: React.FC<SearchInputProps>;
|
|
9
|
+
export default SearchInput;
|
package/dist/index.cjs.js
CHANGED
|
@@ -3007,7 +3007,7 @@ function fmtTokens(n) {
|
|
|
3007
3007
|
if (n >= 1e3) return `${(n / 1e3).toFixed(0)}K`;
|
|
3008
3008
|
return String(n);
|
|
3009
3009
|
}
|
|
3010
|
-
var import_react8, import_Box8, import_Table5, import_TableBody5, import_TableCell5, import_TableContainer5, import_TableHead5, import_TableRow5, import_Typography8, import_MenuItem4, import_Select, import_FormControl, import_InputLabel, import_ContentCopy, import_Tooltip, import_Snackbar, import_Alert3, import_styles5, ALL_PROXY_MODELS2, ModelsTable;
|
|
3010
|
+
var import_react8, import_Box8, import_Table5, import_TableBody5, import_TableCell5, import_TableContainer5, import_TableHead5, import_TableRow5, import_Typography8, import_MenuItem4, import_Select, import_FormControl, import_InputLabel, import_ContentCopy, import_Tooltip, import_Snackbar, import_Alert3, import_styles5, import_TextField5, import_InputAdornment2, import_icons_material6, ALL_PROXY_MODELS2, ModelsTable;
|
|
3011
3011
|
var init_ModelsTable = __esm({
|
|
3012
3012
|
"src/components/ModelsTable.tsx"() {
|
|
3013
3013
|
"use strict";
|
|
@@ -3030,10 +3030,14 @@ var init_ModelsTable = __esm({
|
|
|
3030
3030
|
import_Alert3 = __toESM(require("@mui/material/Alert"));
|
|
3031
3031
|
init_ui();
|
|
3032
3032
|
import_styles5 = require("@mui/material/styles");
|
|
3033
|
+
import_TextField5 = __toESM(require("@mui/material/TextField"));
|
|
3034
|
+
import_InputAdornment2 = __toESM(require("@mui/material/InputAdornment"));
|
|
3035
|
+
import_icons_material6 = require("@mui/icons-material");
|
|
3033
3036
|
ALL_PROXY_MODELS2 = "all-proxy-models";
|
|
3034
3037
|
ModelsTable = ({ allModels, teams, loading }) => {
|
|
3035
3038
|
const theme = (0, import_styles5.useTheme)();
|
|
3036
3039
|
const [selectedTeamId, setSelectedTeamId] = (0, import_react8.useState)("");
|
|
3040
|
+
const [filterText, setFilterText] = (0, import_react8.useState)("");
|
|
3037
3041
|
const [copiedSnackbar, setCopiedSnackbar] = (0, import_react8.useState)(false);
|
|
3038
3042
|
const selectedTeam = (0, import_react8.useMemo)(
|
|
3039
3043
|
() => teams.find((t) => t.team_id === selectedTeamId) ?? null,
|
|
@@ -3041,8 +3045,15 @@ var init_ModelsTable = __esm({
|
|
|
3041
3045
|
);
|
|
3042
3046
|
const filteredModels = (0, import_react8.useMemo)(() => {
|
|
3043
3047
|
if (!selectedTeam) return [];
|
|
3044
|
-
|
|
3045
|
-
|
|
3048
|
+
let result = allModels.filter((model) => isModelAllowedByTeam2(model, selectedTeam.models));
|
|
3049
|
+
if (filterText.trim()) {
|
|
3050
|
+
const q = filterText.toLowerCase();
|
|
3051
|
+
result = result.filter(
|
|
3052
|
+
(model) => model.model_name.toLowerCase().includes(q) || (model.access_groups || []).some((group) => group.toLowerCase().includes(q))
|
|
3053
|
+
);
|
|
3054
|
+
}
|
|
3055
|
+
return result;
|
|
3056
|
+
}, [allModels, selectedTeam, filterText]);
|
|
3046
3057
|
const handleCopyModelId = (0, import_react8.useCallback)((modelId) => {
|
|
3047
3058
|
navigator.clipboard.writeText(modelId).then(() => setCopiedSnackbar(true));
|
|
3048
3059
|
}, []);
|
|
@@ -3075,7 +3086,19 @@ var init_ModelsTable = __esm({
|
|
|
3075
3086
|
onChange: (e) => setSelectedTeamId(e.target.value)
|
|
3076
3087
|
},
|
|
3077
3088
|
teams.map((t) => /* @__PURE__ */ import_react8.default.createElement(import_MenuItem4.default, { key: t.team_id, value: t.team_id }, t.team_alias ?? t.team_id))
|
|
3078
|
-
))
|
|
3089
|
+
)), /* @__PURE__ */ import_react8.default.createElement(
|
|
3090
|
+
import_TextField5.default,
|
|
3091
|
+
{
|
|
3092
|
+
label: "Filter Models",
|
|
3093
|
+
size: "small",
|
|
3094
|
+
value: filterText,
|
|
3095
|
+
onChange: (e) => setFilterText(e.target.value),
|
|
3096
|
+
sx: { minWidth: 240, mb: 2 },
|
|
3097
|
+
InputProps: {
|
|
3098
|
+
startAdornment: /* @__PURE__ */ import_react8.default.createElement(import_InputAdornment2.default, { position: "start" }, /* @__PURE__ */ import_react8.default.createElement(import_icons_material6.Search, { fontSize: "small" }))
|
|
3099
|
+
}
|
|
3100
|
+
}
|
|
3101
|
+
)),
|
|
3079
3102
|
loading && /* @__PURE__ */ import_react8.default.createElement(EmptyState, { message: "Loading models\u2026" }),
|
|
3080
3103
|
!loading && !selectedTeamId && /* @__PURE__ */ import_react8.default.createElement(
|
|
3081
3104
|
EmptyState,
|
|
@@ -3170,7 +3193,7 @@ function renderAuditLogBody(loading, entries) {
|
|
|
3170
3193
|
}
|
|
3171
3194
|
return entries.map((entry) => /* @__PURE__ */ import_react9.default.createElement(DetailRow, { key: entry.id, entry }));
|
|
3172
3195
|
}
|
|
3173
|
-
var import_react9, import_Box9, import_Typography9, import_Table6, import_TableBody6, import_TableCell6, import_TableContainer6, import_TableHead6, import_TableRow6, import_TablePagination,
|
|
3196
|
+
var import_react9, import_Box9, import_Typography9, import_Table6, import_TableBody6, import_TableCell6, import_TableContainer6, import_TableHead6, import_TableRow6, import_TablePagination, import_TextField6, import_MenuItem5, import_Skeleton5, import_Collapse2, import_IconButton5, import_Alert4, import_styles6, import_icons_material7, import_react_use2, ACTION_TONES, TABLE_LABELS, DetailRow, AuditLog;
|
|
3174
3197
|
var init_AuditLog = __esm({
|
|
3175
3198
|
"src/components/AuditLog.tsx"() {
|
|
3176
3199
|
"use strict";
|
|
@@ -3184,14 +3207,14 @@ var init_AuditLog = __esm({
|
|
|
3184
3207
|
import_TableHead6 = __toESM(require("@mui/material/TableHead"));
|
|
3185
3208
|
import_TableRow6 = __toESM(require("@mui/material/TableRow"));
|
|
3186
3209
|
import_TablePagination = __toESM(require("@mui/material/TablePagination"));
|
|
3187
|
-
|
|
3210
|
+
import_TextField6 = __toESM(require("@mui/material/TextField"));
|
|
3188
3211
|
import_MenuItem5 = __toESM(require("@mui/material/MenuItem"));
|
|
3189
3212
|
import_Skeleton5 = __toESM(require("@mui/material/Skeleton"));
|
|
3190
3213
|
import_Collapse2 = __toESM(require("@mui/material/Collapse"));
|
|
3191
3214
|
import_IconButton5 = __toESM(require("@mui/material/IconButton"));
|
|
3192
3215
|
import_Alert4 = __toESM(require("@mui/material/Alert"));
|
|
3193
3216
|
import_styles6 = require("@mui/material/styles");
|
|
3194
|
-
|
|
3217
|
+
import_icons_material7 = require("@mui/icons-material");
|
|
3195
3218
|
import_react_use2 = require("react-use");
|
|
3196
3219
|
init_ui();
|
|
3197
3220
|
ACTION_TONES = {
|
|
@@ -3224,7 +3247,7 @@ var init_AuditLog = __esm({
|
|
|
3224
3247
|
transition: theme.transitions.create("transform")
|
|
3225
3248
|
})
|
|
3226
3249
|
},
|
|
3227
|
-
/* @__PURE__ */ import_react9.default.createElement(
|
|
3250
|
+
/* @__PURE__ */ import_react9.default.createElement(import_icons_material7.KeyboardArrowDown, { fontSize: "small" })
|
|
3228
3251
|
)), /* @__PURE__ */ import_react9.default.createElement(import_TableCell6.default, { sx: { whiteSpace: "nowrap" } }, /* @__PURE__ */ import_react9.default.createElement(import_Typography9.default, { variant: "body2", color: "text.secondary" }, formatDateTime(entry.updated_at))), /* @__PURE__ */ import_react9.default.createElement(import_TableCell6.default, null, entry.action && /* @__PURE__ */ import_react9.default.createElement(StatusPill, { label: entry.action, tone: actionTone(entry.action) })), /* @__PURE__ */ import_react9.default.createElement(import_TableCell6.default, null, /* @__PURE__ */ import_react9.default.createElement(import_Typography9.default, { variant: "body2" }, prettyTableName(entry.table_name))), /* @__PURE__ */ import_react9.default.createElement(import_TableCell6.default, null, /* @__PURE__ */ import_react9.default.createElement(
|
|
3229
3252
|
import_Typography9.default,
|
|
3230
3253
|
{
|
|
@@ -3293,7 +3316,7 @@ var init_AuditLog = __esm({
|
|
|
3293
3316
|
subtitle: loading ? "Loading\u2026" : `${total.toLocaleString()} event${total === 1 ? "" : "s"}`,
|
|
3294
3317
|
flush: true,
|
|
3295
3318
|
actions: /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement(
|
|
3296
|
-
|
|
3319
|
+
import_TextField6.default,
|
|
3297
3320
|
{
|
|
3298
3321
|
size: "small",
|
|
3299
3322
|
label: "Action",
|
|
@@ -3311,7 +3334,7 @@ var init_AuditLog = __esm({
|
|
|
3311
3334
|
/* @__PURE__ */ import_react9.default.createElement(import_MenuItem5.default, { value: "deleted" }, "Deleted"),
|
|
3312
3335
|
/* @__PURE__ */ import_react9.default.createElement(import_MenuItem5.default, { value: "blocked" }, "Blocked")
|
|
3313
3336
|
), /* @__PURE__ */ import_react9.default.createElement(
|
|
3314
|
-
|
|
3337
|
+
import_TextField6.default,
|
|
3315
3338
|
{
|
|
3316
3339
|
size: "small",
|
|
3317
3340
|
label: "Table",
|
|
@@ -3330,7 +3353,7 @@ var init_AuditLog = __esm({
|
|
|
3330
3353
|
/* @__PURE__ */ import_react9.default.createElement(import_MenuItem5.default, { value: "LiteLLM_ObjectPermissionTable" }, "Team access (KB / MCP)"),
|
|
3331
3354
|
/* @__PURE__ */ import_react9.default.createElement(import_MenuItem5.default, { value: "LiteLLM_UserTable" }, "User")
|
|
3332
3355
|
), /* @__PURE__ */ import_react9.default.createElement(
|
|
3333
|
-
|
|
3356
|
+
import_TextField6.default,
|
|
3334
3357
|
{
|
|
3335
3358
|
size: "small",
|
|
3336
3359
|
label: "Changed by",
|
|
@@ -3849,7 +3872,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
3849
3872
|
|
|
3850
3873
|
// src/plugin.tsx
|
|
3851
3874
|
var import_react11 = __toESM(require("react"));
|
|
3852
|
-
var
|
|
3875
|
+
var import_icons_material8 = require("@mui/icons-material");
|
|
3853
3876
|
var import_frontend_plugin_api = require("@backstage/frontend-plugin-api");
|
|
3854
3877
|
init_api();
|
|
3855
3878
|
var liteLlmApi = import_frontend_plugin_api.ApiBlueprint.make({
|
|
@@ -3863,7 +3886,7 @@ var liteLlmPage = import_frontend_plugin_api.PageBlueprint.make({
|
|
|
3863
3886
|
params: {
|
|
3864
3887
|
path: "/litellm",
|
|
3865
3888
|
title: "LiteLLM",
|
|
3866
|
-
icon: /* @__PURE__ */ import_react11.default.createElement(
|
|
3889
|
+
icon: /* @__PURE__ */ import_react11.default.createElement(import_icons_material8.TrendingUp, null),
|
|
3867
3890
|
loader: async () => {
|
|
3868
3891
|
const { LiteLLMPage: LiteLLMPage2 } = await Promise.resolve().then(() => (init_LiteLLMPage(), LiteLLMPage_exports));
|
|
3869
3892
|
return /* @__PURE__ */ import_react11.default.createElement(LiteLLMPage2, null);
|