diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..c6a66a6 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v22.21.1 diff --git a/package.json b/package.json index 821ded5..549a979 100644 --- a/package.json +++ b/package.json @@ -15,27 +15,29 @@ "test:run": "vitest run" }, "dependencies": { - "@ai-sdk/anthropic": "^1.2.12", - "@ai-sdk/google": "^1.2.22", - "@ai-sdk/openai": "^1.3.22", - "@ai-sdk/vue": "^1.2.12", + "@ai-sdk/amazon-bedrock": "^3.0.33", + "@ai-sdk/anthropic": "^2.0.25", + "@ai-sdk/google": "^2.0.18", + "@ai-sdk/openai": "^2.0.46", + "@ai-sdk/openai-compatible": "^1.0.20", + "@ai-sdk/vue": "^2.0.62", "@beekeeperstudio/plugin": "^1.4.0", "@langchain/core": "^0.3.61", "@material-symbols/font-400": "^0.31.2", + "ai": "^5.0.101", "@pdanpdan/vue-keyboard-trap": "^1.2.0", - "ai": "^4.3.16", "highlight.js": "^11.11.1", "langchain": "^0.3.19", "lodash": "^4.17.21", "marked": "^15.0.12", "marked-highlight": "^2.2.1", - "ollama-ai-provider": "^1.2.0", + "ollama-ai-provider-v2": "^1.3.1", "pinia": "^3.0.2", "pluralize": "^8.0.0", "sql-query-identifier": "^2.8.0", "typeface-roboto": "^0.0.75", "vue": "^3.4.21", - "zod": "^3.25.32" + "zod": "^4.1.8" }, "devDependencies": { "@beekeeperstudio/vite-plugin": "^1.0.3", diff --git a/src/assets/styles/components/_message.scss b/src/assets/styles/components/_message.scss index 257e580..a03eb05 100644 --- a/src/assets/styles/components/_message.scss +++ b/src/assets/styles/components/_message.scss @@ -200,4 +200,33 @@ font-style: italic; --theme-text-message-system: var(--text-muted); } + + [data-tool-state="input-streaming"] { + &>.markdown code .hljs-comment::after { + content: ""; + animation: dots 2.5s steps(4, end) infinite; + } + + @keyframes dots { + 0% { + content: ""; + } + + 25% { + content: "."; + } + + 50% { + content: ".."; + } + + 75% { + content: "..."; + } + + 100% { + content: ""; + } + } + } } diff --git a/src/components/ChatInterface.vue b/src/components/ChatInterface.vue index 2fea95b..5177c1e 100644 --- a/src/components/ChatInterface.vue +++ b/src/components/ChatInterface.vue @@ -81,7 +81,6 @@ import { useChatStore, Model } from "@/stores/chat"; import Dropdown from "./common/Dropdown.vue"; import DropdownOption from "./common/DropdownOption.vue"; import _ from "lodash"; -import ToolMessage from "@/components/messages/ToolMessage.vue"; import Markdown from "@/components/messages/Markdown.vue"; import Message from "@/components/messages/Message.vue"; import { Message as MessageType } from "ai"; @@ -99,7 +98,6 @@ export default { Dropdown, DropdownOption, Message, - ToolMessage, Markdown, BaseInput, PromptInput, @@ -118,12 +116,7 @@ export default { }, setup(props) { - const ai = useAI({ - initialMessages: props.initialMessages, - anthropicApiKey: props.anthropicApiKey, - openaiApiKey: props.openaiApiKey, - googleApiKey: props.googleApiKey, - }); + const ai = useAI({ initialMessages: props.initialMessages }); return { send: ai.send, @@ -254,10 +247,10 @@ export default { this.noModelError = false; if (this.askingPermission) { - this.rejectPermission(input); - } else { - this.send(input, this.getSendOptions()); + this.rejectPermission(); } + + this.send(input, this.getSendOptions()); }, async reload() { diff --git a/src/components/messages/Message.vue b/src/components/messages/Message.vue index f29dc6a..0b9901e 100644 --- a/src/components/messages/Message.vue +++ b/src/components/messages/Message.vue @@ -7,9 +7,13 @@ - + Empty response @@ -30,7 +34,7 @@