Skip to content

Commit 55d420a

Browse files
committed
update to match copilot extension mimetype and data schema
1 parent 9c7c295 commit 55d420a

File tree

3 files changed

+22
-33
lines changed

3 files changed

+22
-33
lines changed

extensions/positron-assistant/src/anthropic.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -498,10 +498,7 @@ function withCacheControl<T extends CacheControllableBlockParam>(
498498
log.debug(`[anthropic] Adding cache breakpoint to ${part.type} part. Source: ${source}`);
499499
return {
500500
...part,
501-
// Pass the data through without validation, let the Anthropic API handle errors.
502-
cache_control: {
503-
type: cachBreakpoint.type,
504-
},
501+
cache_control: cachBreakpoint,
505502
};
506503
} catch (error) {
507504
log.error(`[anthropic] Failed to parse cache breakpoint: ${error}`);

extensions/positron-assistant/src/types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,12 @@ export enum PositronAssistantToolName {
2323
export enum LanguageModelDataPartMimeType {
2424
/**
2525
* Defines a cache breakpoint (e.g. for Anthropic's manual prompt caching).
26+
*
27+
* By matching the Copilot extension, other extensions that use models from either Copilot
28+
* or Positron Assistant can set cache breakpoints with the same mime type.
29+
* See: https://github.com/microsoft/vscode-copilot-chat/blob/6aeac371813be9037e74395186ec5b5b94089245/src/platform/endpoint/common/endpointTypes.ts#L7
2630
*/
27-
CacheBreakpoint = 'application/cache-control+json',
31+
CacheControl = 'cache_control',
2832
}
2933

3034
/**

extensions/positron-assistant/src/utils.ts

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,9 @@ export function isWorkspaceOpen(): boolean {
403403
/**
404404
* Checks if a given language model part defines a cache breakpoint.
405405
*/
406-
export function isCacheBreakpointPart(part: unknown): part is vscode.LanguageModelDataPart & { mimeType: LanguageModelDataPartMimeType.CacheBreakpoint } {
407-
return (part instanceof vscode.LanguageModelDataPart) &&
408-
part.mimeType === LanguageModelDataPartMimeType.CacheBreakpoint;
406+
export function isCacheBreakpointPart(part: unknown): part is vscode.LanguageModelDataPart & { mimeType: LanguageModelDataPartMimeType.CacheControl } {
407+
return part instanceof vscode.LanguageModelDataPart &&
408+
part.mimeType === LanguageModelDataPartMimeType.CacheControl;
409409
}
410410

411411
/**
@@ -417,40 +417,28 @@ export function isCacheBreakpointPart(part: unknown): part is vscode.LanguageMod
417417
* or if the parsed data does not match the expected schema.
418418
*/
419419
export function parseCacheBreakpoint(part: vscode.LanguageModelDataPart): LanguageModelCacheBreakpoint {
420-
if (part.mimeType !== LanguageModelDataPartMimeType.CacheBreakpoint) {
421-
throw new Error(`Expected LanguageModelDataPart with mimeType ${LanguageModelDataPartMimeType.CacheBreakpoint}, but got ${part.mimeType}`);
420+
if (part.mimeType !== LanguageModelDataPartMimeType.CacheControl) {
421+
throw new Error(`Expected LanguageModelDataPart with mimeType ${LanguageModelDataPartMimeType.CacheControl}, but got ${part.mimeType}`);
422422
}
423423

424-
let data: unknown;
425-
try {
426-
data = JSON.parse(part.data.toString());
427-
} catch (error) {
428-
throw new Error(`Failed to parse LanguageModelDataPart JSON: ${error}`);
424+
// By matching the Copilot extension, other extensions that use models from either Copilot
425+
// or Positron Assistant can set cache breakpoints with the same schema.
426+
// See: https://github.com/microsoft/vscode-copilot-chat/blob/6aeac371813be9037e74395186ec5b5b94089245/src/extension/byok/vscode-node/anthropicMessageConverter.ts#L22
427+
const type = part.data.toString();
428+
if (!(type === LanguageModelCacheBreakpointType.Ephemeral)) {
429+
throw new Error(`Expected LanguageModelDataPart to contain a LanguageModelCacheBreakpoint, but got: ${type}`);
429430
}
430431

431-
if (!isCacheBreakpoint(data)) {
432-
throw new Error(`Expected LanguageModelDataPart to contain a LanguageModelCacheBreakpoint, but got: ${JSON.stringify(data)}`);
433-
}
434-
435-
return data;
436-
}
437-
438-
function isCacheBreakpoint(obj: unknown): obj is LanguageModelCacheBreakpoint {
439-
return typeof obj === 'object' &&
440-
obj !== null &&
441-
'type' in obj &&
442-
obj.type === LanguageModelCacheBreakpointType.Ephemeral;
432+
return { type };
443433
}
444434

445435
/**
446436
* Create a language model part that represents a cache control point.
447437
* @returns A language model part representing the cache control point.
448438
*/
449439
export function languageModelCacheBreakpointPart(): vscode.LanguageModelDataPart {
450-
return vscode.LanguageModelDataPart.json(
451-
{
452-
type: LanguageModelCacheBreakpointType.Ephemeral,
453-
} satisfies LanguageModelCacheBreakpoint,
454-
LanguageModelDataPartMimeType.CacheBreakpoint,
455-
);
440+
// By matching the Copilot extension, other extensions that use models from either Copilot
441+
// or Positron Assistant can set cache breakpoints with the same schema.
442+
// See: https://github.com/microsoft/vscode-copilot-chat/blob/6aeac371813be9037e74395186ec5b5b94089245/src/extension/byok/vscode-node/anthropicMessageConverter.ts#L22
443+
return vscode.LanguageModelDataPart.text(LanguageModelCacheBreakpointType.Ephemeral, LanguageModelDataPartMimeType.CacheControl);
456444
}

0 commit comments

Comments
 (0)