Vue 3 composables for AINative chat completions.
npm install @ainative/vue-sdk
// main.ts
import { createApp } from 'vue';
import { provideAINative } from '@ainative/vue-sdk';
import App from './App.vue';
const app = createApp(App);
app.provide('ainative', {
apiKey: import.meta.env.VITE_AINATIVE_API_KEY,
baseUrl: 'https://api.ainative.studio',
});
app.mount('#app');
Or provide inside a component:
<script setup>
import { provideAINative } from '@ainative/vue-sdk';
provideAINative({ apiKey: import.meta.env.VITE_AINATIVE_API_KEY });
</script>
<!-- ChatComponent.vue -->
<script setup lang="ts">
import { ref } from 'vue';
import { useChat } from '@ainative/vue-sdk';
import type { Message } from '@ainative/vue-sdk';
const { messages, isLoading, error, sendMessage, reset } = useChat({
model: 'claude-3-5-sonnet-20241022',
initialMessages: [],
});
const input = ref('');
async function send() {
if (!input.value.trim()) return;
const newMessages: Message[] = [
...messages.value,
{ role: 'user', content: input.value }
];
input.value = '';
await sendMessage(newMessages);
}
</script>
<template>
<div>
<div v-for="(msg, i) in messages" :key="i" :class="['message', msg.role]">
<strong>{{ msg.role }}:</strong> {{ msg.content }}
</div>
<div v-if="isLoading">Thinking...</div>
<div v-if="error" class="error">Error: {{ error.message }}</div>
<input
v-model="input"
@keydown.enter="send"
placeholder="Type a message..."
/>
<button @click="send" :disabled="isLoading">Send</button>
<button @click="reset">Reset</button>
</div>
</template>
| Option | Type | Default | Description |
|---|---|---|---|
| -------- | ------ | --------- | ------------- |
model | string | — | Model ID (e.g. claude-3-5-sonnet-20241022) |
initialMessages | Message[] | [] | Seed the conversation |
| Field | Type | Description | |
|---|---|---|---|
| ------- | ------ | ------------- | |
messages | Ref | Reactive message list | |
isLoading | Ref | True during request | |
error | `Ref| null>` | Last error | |
sendMessage | (msgs: Message[]) => Promise<...> | Send next turn | |
reset | () => void | Clear conversation |
<script setup>
import { useCredits } from '@ainative/vue-sdk';
const { balance, isLoading, error, refetch } = useCredits();
</script>
<template>
<div v-if="!isLoading">
Credits: {{ balance?.remaining_credits }} | Plan: {{ balance?.plan }}
<button @click="refetch">Refresh</button>
</div>
</template>
// plugins/ainative.client.ts
import { provideAINative } from '@ainative/vue-sdk';
export default defineNuxtPlugin(() => {
provideAINative({ apiKey: useRuntimeConfig().public.ainativeApiKey });
});
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
public: { ainativeApiKey: process.env.VITE_AINATIVE_API_KEY }
}
});
import {
useChat,
useCredits,
useAINative,
provideAINative,
type Message,
type UseChatOptions,
type UseChatReturn,
type AINativeError,
} from '@ainative/vue-sdk';
packages/sdks/vue/src/composables/useChat.ts — useChat implementationpackages/sdks/vue/src/composables/useCredits.ts — useCredits implementationpackages/sdks/vue/src/composables/useAINative.ts — Config injectionpackages/sdks/vue/src/index.ts — Package exports共 1 个版本