Skip to content

Commit 213273d

Browse files
authored
Merge pull request #695 from elentaure/allowed-models-plugin
[New plugin] Simple plugin to allow whitelisting models as a guardrail
2 parents 5a10a72 + 3c1f16d commit 213273d

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed

plugins/default/default.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { handler as logHandler } from './log';
1010
import { handler as allUppercaseHandler } from './alluppercase';
1111
import { handler as endsWithHandler } from './endsWith';
1212
import { handler as allLowerCaseHandler } from './alllowercase';
13+
import { handler as modelWhitelistHandler } from './modelWhitelist';
1314

1415
import { z } from 'zod';
1516
import { PluginContext, PluginParameters } from '../types';
@@ -802,3 +803,36 @@ describe('allLowercase handler', () => {
802803
expect(result.verdict).toBe(false);
803804
});
804805
});
806+
807+
describe('modelWhitelist handler', () => {
808+
it('should return true verdict when the model requested is part of the whitelist', async () => {
809+
const context: PluginContext = {
810+
request: { json: { model: 'gemini-1.5-flash-001' } },
811+
};
812+
813+
const parameters: PluginParameters = {
814+
models: ['gemini-1.5-flash-001'],
815+
};
816+
const eventType = 'beforeRequestHook';
817+
818+
const result = await modelWhitelistHandler(context, parameters, eventType);
819+
820+
expect(result.error).toBe(null);
821+
expect(result.verdict).toBe(true);
822+
});
823+
it('should return false verdict when the model requested is not part of the whitelist', async () => {
824+
const context: PluginContext = {
825+
request: { json: { model: 'gemini-1.5-pro-001' } },
826+
};
827+
828+
const parameters: PluginParameters = {
829+
models: ['gemini-1.5-flash-001'],
830+
};
831+
const eventType = 'beforeRequestHook';
832+
833+
const result = await modelWhitelistHandler(context, parameters, eventType);
834+
835+
expect(result.error).toBe(null);
836+
expect(result.verdict).toBe(false);
837+
});
838+
});

plugins/default/manifest.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,37 @@
475475
}
476476
],
477477
"parameters": {}
478+
},
479+
{
480+
"name": "Model whitelisting",
481+
"id": "modelwhitelist",
482+
"type": "guardrail",
483+
"supportedHooks": ["beforeRequestHook"],
484+
"description": [
485+
{
486+
"type": "subHeading",
487+
"text": "Check if the model in the request is part of the allowed model list."
488+
}
489+
],
490+
"parameters": {
491+
"type": "object",
492+
"properties": {
493+
"models": {
494+
"type": "array",
495+
"label": "Model list",
496+
"description": [
497+
{
498+
"type": "subHeading",
499+
"text": "Enter the allowed models."
500+
}
501+
],
502+
"items": {
503+
"type": "string"
504+
}
505+
}
506+
},
507+
"required": ["models"]
508+
}
478509
}
479510
]
480511
}

plugins/default/modelWhitelist.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {
2+
HookEventType,
3+
PluginContext,
4+
PluginHandler,
5+
PluginParameters,
6+
} from '../types';
7+
8+
export const handler: PluginHandler = async (
9+
context: PluginContext,
10+
parameters: PluginParameters,
11+
eventType: HookEventType
12+
) => {
13+
let error = null;
14+
let verdict = false;
15+
16+
try {
17+
const modelList = parameters.models;
18+
let requestModel = context.request?.json.model;
19+
verdict = modelList.includes(requestModel);
20+
} catch (e) {
21+
error = e as Error;
22+
}
23+
24+
return { error, verdict };
25+
};

plugins/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { handler as defaultcontainsCode } from './default/containsCode';
1212
import { handler as defaultalluppercase } from './default/alluppercase';
1313
import { handler as defaultalllowercase } from './default/alllowercase';
1414
import { handler as defaultendsWith } from './default/endsWith';
15+
import { handler as defaultmodelWhitelist } from './default/modelWhitelist';
1516
import { handler as portkeymoderateContent } from './portkey/moderateContent';
1617
import { handler as portkeylanguage } from './portkey/language';
1718
import { handler as portkeypii } from './portkey/pii';
@@ -48,6 +49,7 @@ export const plugins = {
4849
alluppercase: defaultalluppercase,
4950
alllowercase: defaultalllowercase,
5051
endsWith: defaultendsWith,
52+
modelWhitelist: defaultmodelWhitelist,
5153
},
5254
portkey: {
5355
moderateContent: portkeymoderateContent,

0 commit comments

Comments
 (0)