Skip to content

Commit b7b9f66

Browse files
committed
Use the provider registry in the settings panel
1 parent 2acd903 commit b7b9f66

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ const aiProviderPlugin: JupyterFrontEndPlugin<IAIProviderRegistry> = {
166166

167167
editorRegistry.addRenderer(
168168
'@jupyterlite/ai:ai-provider.AIprovider',
169-
aiSettingsRenderer({ rmRegistry })
169+
aiSettingsRenderer({ providerRegistry, rmRegistry })
170170
);
171171
settingRegistry
172172
.load(aiProviderPlugin.id)

src/settings/panel.tsx

+18-10
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,15 @@ import validator from '@rjsf/validator-ajv8';
88
import { JSONSchema7 } from 'json-schema';
99
import React from 'react';
1010

11-
import { instructions } from './instructions';
1211
import baseSettings from './schemas/base.json';
13-
import { ProviderSettings } from './schemas';
14-
import { IDict } from '../token';
12+
import { IAIProviderRegistry, IDict } from '../token';
1513

1614
const MD_MIME_TYPE = 'text/markdown';
1715
const STORAGE_NAME = '@jupyterlite/ai:settings';
1816
const INSTRUCTION_CLASS = 'jp-AISettingsInstructions';
1917

2018
export const aiSettingsRenderer = (options: {
19+
providerRegistry: IAIProviderRegistry;
2120
rmRegistry?: IRenderMimeRegistry;
2221
}): IFormRenderer => {
2322
return {
@@ -43,6 +42,12 @@ export class AiSettings extends React.Component<
4342
> {
4443
constructor(props: FieldProps) {
4544
super(props);
45+
if (!props.formContext.providerRegistry) {
46+
throw new Error(
47+
'The provider registry is needed to enable the jupyterlite-ai settings panel'
48+
);
49+
}
50+
this._providerRegistry = props.formContext.providerRegistry;
4651
this._rmRegistry = props.formContext.rmRegistry ?? null;
4752
this._settings = props.formContext.settings;
4853

@@ -53,7 +58,7 @@ export class AiSettings extends React.Component<
5358
title: 'Provider',
5459
description: 'The AI provider to use for chat and completion',
5560
default: 'None',
56-
enum: ['None'].concat(Object.keys(ProviderSettings))
61+
enum: ['None'].concat(this._providerRegistry.providers)
5762
};
5863
this._providerSchema = providerSchema as JSONSchema7;
5964

@@ -142,8 +147,10 @@ export class AiSettings extends React.Component<
142147
private _buildSchema(): JSONSchema7 {
143148
const schema = JSONExt.deepCopy(baseSettings) as any;
144149
this._uiSchema = {};
145-
const settingsSchema =
146-
(ProviderSettings[this._provider]?.properties as JSONSchema7) ?? null;
150+
const settingsSchema = this._providerRegistry.getSettingsSchema(
151+
this._provider
152+
);
153+
147154
if (settingsSchema) {
148155
Object.entries(settingsSchema).forEach(([key, value]) => {
149156
schema.properties[key] = value;
@@ -166,15 +173,15 @@ export class AiSettings extends React.Component<
166173
* Render the markdown instructions for the current provider.
167174
*/
168175
private async _renderInstruction(): Promise<void> {
169-
if (!this._rmRegistry || !instructions[this._provider]) {
176+
let instructions = this._providerRegistry.getInstructions(this._provider);
177+
if (!this._rmRegistry || !instructions) {
170178
this.setState({ instruction: null });
171179
return;
172180
}
173-
let mdStr = instructions[this._provider];
174-
mdStr = `---\n\n${mdStr}\n\n---`;
181+
instructions = `---\n\n${instructions}\n\n---`;
175182
const renderer = this._rmRegistry.createRenderer(MD_MIME_TYPE);
176183
const model = this._rmRegistry.createModel({
177-
data: { [MD_MIME_TYPE]: mdStr }
184+
data: { [MD_MIME_TYPE]: instructions }
178185
});
179186
await renderer.renderModel(model);
180187
this.setState({ instruction: renderer.node });
@@ -240,6 +247,7 @@ export class AiSettings extends React.Component<
240247
);
241248
}
242249

250+
private _providerRegistry: IAIProviderRegistry;
243251
private _provider: string;
244252
private _providerSchema: JSONSchema7;
245253
private _rmRegistry: IRenderMimeRegistry | null;

0 commit comments

Comments
 (0)