mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-10-08 22:41:38 +00:00
📌 fix: Preserve Project Scope Through Enforced Model Specs (#13586)
This commit is contained in:
parent
209e8d1eb6
commit
4b699fb60f
7 changed files with 56 additions and 6 deletions
|
|
@ -23,6 +23,10 @@ export type PrivateModelSpecPresetField = (typeof PRIVATE_MODEL_SPEC_PRESET_FIEL
|
|||
export type ModelSpecParsedBody = Partial<TConversation | TPreset | TModelSpecPreset> &
|
||||
Record<string, unknown>;
|
||||
|
||||
export const ENFORCED_MODEL_SPEC_REQUEST_FIELDS = [
|
||||
'chatProjectId',
|
||||
] as const satisfies readonly (keyof ModelSpecParsedBody)[];
|
||||
|
||||
export type ApplyModelSpecPresetParams = {
|
||||
modelSpec: TModelSpec;
|
||||
parsedBody: ModelSpecParsedBody;
|
||||
|
|
@ -57,15 +61,30 @@ function hasModelSpecValue(field: PrivateModelSpecPresetField, value: unknown):
|
|||
return value.length > 0;
|
||||
}
|
||||
|
||||
function pickEnforcedModelSpecRequestFields(parsedBody: ModelSpecParsedBody): ModelSpecParsedBody {
|
||||
const requestFields: ModelSpecParsedBody = {};
|
||||
|
||||
for (const field of ENFORCED_MODEL_SPEC_REQUEST_FIELDS) {
|
||||
if (parsedBody[field] !== undefined) {
|
||||
requestFields[field] = parsedBody[field];
|
||||
}
|
||||
}
|
||||
|
||||
return requestFields;
|
||||
}
|
||||
|
||||
function mergeModelSpecPreset(
|
||||
modelSpec: TModelSpec,
|
||||
parsedBody: ModelSpecParsedBody,
|
||||
{ includePresetDefaults = false }: Pick<ApplyModelSpecPresetParams, 'includePresetDefaults'> = {},
|
||||
): ApplyModelSpecPresetResult {
|
||||
const preset = modelSpec.preset;
|
||||
const requestFields = includePresetDefaults
|
||||
? pickEnforcedModelSpecRequestFields(parsedBody)
|
||||
: parsedBody;
|
||||
const merged = {
|
||||
...requestFields,
|
||||
...(includePresetDefaults ? preset : {}),
|
||||
...parsedBody,
|
||||
spec: modelSpec.name,
|
||||
} as ModelSpecParsedBody;
|
||||
const appliedPrivateFields = new Set<PrivateModelSpecPresetField>();
|
||||
|
|
|
|||
|
|
@ -92,14 +92,24 @@ describe('modelSpecs helpers', () => {
|
|||
|
||||
const { parsedBody } = applyModelSpecPreset({
|
||||
modelSpec,
|
||||
parsedBody: modelSpec.preset,
|
||||
parsedBody: {
|
||||
endpoint: EModelEndpoint.openAI,
|
||||
spec: 'enforced-openai',
|
||||
model: 'client-model',
|
||||
temperature: 0.8,
|
||||
topP: 0.9,
|
||||
chatProjectId: 'project-1',
|
||||
},
|
||||
endpoint: EModelEndpoint.openAI,
|
||||
includePresetDefaults: true,
|
||||
});
|
||||
|
||||
expect(parsedBody.spec).toBe('enforced-openai');
|
||||
expect(parsedBody.model).toBe('gpt-4o');
|
||||
expect(parsedBody.promptPrefix).toBe('private prompt prefix');
|
||||
expect(parsedBody.temperature).toBe(0.2);
|
||||
expect(parsedBody.topP).toBeUndefined();
|
||||
expect(parsedBody.chatProjectId).toBe('project-1');
|
||||
});
|
||||
|
||||
it('should restore private examples when parser supplies an empty default', () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue