📌 fix: Preserve Project Scope Through Enforced Model Specs (#13586)

This commit is contained in:
Danny Avila 2026-06-08 08:41:27 -04:00 • committed by GitHub
parent 209e8d1eb6
commit 4b699fb60f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 56 additions and 6 deletions

View file

@ -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>();

View file

@ -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', () => {