Skip to Content
Megérkezett a Planitapp dokumentációja. 🎉

Planie AI

A Planie AI az alkalmazás beépített asszisztens funkciója, amely segíti a felhasználókat a tervezésben és feladatkezelésben. Az asszisztens az OpenAI API-ján keresztül használja a Mistral AI modelt, a természetes nyelvi kommunikációhoz. Az asszisztens még csak angolul ért.

A Mistral-tól a mistralai/Mistral-7B-Instruct-v0.3 modelt használja az asszisztens. A modelt a Hugging Face Inference API-ról használjuk.

Funkcionális Leírás

Képességek

  • Természetes angol nyelvű kommunikáció a felhasználóval
  • Feladatok értelmezése és kisegítés
  • Kontextus-alapú segítségnyújtás

Felhasználói Interakció

  • Chat felületen keresztüli kommunikáció
  • Azonnali válaszok
  • Személyre szabott segítségnyújtás

Technikai Implementáció

Függőségek

package.json
{ "dependencies": { "openai": "^4.77.0", } }

Környezeti Változók

.env.local
HUGGING_FACE_API_KEY=""

AI Inicializálása

actions/aichat.action.ts
const client = new OpenAI({ baseURL: "https://api-inference.huggingface.co/v1/", apiKey: process.env.HUGGING_FACE_API_KEY!, })

API Végpontok

Az API végpontok jelen esetben Server Action-ök, amelyek a Next.js-be beépített szerver oldali funkciók elvégzésére alkalmas.

A táblák, ahol az AI-al kapcsolatos adatokat tároljuk itt megtekinthetőek: Chat Messages Tábla, Chat Conversations Tábla, Daily Message Counts Tábla.

Üzenet Küldése és Válasz az AI-tól

const chatCompletion = await client.chat.completions.create({ // Megadjuk a kiválasztott modelt model: "mistralai/Mistral-7B-Instruct-v0.3", // Elküldünk 4-4 üzenetet az eddigi beszélgetésből, ha nincs beszélgetés, ezesetben // csak az adott elküldött üzenetet vesszük alapul messages: formattedMessages, // Beállítunk egy értéket a maximum tokenhez max_completion_tokens: NUMBER_OF_TOKENS_FOR_AI_COMPLETION, })

Felhasználói Felület Komponens

"use client" import { User } from "next-auth" import { SendIcon } from "lucide-react" import { Button } from "../ui/button" import { z } from "zod" import { toast } from "sonner" import { initiateConversation } from "@/actions/aichat.action" import { useRouter } from "next/navigation" import { useState } from "react" import { Spinner } from "@radix-ui/themes" import AGTextarea from "./auto-growing-textarea" export default function ChatComponent({ user }: { user: User }) { const router = useRouter() const [isLoading, setIsLoading] = useState(false) const [message, setMessage] = useState("") { /* AI name: Planie */ } /* This function will initiate a new conversation with the AI. * Then if everything is successful, it will initiate a new conversation in the db, * and redirect the user to /chat/:chatId. */ const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { try { setIsLoading(true) e.preventDefault() const validatedMessage = z .string() .max(1536) .nonempty() .safeParse(message) if (!validatedMessage.success) { throw new Error("Hibás adatokat adott meg!") } // Sending everything we need to the backend // In this case, we are sending the user's message to the AI and the user's id to initiate a new conversation const response = await initiateConversation({ message: validatedMessage.data, userId: user.id!, }) if (!response.success) { throw new Error(response.message) } router.push(`/chat/${response.conversationId}`) } catch (error: any) { toast.error(error.message, { position: "top-center" }) } finally { setIsLoading(false) } } return ( <section className="flex flex-col justify-between h-screen mx-auto w-[95%] sm:w-[85%] md:w-[70%] lg:w-[65%] xl:w-[60%] 2xl:w-[55%]"> <div className="w-full h-[90%] rounded-md no-scrollbar overflow-y-scroll flex flex-col gap-2 mt-2"> {!isLoading ? ( <div className="flex flex-col items-center justify-center h-full gap-2 font-bold selection:bg-emerald"> <h2 className="text-3xl text-center"> Üdv{" "} <strong className="text-emerald selection:bg-transparent"> {user.name} </strong> ! <br /> Miben segíthetek ma? </h2> <small className="text-xs text-muted-foreground"> Küldj üzenetet a kezdéshez! Planie még csak angolul tud. </small> </div> ) : ( <div className="flex flex-col items-center justify-center h-full gap-2 font-bold selection:bg-emerald"> <h2 className="text-3xl text-center"> Beszélgetés előkészítése... </h2> <Spinner size="3" /> </div> )} </div> <div> <form className="flex items-center gap-2 pb-2" onSubmit={handleSubmit}> <AGTextarea isLoading={isLoading} message={message} setMessage={setMessage} /> <Button variant={"outline"} type="submit" disabled={isLoading}> {isLoading ? <Spinner /> : <SendIcon size={24} />} </Button> </form> <small className="block pb-2 text-xs text-center text-muted-foreground"> Planie hibázhat. A fontos információkat mindig ellenőrizd le! </small> </div> </section> ) }

Használat és integráció

app/chat/page.tsx
// Importáljuk a komponenst import ChatComponent from "@/components/aichat/chat-component" export default async function Page() { // Kirendereljük az oldalon return <ChatComponent user={session.user} /> }

Hibakezelés

  • API hívások hibakezelése
  • Felhasználóbarát hibaüzenetek

Biztonsági Megfontolások

  • API kulcs biztonságos kezelése környezeti változóban
  • Felhasználói input validálása
  • Rate limiting implementálása (lásd: Daily Message Counts Tábla)
  • Érzékeny adatok kezelése

Továbbfejlesztési Lehetőségek

  • Hangalapú Interakció
  • Dokumentum feltöltés, illetve elemzés
  • Többnyelvűség
  • Személyre szabott válaszok fejlesztése
Utoljára frissítve: