Skip to content

Commit bbeb8f3

Browse files
committed
integrating api with ui
1 parent 6047e65 commit bbeb8f3

File tree

4 files changed

+93
-24
lines changed

4 files changed

+93
-24
lines changed

packages/jupyter-ai/src/components/chat-settings.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import WarningAmberIcon from '@mui/icons-material/WarningAmber';
88
import { IRenderMimeRegistry } from '@jupyterlab/rendermime';
99
import { IJaiCompletionProvider } from '../tokens';
1010
import { ModelIdInput } from './settings/model-id-input';
11-
// import { ModelParametersInput } from './settings/model-parameters-input';
11+
import { ModelParametersInput } from './settings/model-parameters-input';
1212
import { SecretsSection } from './settings/secrets-section';
1313

1414
type ChatSettingsProps = {
@@ -22,6 +22,7 @@ type ChatSettingsProps = {
2222
*/
2323
export function ChatSettings(props: ChatSettingsProps): JSX.Element {
2424
const [completionModel, setCompletionModel] = useState<string | null>(null);
25+
const [chatModel, setChatModel] = useState<string | null>(null);
2526
const [isCompleterEnabled, setIsCompleterEnabled] = useState(
2627
props.completionProvider && props.completionProvider.isEnabled()
2728
);
@@ -60,6 +61,7 @@ export function ChatSettings(props: ChatSettingsProps): JSX.Element {
6061
modality="chat"
6162
label="Chat model ID"
6263
placeholder="e.g. 'anthropic/claude-3-5-haiku-latest'"
64+
onModelIdFetch={(modelId) => setChatModel(modelId)}
6365
/>
6466

6567
{/* SECTION: Embedding model */}
@@ -89,9 +91,9 @@ export function ChatSettings(props: ChatSettingsProps): JSX.Element {
8991
/>
9092

9193
{/* Model parameters section */}
92-
{/* <h2 className="jp-ai-ChatSettings-header">Model parameters</h2>
94+
<h2 className="jp-ai-ChatSettings-header">Model parameters</h2>
9395
<p>Configure additional parameters for the language model.</p>
94-
<ModelParametersInput /> */}
96+
<ModelParametersInput modelId={chatModel} />
9597

9698
{/* SECTION: Secrets (and API keys) */}
9799
<h2 className="jp-ai-ChatSettings-header">Secrets and API keys</h2>

packages/jupyter-ai/src/components/settings/model-id-input.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export function ModelIdInput(props: ModelIdInputProps): JSX.Element {
4949
const [prevModel, setPrevModel] = useState<string | null>(null);
5050
const [loading, setLoading] = useState(true);
5151
const [updating, setUpdating] = useState(false);
52+
const [modelParameters, setModelParameters] = useState<any>(null);
5253

5354
const [input, setInput] = useState('');
5455
const alert = useStackingAlert();
@@ -91,6 +92,16 @@ export function ModelIdInput(props: ModelIdInputProps): JSX.Element {
9192
loadData();
9293
}, []);
9394

95+
const fetchModelParameters = async (modelId: string) => {
96+
try {
97+
const parameters = await AiService.getModelParameters(modelId);
98+
setModelParameters(parameters);
99+
} catch (error) {
100+
console.error('Failed to fetch model parameters:', error);
101+
setModelParameters(null);
102+
}
103+
};
104+
94105
const handleUpdateChatModel = async () => {
95106
setUpdating(true);
96107
try {
@@ -140,6 +151,12 @@ export function ModelIdInput(props: ModelIdInputProps): JSX.Element {
140151
// ID by accident.
141152
if (newValue !== null && !newValue.includes(' ')) {
142153
setInput(newValue);
154+
// Fetch parameters when user types a model ID
155+
if (newValue.trim()) {
156+
fetchModelParameters(newValue.trim());
157+
} else {
158+
setModelParameters(null);
159+
}
143160
}
144161
}}
145162
renderInput={params => (
@@ -162,6 +179,15 @@ export function ModelIdInput(props: ModelIdInputProps): JSX.Element {
162179
? `Updating ${props.modality} model...`
163180
: `Update ${props.modality} model`}
164181
</Button>
182+
183+
{/* Display model parameters */}
184+
{modelParameters && (
185+
<div>
186+
<strong>Parameters:</strong>{' '}
187+
{JSON.stringify(modelParameters, null, 2)}
188+
</div>
189+
)}
190+
165191
{alert.jsx}
166192
</Box>
167193
);

packages/jupyter-ai/src/components/settings/model-parameters-input.tsx

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import React, { useState } from 'react';
2-
import { Button, TextField, Box, Alert, IconButton } from '@mui/material';
1+
import React, { useState, useEffect } from 'react';
2+
import { Box, Button, TextField, Alert, IconButton } from '@mui/material';
33
import DeleteIcon from '@mui/icons-material/Delete';
4+
import { AiService } from '../../handler';
45

56
interface ModelParameter {
67
id: string;
@@ -16,17 +17,36 @@ interface StaticParameterDef {
1617
label: string;
1718
}
1819

19-
// Add some common fields as static parameters here
20-
const STATIC_PARAMETERS: StaticParameterDef[] = [
21-
{ name: 'temperature', type: 'float', label: 'Temperature' },
22-
{ name: 'api_url', type: 'string', label: 'API URL' },
23-
{ name: 'max_tokens', type: 'integer', label: 'Max Tokens' }
24-
];
20+
export type ModelParametersInputProps = {
21+
modelId?: string | null;
22+
};
2523

26-
export function ModelParametersInput(): JSX.Element {
24+
export function ModelParametersInput(
25+
props: ModelParametersInputProps
26+
): JSX.Element {
27+
const [availableParameters, setAvailableParameters] = useState<any>(null);
2728
const [parameters, setParameters] = useState<ModelParameter[]>([]);
2829
const [validationError, setValidationError] = useState<string>('');
2930

31+
useEffect(() => {
32+
async function fetchAvailableParameters() {
33+
if (!props.modelId) {
34+
setAvailableParameters(null);
35+
return;
36+
}
37+
38+
try {
39+
const response = await AiService.getModelParameters(props.modelId);
40+
setAvailableParameters(response);
41+
} catch (error) {
42+
console.error('Failed to fetch available parameters:', error);
43+
setAvailableParameters(null);
44+
}
45+
}
46+
47+
fetchAvailableParameters();
48+
}, [props.modelId]);
49+
3050
const handleAddParameter = () => {
3151
const newParameter: ModelParameter = {
3252
id: Date.now().toString(),
@@ -108,33 +128,42 @@ export function ModelParametersInput(): JSX.Element {
108128
};
109129

110130
const showSaveButton = parameters.length > 0;
111-
const availableStaticParams = STATIC_PARAMETERS.filter(
112-
staticParam =>
113-
!parameters.some(
114-
param => param.name === staticParam.name && param.isStatic
131+
132+
// Get available parameters from API that haven't been added yet
133+
const availableApiParams = availableParameters?.parameters
134+
? Object.entries(availableParameters.parameters).filter(
135+
([paramName]) =>
136+
!parameters.some(param => param.name === paramName && param.isStatic)
115137
)
116-
);
138+
: [];
117139

118140
return (
119141
<Box>
120142
<Button variant="outlined" onClick={handleAddParameter} sx={{ mb: 2 }}>
121143
Add a custom model parameter
122144
</Button>
123-
{/* Static parameter buttons */}
124-
{availableStaticParams.length > 0 && (
145+
{/* Available parameters from API */}
146+
{availableApiParams.length > 0 && (
125147
<Box sx={{ mb: 2 }}>
126148
<Box sx={{ mb: 1, fontWeight: 'medium', fontSize: '0.875rem' }}>
127-
Common parameters:
149+
Available parameters for {props.modelId}:
128150
</Box>
129151
<Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap', mb: 2 }}>
130-
{availableStaticParams.map(staticParam => (
152+
{availableApiParams.map(([paramName, schema]: [string, any]) => (
131153
<Button
132-
key={staticParam.name}
154+
key={paramName}
133155
variant="outlined"
134156
size="small"
135-
onClick={() => handleAddStaticParameter(staticParam)}
157+
onClick={() =>
158+
handleAddStaticParameter({
159+
name: paramName,
160+
type: schema.type,
161+
label: paramName
162+
})
163+
}
164+
title={schema.description}
136165
>
137-
{staticParam.label}
166+
{paramName} ({schema.type})
138167
</Button>
139168
))}
140169
</Box>

packages/jupyter-ai/src/handler.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,16 @@ export namespace AiService {
219219
completions_model_provider_id: modelId
220220
});
221221
}
222+
223+
export async function getModelParameters(
224+
modelId?: string,
225+
provider?: string
226+
): Promise<any> {
227+
const params = new URLSearchParams();
228+
if (modelId) params.append('model', modelId);
229+
if (provider) params.append('provider', provider);
230+
231+
const endpoint = `model-parameters${params.toString() ? `?${params.toString()}` : ''}`;
232+
return await requestAPI(endpoint);
233+
}
222234
}

0 commit comments

Comments
 (0)