Skip to content

Commit f2f4baa

Browse files
committed
refac
1 parent 15ae3f5 commit f2f4baa

3 files changed

Lines changed: 54 additions & 1 deletion

File tree

src/lib/components/chat/Chat.svelte

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
145145
let selectedToolIds = [];
146146
let selectedFilterIds = [];
147+
let pendingOAuthTools = [];
147148
148149
let imageGenerationEnabled = false;
149150
let webSearchEnabled = false;
@@ -274,6 +275,7 @@
274275
const resetInput = () => {
275276
selectedToolIds = [];
276277
selectedFilterIds = [];
278+
pendingOAuthTools = [];
277279
webSearchEnabled = false;
278280
imageGenerationEnabled = false;
279281
codeInterpreterEnabled = false;
@@ -298,11 +300,28 @@
298300
if (model) {
299301
// Set Default Tools
300302
if (model?.info?.meta?.toolIds) {
301-
selectedToolIds = [
303+
const defaultIds = [
302304
...new Set(
303305
[...(model?.info?.meta?.toolIds ?? [])].filter((id) => $tools.find((t) => t.id === id))
304306
)
305307
];
308+
309+
// Separate unauthenticated OAuth tools
310+
const unauthed = [];
311+
const authed = [];
312+
for (const id of defaultIds) {
313+
const tool = $tools.find((t) => t.id === id);
314+
if (tool && tool.authenticated === false) {
315+
const parts = id.split(':');
316+
const serverId = parts.at(-1) ?? id;
317+
const authType = parts.length > 1 ? parts[0] === 'server' ? parts[1] : parts[0] : null;
318+
unauthed.push({ id, name: tool.name ?? id, serverId, authType });
319+
} else {
320+
authed.push(id);
321+
}
322+
}
323+
selectedToolIds = authed;
324+
pendingOAuthTools = unauthed;
306325
} else if ($settings?.tools) {
307326
selectedToolIds = $settings.tools;
308327
} else {
@@ -1765,6 +1784,12 @@
17651784
selectedModels = _selectedModels;
17661785
}
17671786
1787+
if (pendingOAuthTools.length > 0) {
1788+
toast.warning(
1789+
$i18n.t('Please connect all required integrations before sending a message')
1790+
);
1791+
return;
1792+
}
17681793
if (userPrompt === '' && files.length === 0) {
17691794
toast.error($i18n.t('Please enter a prompt'));
17701795
return;
@@ -2843,6 +2868,7 @@
28432868
bind:selectedFilterIds
28442869
bind:imageGenerationEnabled
28452870
bind:codeInterpreterEnabled
2871+
{pendingOAuthTools}
28462872
bind:webSearchEnabled
28472873
bind:atSelectedModel
28482874
bind:showCommands
@@ -2930,6 +2956,7 @@
29302956
bind:atSelectedModel
29312957
bind:showCommands
29322958
bind:dragged
2959+
{pendingOAuthTools}
29332960
toolServers={$toolServers}
29342961
{stopResponse}
29352962
{createMessagePair}

src/lib/components/chat/MessageInput.svelte

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import { getTools } from '$lib/apis/tools';
6161
6262
import { WEBUI_BASE_URL, WEBUI_API_BASE_URL, PASTED_TEXT_CHARACTER_LIMIT } from '$lib/constants';
63+
import { getOAuthClientAuthorizationUrl } from '$lib/apis/configs';
6364
6465
import { createNoteHandler } from '../notes/utils';
6566
import { getSuggestionRenderer } from '../common/RichTextInput/suggestions';
@@ -130,6 +131,8 @@
130131
export let webSearchEnabled = false;
131132
export let codeInterpreterEnabled = false;
132133
134+
export let pendingOAuthTools = [];
135+
133136
let showTerminalMenu = false;
134137
135138
export let messageQueue: { id: string; prompt: string; files: any[] }[] = [];
@@ -1800,6 +1803,27 @@
18001803
</button>
18011804
</Tooltip>
18021805
{/if}
1806+
1807+
{#each pendingOAuthTools as pendingTool (pendingTool.id)}
1808+
<Tooltip content={$i18n.t('Click to connect')} placement="top">
1809+
<button
1810+
on:click|preventDefault={() => {
1811+
sessionStorage.setItem('pendingOAuthToolId', pendingTool.id);
1812+
const authUrl = getOAuthClientAuthorizationUrl(
1813+
pendingTool.serverId,
1814+
pendingTool.authType ?? 'mcp'
1815+
);
1816+
window.open(authUrl, '_self', 'noopener');
1817+
}}
1818+
type="button"
1819+
class="group px-2 py-[5px] flex gap-1.5 items-center text-xs rounded-full transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden
1820+
text-amber-600 dark:text-amber-400 bg-amber-50 hover:bg-amber-100 dark:bg-amber-400/10 dark:hover:bg-amber-600/10 border border-amber-200/40 dark:border-amber-500/20"
1821+
>
1822+
<Wrench className="size-3.5" strokeWidth="1.75" />
1823+
<span class="truncate">{pendingTool.name}</span>
1824+
</button>
1825+
</Tooltip>
1826+
{/each}
18031827
</div>
18041828
</div>
18051829

src/lib/components/chat/Placeholder.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
4848
export let selectedToolIds = [];
4949
export let selectedFilterIds = [];
50+
export let pendingOAuthTools = [];
5051
5152
export let showCommands = false;
5253
@@ -218,6 +219,7 @@
218219
bind:atSelectedModel
219220
bind:showCommands
220221
bind:dragged
222+
{pendingOAuthTools}
221223
{toolServers}
222224
{stopResponse}
223225
{createMessagePair}

0 commit comments

Comments
 (0)