diff --git a/apps/stage-tamagotchi/src/renderer/src/components/InteractiveArea.vue b/apps/stage-tamagotchi/src/renderer/src/components/InteractiveArea.vue index e75005339..d483d2ee0 100644 --- a/apps/stage-tamagotchi/src/renderer/src/components/InteractiveArea.vue +++ b/apps/stage-tamagotchi/src/renderer/src/components/InteractiveArea.vue @@ -20,7 +20,7 @@ const { send, onAfterSend } = useChatStore() const { messages } = storeToRefs(useChatStore()) const { t } = useI18n() const providersStore = useProvidersStore() -const { activeModel } = storeToRefs(useConsciousnessStore()) +const { activeModel, activeProvider } = storeToRefs(useConsciousnessStore()) async function handleSend() { if (!messageInput.value.trim()) { @@ -28,9 +28,11 @@ async function handleSend() { } try { + const providerConfig = providersStore.getProviderConfig(activeProvider.value) await send(messageInput.value, { model: activeModel.value, - chatProvider: providersStore.getProviderInstance('openrouter-ai') as ChatProvider, + chatProvider: providersStore.getProviderInstance(activeProvider.value) as ChatProvider, + providerConfig, }) } catch (error) { diff --git a/apps/stage-web/src/components/Layouts/InteractiveArea.vue b/apps/stage-web/src/components/Layouts/InteractiveArea.vue index 3349c01a0..2fb5ff71e 100644 --- a/apps/stage-web/src/components/Layouts/InteractiveArea.vue +++ b/apps/stage-web/src/components/Layouts/InteractiveArea.vue @@ -34,7 +34,13 @@ const { transcribe: generate, load: loadWhisper, status: whisperStatus, terminat return } - await send(res, { chatProvider: providersStore.getProviderInstance(activeProvider.value) as ChatProvider, model: activeModel.value }) + const providerConfig = providersStore.getProviderConfig(activeProvider.value) + + await send(res, { + chatProvider: providersStore.getProviderInstance(activeProvider.value) as ChatProvider, + model: activeModel.value, + providerConfig, + }) }, }) @@ -44,7 +50,13 @@ async function handleSend() { } try { - await send(messageInput.value, { chatProvider: providersStore.getProviderInstance(activeProvider.value) as ChatProvider, model: activeModel.value }) + const providerConfig = providersStore.getProviderConfig(activeProvider.value) + + await send(messageInput.value, { + chatProvider: providersStore.getProviderInstance(activeProvider.value) as ChatProvider, + model: activeModel.value, + providerConfig, + }) } catch (error) { messages.value.pop() diff --git a/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue b/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue index 56b5fa77b..08774f6ee 100644 --- a/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue +++ b/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue @@ -27,7 +27,13 @@ async function handleSend() { return } - await send(messageInput.value, { chatProvider: providersStore.getProviderInstance(activeProvider.value) as ChatProvider, model: activeModel.value }) + const providerConfig = providersStore.getProviderConfig(activeProvider.value) + + await send(messageInput.value, { + chatProvider: providersStore.getProviderInstance(activeProvider.value) as ChatProvider, + model: activeModel.value, + providerConfig, + }) } const { destroy, start } = useMicVAD(selectedAudioDeviceId, { diff --git a/packages/stage-ui/src/stores/chat.ts b/packages/stage-ui/src/stores/chat.ts index 306e97225..b5df2bec4 100644 --- a/packages/stage-ui/src/stores/chat.ts +++ b/packages/stage-ui/src/stores/chat.ts @@ -71,7 +71,7 @@ export const useChatStore = defineStore('chat', () => { const streamingMessage = ref({ role: 'assistant', content: '' }) - async function send(sendingMessage: string, options: { model: string, chatProvider: ChatProvider }) { + async function send(sendingMessage: string, options: { model: string, chatProvider: ChatProvider, providerConfig?: Record }) { try { sending.value = true @@ -95,7 +95,16 @@ export const useChatStore = defineStore('chat', () => { await hook(sendingMessage) } - const res = await stream(options.model, options.chatProvider, newMessages as Message[]) + const headersArray = options.providerConfig?.headers as { key: string, value: string }[] | undefined + + const headers = headersArray + ?.filter(h => h.key && h.value) + .reduce((acc, curr) => { + acc[curr.key] = curr.value + return acc + }, {} as Record) + + const res = await stream(options.model, options.chatProvider, newMessages as Message[], { headers }) for (const hook of onAfterSendHooks.value) { await hook(sendingMessage) diff --git a/packages/stage-ui/src/stores/llm.ts b/packages/stage-ui/src/stores/llm.ts index e07b7e486..72dfd69db 100644 --- a/packages/stage-ui/src/stores/llm.ts +++ b/packages/stage-ui/src/stores/llm.ts @@ -6,13 +6,18 @@ import { streamText } from '@xsai/stream-text' import { defineStore } from 'pinia' export const useLLM = defineStore('llm', () => { - async function stream(model: string, chatProvider: ChatProvider, messages: Message[]) { + async function stream(model: string, chatProvider: ChatProvider, messages: Message[], options?: { + headers?: Record + }) { + const headers = options?.headers + return await streamText({ ...chatProvider.chat(model), messages, streamOptions: { usage: true, }, + headers, }) }