Skip to content

Commit 20e985e

Browse files
committed
chore: refactor to use atlas service and other feedback changes
1 parent 9ab5ebb commit 20e985e

File tree

8 files changed

+94
-32
lines changed

8 files changed

+94
-32
lines changed

package-lock.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/atlas-service/src/atlas-service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ export class AtlasService {
6767
cloudEndpoint(path?: string): string {
6868
return `${this.config.cloudBaseUrl}${normalizePath(path)}`;
6969
}
70+
assistantApiEndpoint(path?: string): string {
71+
return `${this.config.assistantApiBaseUrl}${normalizePath(path)}`;
72+
}
7073
regionalizedCloudEndpoint(
7174
_atlasMetadata: Pick<AtlasClusterMetadata, 'regionalBaseUrl'>,
7275
path?: string

packages/atlas-service/src/util.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ export type AtlasServiceConfig = {
116116
* Atlas Account Portal UI base url
117117
*/
118118
authPortalUrl: string;
119+
/**
120+
* Assistant API base url
121+
*/
122+
assistantApiBaseUrl: string;
119123
};
120124

121125
/**
@@ -139,6 +143,7 @@ const config = {
139143
issuer: 'https://auth-qa.mongodb.com/oauth2/default',
140144
},
141145
authPortalUrl: 'https://account-dev.mongodb.com/account/login',
146+
assistantApiBaseUrl: 'https://knowledge.staging.corp.mongodb.com/api/v1',
142147
},
143148
'atlas-dev': {
144149
wsBaseUrl: '',
@@ -149,6 +154,7 @@ const config = {
149154
issuer: 'https://auth-qa.mongodb.com/oauth2/default',
150155
},
151156
authPortalUrl: 'https://account-dev.mongodb.com/account/login',
157+
assistantApiBaseUrl: 'https://knowledge.staging.corp.mongodb.com/api/v1',
152158
},
153159
'atlas-qa': {
154160
wsBaseUrl: '',
@@ -159,6 +165,7 @@ const config = {
159165
issuer: 'https://auth-qa.mongodb.com/oauth2/default',
160166
},
161167
authPortalUrl: 'https://account-qa.mongodb.com/account/login',
168+
assistantApiBaseUrl: 'https://knowledge.staging.corp.mongodb.com/api/v1',
162169
},
163170
atlas: {
164171
wsBaseUrl: '',
@@ -169,6 +176,7 @@ const config = {
169176
issuer: 'https://auth.mongodb.com/oauth2/default',
170177
},
171178
authPortalUrl: 'https://account.mongodb.com/account/login',
179+
assistantApiBaseUrl: 'https://knowledge.corp.mongodb.com/api/v1',
172180
},
173181
'web-sandbox-atlas-local': {
174182
wsBaseUrl: '/ccs',
@@ -189,6 +197,7 @@ const config = {
189197
issuer: 'https://auth-qa.mongodb.com/oauth2/default',
190198
},
191199
authPortalUrl: 'https://account-dev.mongodb.com/account/login',
200+
assistantApiBaseUrl: 'https://knowledge.staging.corp.mongodb.com/api/v1',
192201
},
193202
'web-sandbox-atlas-qa': {
194203
wsBaseUrl: '/ccs',
@@ -199,6 +208,7 @@ const config = {
199208
issuer: 'https://auth-qa.mongodb.com/oauth2/default',
200209
},
201210
authPortalUrl: 'https://account-dev.mongodb.com/account/login',
211+
assistantApiBaseUrl: 'https://knowledge.staging.corp.mongodb.com/api/v1',
202212
},
203213
'web-sandbox-atlas': {
204214
wsBaseUrl: '/ccs',
@@ -209,6 +219,7 @@ const config = {
209219
issuer: 'https://auth.mongodb.com/oauth2/default',
210220
},
211221
authPortalUrl: 'https://account.mongodb.com/account/login',
222+
assistantApiBaseUrl: 'https://knowledge.staging.corp.mongodb.com/api/v1',
212223
},
213224
} as const;
214225

@@ -223,6 +234,7 @@ export function getAtlasConfig(
223234
issuer: process.env.COMPASS_OIDC_ISSUER_OVERRIDE,
224235
},
225236
authPortalUrl: process.env.COMPASS_ATLAS_AUTH_PORTAL_URL_OVERRIDE,
237+
assistantApiBaseUrl: process.env.COMPASS_ASSISTANT_BASE_URL_OVERRIDE,
226238
};
227239
return defaultsDeep(
228240
envConfig,

packages/compass-assistant/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
},
5151
"dependencies": {
5252
"@ai-sdk/openai": "^2.0.4",
53+
"@mongodb-js/atlas-service": "^0.54.0",
5354
"@mongodb-js/compass-components": "^1.30.5",
5455
"@mongodb-js/compass-logging": "^1.7.10",
5556
"@mongodb-js/compass-app-registry": "^9.4.18",

packages/compass-assistant/src/assistant-provider.tsx

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { usePreference } from 'compass-preferences-model/provider';
88
export const ASSISTANT_DRAWER_ID = 'compass-assistant-drawer';
99

1010
import { createContext, useContext } from 'react';
11-
import { docsProviderTransport } from './docs-provider-transport';
1211

1312
type AssistantActions = unknown;
1413

@@ -20,21 +19,19 @@ export function useAssistantActions(): AssistantActions {
2019

2120
export const AssistantProvider: React.FunctionComponent<
2221
PropsWithChildren<{
23-
chat?: Chat<UIMessage>;
22+
chat: Chat<UIMessage>;
2423
}>
2524
> = ({ chat, children }) => {
2625
const enableAIAssistant = usePreference('enableAIAssistant');
2726

2827
const { messages, sendMessage } = useChat({
29-
transport: docsProviderTransport,
3028
chat,
3129
});
3230

3331
const contextActions = useRef({});
3432

3533
const handleMessageSend = useCallback(
3634
(messageBody: string) => {
37-
/** Telemetry, etc. */
3835
void sendMessage({ text: messageBody });
3936
},
4037
[sendMessage]
@@ -46,19 +43,14 @@ export const AssistantProvider: React.FunctionComponent<
4643

4744
return (
4845
<AssistantActionsContext.Provider value={contextActions.current}>
49-
{enableAIAssistant && (
50-
<DrawerSection
51-
id={ASSISTANT_DRAWER_ID}
52-
title="MongoDB Assistant"
53-
label="MongoDB Assistant"
54-
glyph="Sparkle"
55-
>
56-
<AssistantChat
57-
messages={messages}
58-
onSendMessage={handleMessageSend}
59-
/>
60-
</DrawerSection>
61-
)}
46+
<DrawerSection
47+
id={ASSISTANT_DRAWER_ID}
48+
title="MongoDB Assistant"
49+
label="MongoDB Assistant"
50+
glyph="Sparkle"
51+
>
52+
<AssistantChat messages={messages} onSendMessage={handleMessageSend} />
53+
</DrawerSection>
6254
{children}
6355
</AssistantActionsContext.Provider>
6456
);

packages/compass-assistant/src/docs-provider-transport.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,25 @@ import {
88
} from 'ai';
99
import { createOpenAI } from '@ai-sdk/openai';
1010

11-
const openai = createOpenAI({
12-
baseURL: 'https://knowledge.staging.corp.mongodb.com/api/v1',
13-
apiKey: '',
14-
});
15-
1611
export class DocsProviderTransport implements ChatTransport<UIMessage> {
12+
private openai: ReturnType<typeof createOpenAI>;
13+
14+
constructor({ baseUrl }: { baseUrl: string }) {
15+
this.openai = createOpenAI({
16+
baseURL: baseUrl,
17+
apiKey: '',
18+
});
19+
}
20+
1721
// eslint-disable-next-line @typescript-eslint/require-await
1822
async sendMessages({
1923
messages,
2024
abortSignal,
2125
}: Parameters<ChatTransport<UIMessage>['sendMessages']>[0]) {
2226
const result = streamText({
23-
model: openai.responses('mongodb-chat-latest'),
27+
model: this.openai.responses('mongodb-chat-latest'),
2428
messages: convertToModelMessages(messages),
2529
abortSignal: abortSignal,
26-
headers: {
27-
origin: 'https://knowledge.staging.corp.mongodb.com',
28-
},
2930
});
3031

3132
return result.toUIMessageStream();
@@ -40,5 +41,3 @@ export class DocsProviderTransport implements ChatTransport<UIMessage> {
4041
return null;
4142
}
4243
}
43-
44-
export const docsProviderTransport = new DocsProviderTransport();
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { render } from '@mongodb-js/testing-library-compass';
2+
import { CompassAssistantProvider } from '.';
3+
import React from 'react';
4+
import sinon from 'sinon';
5+
import { expect } from 'chai';
6+
import {
7+
DrawerAnchor,
8+
DrawerContentProvider,
9+
} from '@mongodb-js/compass-components';
10+
11+
describe('CompassAssistantProvider', function () {
12+
beforeEach(function () {
13+
process.env.COMPASS_ASSISTANT_USE_ATLAS_SERVICE_URL = 'true';
14+
});
15+
16+
afterEach(function () {
17+
delete process.env.COMPASS_ASSISTANT_USE_ATLAS_SERVICE_URL;
18+
});
19+
20+
it('uses the Atlas Service assistantApiEndpoint', function () {
21+
const mockAtlasService = {
22+
assistantApiEndpoint: sinon
23+
.stub()
24+
.returns('https://atlas-assistant-api.example.com/api/v1'),
25+
};
26+
27+
const MockedProvider = CompassAssistantProvider.withMockServices({
28+
atlasService: mockAtlasService,
29+
});
30+
31+
render(
32+
<DrawerContentProvider>
33+
<DrawerAnchor />
34+
<MockedProvider />
35+
</DrawerContentProvider>,
36+
{
37+
preferences: { enableAIAssistant: true },
38+
}
39+
);
40+
41+
expect(mockAtlasService.assistantApiEndpoint.calledOnce).to.be.true;
42+
});
43+
});

packages/compass-assistant/src/index.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
11
import { registerCompassPlugin } from '@mongodb-js/compass-app-registry';
22
import { AssistantProvider } from './assistant-provider';
33
import { Chat } from './@ai-sdk/react/chat-react';
4-
import { docsProviderTransport } from './docs-provider-transport';
4+
import { DocsProviderTransport } from './docs-provider-transport';
5+
import { atlasServiceLocator } from '@mongodb-js/atlas-service/provider';
56

67
const CompassAssistantProvider = registerCompassPlugin(
78
{
89
name: 'CompassAssistant',
910
component: AssistantProvider,
10-
activate: () => {
11-
const chat = new Chat({ transport: docsProviderTransport });
11+
activate: (initialProps, { atlasService }) => {
12+
// TODO: We will temporarily default to the staging url until the docs
13+
// API is deployed to the production environment.
14+
const baseUrl = process.env.COMPASS_ASSISTANT_USE_ATLAS_SERVICE_URL
15+
? atlasService.assistantApiEndpoint()
16+
: 'https://knowledge.staging.corp.mongodb.com/api/v1';
17+
const chat = new Chat({
18+
transport: new DocsProviderTransport({
19+
baseUrl,
20+
}),
21+
});
1222
return {
1323
store: { state: { chat } },
1424
deactivate: () => {},
1525
};
1626
},
1727
},
1828
{
19-
transport: () => docsProviderTransport,
29+
atlasService: atlasServiceLocator,
2030
}
2131
);
2232

0 commit comments

Comments
 (0)