From 43942a9dae90d7de9cbe243bf26cc7ef494520ae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 12:39:27 +0000 Subject: [PATCH 1/2] chore(deps): update dependency js-yaml to v4.3.2 [security] --- package-lock.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6838ff0..ce469b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -732,9 +732,19 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" From 3dd4b3763434f52abc60dc017276828601a3c9b6 Mon Sep 17 00:00:00 2001 From: Michael D'Angelo Date: Thu, 17 Sep 2026 14:37:04 +0000 Subject: [PATCH 2/2] fix(deps): require patched js-yaml and verify model configuration --- package-lock.json | 2 +- package.json | 2 +- test/litellm-config.test.cjs | 58 ++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 test/litellm-config.test.cjs diff --git a/package-lock.json b/package-lock.json index ce469b0..a8c0799 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@types/jsonwebtoken": "^9.0.10", "dotenv": "^17.0.0", "express": "^5.0.0", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.2", "jsonwebtoken": "^9.0.2", "zod": "^4.0.0" }, diff --git a/package.json b/package.json index d217b10..c6ec010 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "@types/jsonwebtoken": "^9.0.10", "dotenv": "^17.0.0", "express": "^5.0.0", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.2", "jsonwebtoken": "^9.0.2", "zod": "^4.0.0" }, diff --git a/test/litellm-config.test.cjs b/test/litellm-config.test.cjs new file mode 100644 index 0000000..622b60d --- /dev/null +++ b/test/litellm-config.test.cjs @@ -0,0 +1,58 @@ +const assert = require('node:assert/strict'); +const { mkdtempSync, writeFileSync, rmSync } = require('node:fs'); +const { tmpdir } = require('node:os'); +const path = require('node:path'); +const { test } = require('node:test'); + +const modulePath = require.resolve('../dist/utils/litellm-config'); + +function withConfig(source, check) { + const previousDirectory = process.cwd(); + const directory = mkdtempSync(path.join(tmpdir(), 'example-app-yaml-')); + try { + writeFileSync(path.join(directory, 'litellm_config.yaml'), source); + process.chdir(directory); + delete require.cache[modulePath]; + check(require(modulePath), directory); + } finally { + process.chdir(previousDirectory); + delete require.cache[modulePath]; + rmSync(directory, { recursive: true }); + } +} + +test('reads the repository model allowlist with the upgraded YAML parser', () => { + delete require.cache[modulePath]; + const config = require(modulePath); + try { + assert.deepEqual(config.getAllowedModels(), ['gpt-5-mini', 'claude-3-5-haiku-latest']); + assert.equal(config.isModelAllowed('gpt-5-mini'), true); + assert.equal(config.isModelAllowed('not-configured'), false); + } finally { + delete require.cache[modulePath]; + } +}); + +test('supports ordinary YAML aliases and fallback model names', () => { + withConfig(`defaults: &defaults + model: local-fallback +model_list: + - model_name: model_1000 + litellm_params: {model: local-primary} + - litellm_params: {<<: *defaults} +`, (config) => { + assert.deepEqual(config.getAllowedModels(), ['model_1000', 'local-fallback']); + assert.equal(config.isModelAllowed('local-fallback'), true); + assert.equal(config.isModelAllowed('local-primary'), false); + }); +}); + +test('preserves the cached allowlist when the configuration file changes', () => { + withConfig('model_list: [{model_name: local-first}]\n', (config, directory) => { + assert.deepEqual(config.getAllowedModels(), ['local-first']); + writeFileSync(path.join(directory, 'litellm_config.yaml'), 'model_list: [{model_name: local-second}]\n'); + assert.deepEqual(config.getAllowedModels(), ['local-first']); + assert.equal(config.isModelAllowed('local-first'), true); + assert.equal(config.isModelAllowed('local-second'), false); + }); +});