Skip to content

Commit 0e1e21d

Browse files
committed
refactor: improve style of ai chat bot style and improve user interface
1 parent fba127e commit 0e1e21d

File tree

6 files changed

+58
-40
lines changed

6 files changed

+58
-40
lines changed

src/client/components/ai/AIResponseItem.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
import { get, map } from 'lodash-es';
2727

2828
type AskForConfirmationInput = { message: string };
29-
type WeatherInformationInput = { city: string };
3029

3130
function isAskForConfirmationInput(
3231
input: unknown

src/client/components/ai/AIResponseMessages.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { AbstractChat, ChatStatus, UIDataTypes, UIMessage, UITools } from 'ai';
22
import React from 'react';
33
import { Message, MessageContent } from '../ai-elements/message';
44
import { AIResponseItem } from './AIResponseItem';
5+
import { Spinner } from '../ui/spinner';
56

67
interface AIResponseMessagesProps {
78
messages: UIMessage<unknown, UIDataTypes, UITools>[];
@@ -31,6 +32,14 @@ export const AIResponseMessages: React.FC<AIResponseMessagesProps> = React.memo(
3132
</MessageContent>
3233
</Message>
3334
))}
35+
36+
{status === 'submitted' && (
37+
<Message from="assistant">
38+
<MessageContent>
39+
<Spinner />
40+
</MessageContent>
41+
</Message>
42+
)}
3443
</>
3544
);
3645
}

src/client/hooks/useWarehouseAIChat.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,14 @@ export function useWarehouseAIChat({
123123
return;
124124
}
125125

126-
await handleSendWithScopes(input.trim());
126+
const text = input.trim();
127127
setInput('');
128+
try {
129+
await handleSendWithScopes(text);
130+
} catch (err) {
131+
toast.error(String(err));
132+
setInput(text);
133+
}
128134
});
129135

130136
// Handle suggestion click

src/client/routes/insights/warehouse/index.tsx

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -252,44 +252,36 @@ function PageComponent() {
252252
</div>
253253
</div>
254254
<div className="border-t border-zinc-200 dark:border-zinc-800" />
255-
<ScrollArea className="flex-1">
256-
<Conversation>
257-
<ConversationContent>
258-
<AIResponseMessages
259-
messages={messages}
260-
status={status}
261-
onAddToolResult={addToolResult}
262-
/>
263-
</ConversationContent>
264-
<ConversationScrollButton />
265-
</Conversation>
266255

267-
{error && (
268-
<div className="p-3">
269-
<Alert variant="destructive">
270-
<LuCircleAlert className="h-4 w-4" />
271-
<AlertTitle>{t('An error occurred.')}</AlertTitle>
272-
<AlertDescription>{String(error)}</AlertDescription>
273-
<div className="mt-2 flex items-center gap-2">
274-
<Button
275-
size="sm"
276-
variant="destructive"
277-
onClick={handleReset}
278-
>
279-
{t('Retry')}
280-
</Button>
281-
</div>
282-
</Alert>
283-
</div>
284-
)}
256+
<Conversation>
257+
<ConversationContent>
258+
<AIResponseMessages
259+
messages={messages}
260+
status={status}
261+
onAddToolResult={addToolResult}
262+
/>
263+
</ConversationContent>
264+
<ConversationScrollButton />
265+
</Conversation>
285266

286-
{usage && status === 'ready' && messages.length > 0 && (
287-
<div className="px-4 py-1 text-right text-xs text-opacity-40">
288-
{formatNumber(usage.inputTokens + usage.outputTokens)}{' '}
289-
tokens used
290-
</div>
291-
)}
292-
</ScrollArea>
267+
{error && (
268+
<div className="p-3">
269+
<Alert variant="destructive">
270+
<LuCircleAlert className="h-4 w-4" />
271+
<AlertTitle>{t('An error occurred.')}</AlertTitle>
272+
<AlertDescription>{String(error)}</AlertDescription>
273+
<div className="mt-2 flex items-center gap-2">
274+
<Button
275+
size="sm"
276+
variant="destructive"
277+
onClick={handleReset}
278+
>
279+
{t('Retry')}
280+
</Button>
281+
</div>
282+
</Alert>
283+
</div>
284+
)}
293285

294286
{!databaseStatus.isDisabled && (
295287
<Suggestions className="p-3 pb-0">
@@ -384,6 +376,15 @@ function PageComponent() {
384376
)}
385377
</div>
386378

379+
{usage && status === 'ready' && messages.length > 0 && (
380+
<div className="relative">
381+
<div className="absolute -top-8 right-0 px-4 py-1 text-right text-xs text-opacity-40">
382+
{formatNumber(usage.inputTokens + usage.outputTokens)}{' '}
383+
{t('tokens used')}
384+
</div>
385+
</div>
386+
)}
387+
387388
<PromptInput onSubmit={handleSend}>
388389
<PromptInputTextarea
389390
value={input}

src/server/router/insights.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const openai = createOpenAI({
3131
});
3232

3333
insightsRouter.post('/:workspaceId/chat', auth(), async (req, res) => {
34-
if (!env.insights.warehouse.enable || !env.openai.enable) {
34+
if (!env.openai.enable) {
3535
// only for dev now, and require shared OpenAI enabled
3636
res
3737
.status(401)
@@ -41,7 +41,7 @@ insightsRouter.post('/:workspaceId/chat', auth(), async (req, res) => {
4141
return;
4242
}
4343

44-
if (req.user?.id !== INIT_ADMIN_USER_ID) {
44+
if (req.user?.id !== INIT_ADMIN_USER_ID && !env.isDev) {
4545
res.status(401).end('This feature is only for admin user');
4646
return;
4747
}

src/server/utils/env.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ export const env = {
134134
},
135135
},
136136
insights: {
137+
/**
138+
* @deprecated
139+
*/
137140
warehouse: {
138141
enable: Boolean(process.env.INSIGHTS_WAREHOUSE_URL),
139142
url: process.env.INSIGHTS_WAREHOUSE_URL,

0 commit comments

Comments
 (0)