ساختن یک دستیار هوش مصنوعی با Ollama و Next.js – قسمت 2 (با استفاده از بسته ها)

💡 قسمت 1 را از دست داده اید؟ با اصول اولیه شروع کنید و یاد بگیرید که چگونه یک دستیار هوش مصنوعی با استفاده از
Ollama
به صورت محلی در یک برنامه Next.js:👉 ساختن یک دستیار هوش مصنوعی با Ollama و Next.js – قسمت 1
🧠 بیایید برویم – قسمت 2
در قسمت 1 ، ما یک دستیار AI محلی را با استفاده از آن تنظیم کردیم اولامابا بعد. js، و Gemma 3: 1B مدل با حداقل تنظیم
در این مقاله ، ما کاوش خواهیم کرد دو روش قدرتمند و انعطاف پذیر برای ادغام اولاما به طور مستقیم در خود بعد. js پروژه با استفاده از کتابخانه های JavaScript.
ما راه می رویم:
- نصب بسته های لازم
- چگونه هر روش کار می کند
- مزایا و اختلافات بین آنها
🛠 ابزارهای مورد استفاده
🚀 شروع کار
اطمینان حاصل کنید که قبلاً Ollama و مدل را نصب کرده اید. این را در ترمینال خود اجرا کنید:
ollama run gemma3:1b
📥 می توانید مدل را از: https://ollama.com/library دریافت کنید
📦 روش 1-با استفاده از Ollama-JS
بسته Ollama-JS یک مشتری گره سبک برای تعامل با سرور Ollama به طور مستقیم از کد شما است.
📌 نصب:
npm install ollama
📁 مسیر API در Next.js
// app/api/chat/route.js
import ollama from 'ollama';
export async function POST(req) {
const { message } = await req.json();
const response = await ollama.chat({
model: 'gemma3:1b',
messages: [{ role: 'user', content: message }],
});
return Response.json(response);
}
با استفاده از اجرای UI موجود از قسمت 1، این روش کاملاً با آن کار خواهد کرد.
✅ مزایا:
- حداقل راه اندازی
- کنترل مستقیم بر روی مدل و درخواست ها
- عالی برای گردش کار کامل یا سفارشی
⚡ روش 2 – استفاده ai-sdk
با ollama-ai-provider
با react-markdown
(ترجیحی)
این روش از AI SDK استفاده می کند ، که پیچیدگی زیادی را خلاصه می کند و یک تجربه یکپارچه را ارائه می دهد ، به خصوص برای برنامه های متمرکز بر جلو.
📌 ابتدا بسته ها را نصب کنید:
npm install ai ollama-ai-provider react-markdown
review بررسی اجمالی:
// app/api/chat/route.ts
import { streamText } from 'ai';
import { NextRequest } from 'next/server';
import { createOllama } from 'ollama-ai-provider';
export const runtime="edge";
// Create Ollama provider with configuration
const ollamaProvider = createOllama();
// Configure the model name
const MODEL_NAME = process.env.OLLAMA_MODEL || 'gemma3:1b';
export async function POST(req: NextRequest) {
try {
const { messages } = await req.json();
if (!messages || !Array.isArray(messages) || messages.length === 0) {
return new Response('Invalid messages format', { status: 400 });
}
// Add system message if not present
const messagesWithSystem = messages[0]?.role !== 'system'
? [
{
role: 'system',
content: 'You are a helpful AI assistant powered by Ollama. You help users with their questions and tasks.'
},
...messages
]
: messages;
const result = await streamText({
model: ollamaProvider(MODEL_NAME),
messages: messagesWithSystem,
});
return result.toDataStreamResponse();
} catch (error) {
console.error('Chat API error:', error);
return new Response(
JSON.stringify({ error: 'Failed to process chat request' }),
{ status: 500 }
);
}
}
// ChatInput.tsx
import { useEffect, useRef } from 'react';
interface ChatInput2Props {
input: string;
handleInputChange: (e: React.ChangeEvent) => void;
handleSubmit: (e: React.FormEvent) => void;
isLoading: boolean;
}
export default function ChatInput2({
input,
handleInputChange,
handleSubmit,
isLoading
}: ChatInput2Props) {
const textareaRef = useRef(null);
useEffect(() => {
if (textareaRef.current) {
textareaRef.current.style.height="auto";
textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`;
}
}, [input]);
return (
);
}
// ChatMessage.tsx
import ReactMarkdown from 'react-markdown';
interface ChatMessage2Props {
role: 'user' | 'assistant' | 'system';
content: string;
}
export default function ChatMessage2({ role, content }: ChatMessage2Props) {
return (
{children}
,
code: ({ children }) => (
{children}
),
ul: ({ children }) => (
),
ol: ({ children }) => (
{children}
),
}}
>
{content}
);
}
// ChatPage.tsx
"use client"
import { useChat } from 'ai/react';
import ChatInput2 from './ChatInput2';
import ChatMessage2 from './ChatMessage2';
type MessageRole="system" | 'user' | 'assistant';
function normalizeRole(role: string): MessageRole {
if (role === 'system' || role === 'user' || role === 'assistant') {
return role as MessageRole;
}
return 'assistant';
}
export default function Chat2Page() {
const { messages, input, handleInputChange, handleSubmit, isLoading } = useChat({
api: '/api/chat2',
initialMessages: [
{
id: 'system-1',
role: 'system',
content: 'You are a helpful AI assistant powered by Ollama. You can help users with various tasks and answer their questions.',
},
],
});
return (
Powered by Ollama with markdown support and streaming responses
{messages.map((message) => (
))}
{messages.length === 1 && (
Start a conversation by typing a message below
)}
);
}
// app/chat/page.tsx
import ChatPage from '@/modules/chat/ChatPage';
export default function Chat() {
return ;
}
✅ مزایا:
- پشتیبانی داخلی برای پاسخ های جریان (برای UX در زمان واقعی)
- با اجزای سرور React هموار کار می کند
- انتزاع تمیز که باعث حفظ قابلیت حفظ می شود
- نمایش آسان نشان با React-Markdown
📸 نتیجه
🧠 خلاصه: از کدام روش باید استفاده کنید؟
نشان | ollama-js |
ai-sdk با ollama-ai-provider
|
---|---|---|
سادگی تنظیم | ✅ ساده | ✅ متوسط |
پشتیبانی جریان | ❌ کتابچه راهنما | ✅ ساخته شده |
دوستانه جلو | ❌ بیشتر با پس زمینه متمرکز شده است | ✅ متناسب با React |
نمایش مارک | ❌ کتابچه راهنما | ✅ آسان از طریق react-markdown
|
توصیه شده برای | پروژه های سفارشی/سطح پایین | AI UI آماده تولید |
👋 بعدی چیست؟
در حالی که این روش دیگری برای ساخت دستیار هوش مصنوعی شما در محلی است ،
برای یادگیری نحوه ساخت این کار با استفاده از Langchain و Ollama برای گردش کار پیشرفته AI ، روی مقاله بعدی کلیک کنید.
برنامه نویسی مبارک ….