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 @@
{{ part.text }}
-
+
Empty response
@@ -30,7 +34,7 @@