@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.
@@ -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
- return allModels.filter((model) => isModelAllowedByTeam2(model, selectedTeam.models));
3045
- }, [allModels, selectedTeam]);
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, import_TextField5, import_MenuItem5, import_Skeleton5, import_Collapse2, import_IconButton5, import_Alert4, import_styles6, import_icons_material6, import_react_use2, ACTION_TONES, TABLE_LABELS, DetailRow, AuditLog;
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
- import_TextField5 = __toESM(require("@mui/material/TextField"));
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
- import_icons_material6 = require("@mui/icons-material");
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(import_icons_material6.KeyboardArrowDown, { fontSize: "small" })
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
- import_TextField5.default,
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
- import_TextField5.default,
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
- import_TextField5.default,
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 import_icons_material7 = require("@mui/icons-material");
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(import_icons_material7.TrendingUp, null),
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);