ساخت یک عامل هواشناسی هوش مصنوعی MVP با Node.js و OpenRouter 🌤️🤖

آیا تا به حال خواسته اید که رابط ChatGPT خود را ایجاد کنید که واقعاً می تواند انجام دهید چیزها؟ امروز ما راه خود را از هم جدا خواهیم کرد موسم هوش مصنوعییک چت بات ساخته شده با Node.js که می تواند آب و هوا، دما و رطوبت را در زمان واقعی برای هر شهری بررسی کند.
⚠️ سلب مسئولیت: این پروژه یک MVP (حداقل محصول قابل دوام) است. درست است برنامه آماده تولید نیست. در عوض، به عنوان یک نمایش مفهومی از خط لوله عامل AI با استفاده از یک ابزار (اغلب با معماری های Agent/RAG مرتبط است) عمل می کند. از حالت ساده در حافظه استفاده می کند و
setIntervalنظرسنجی که برای آموزش عالی است اما باید با پایگاه داده ها و WebSocket ها برای تولید جایگزین شود!
🔗 مخزن GitHub: [https://github.com/OriginalAnkit/ai-rag-mausam-ai]
اسکرین شات mausam ai
بیایید به نحوه عملکرد کد بپردازیم!
RAG چیست و چرا به آن نیاز داریم؟
RAG مخفف تولید با استخراج افزوده. برای درک اینکه چرا این بسیار مهم است، ابتدا باید محدودیت عظیم مدل های زبان بزرگ (LLM) را درک کنیم:
مدل های آموزش دیده داده های بلادرنگ ندارند.
دانش LLM بر اساس زمان آموزش در زمان منجمد می شود. اگر از یک مدل استاندارد جدا شده بپرسید «در حال حاضر آب و هوای بمبئی چگونه است؟»، یا به یک پاسخ تصادفی توهم می زند یا عذرخواهی می کند که نمی تواند در وب زنده گشت و گذار کند.
اینجا جایی است که جریان های کاری RAG و Agentic وارد عمل می شوند.
به جای تکیه صرفاً بر حافظه داخلی ثابت LLM، ما افزایش دهد فرآیند تولید آن از بازیابی ابتدا داده های خارجی در راه اندازی سنتی RAG، این به معنای بازیابی اسناد از یک پایگاه داده برداری است.
در مال ما موسم هوش مصنوعی MVP، ما یک رویکرد ابزارسازی عامل را در پیش می گیریم: به LLM یک ابزار می دهیم (get_mausam) که می تواند برای بازیابی گزارش آب و هوای زنده در زمان واقعی از یک API خارجی (wttr.in). سپس این دادههای زنده را مستقیماً به متن گفتگو تزریق میکنیم تا LLM بتواند پاسخی دقیق و بهروز ایجاد کند!
1. مغزها: دستورات سیستم و منطق عامل
جادوی این ربات ادامه دارد helper.js. به جای اینکه به سادگی از LLM بخواهیم یک متن بنویسد، LLM را مجبور می کنیم تا در یک حلقه ساختاریافته فکر کند: START ➡️ PLAN ➡️ TOOL ➡️ OUTPUT.
ما با استفاده از یک دستور سیستم سختگیرانه و اجباری کردن فرمت پاسخ به JSON به این امر دست مییابیم.
const MAIN_SYSTEM_PROMPT = `
You are an AI agent that reply only to queries related to weather, temperate and humidity.
STRICT RULES:
- output must a single valid json without any extra space, text.
- Run one step at a time. Do not run multiple steps in parallel. Stop after each step
- Strictly follow the Sequence of steps must be START then PLAN then TOOL then OUTPUT
OUTPUT FORMAT:
{
"step": START|PLAN|TOOL|OUTPUT,
"context": "string",
"input": "string",
"usefull": "boolean",
"toolname": "string"
}
AVAILABLE TOOL:
- get_mausam -> return temperate, weather and humidity for a given location
`;
با پیاده سازی این ساختار، Backend ما می تواند JSON را مرحله به مرحله بخواند. اگر هوش مصنوعی تصمیم بگیرد که باید از ابزاری استفاده کند، خروجی می دهد {"step": "TOOL", "toolname": "get_mausam", "input": "Mumbai"}.
اجرای حلقه
باطن ما این را رهگیری می کند و ابزار را از طرف هوش مصنوعی اجرا می کند:
const getConversation = async function (messages, context = []) {
while (true) {
let completion = await callOpenRouterModel(messages);
let output = safeParseJSON(completion?.choices[0].message.content);
if (output?.step === "OUTPUT") {
// The AI has the final answer
context.push({ sender: "SYSTEM", message: output.context });
return;
} else if (output?.step === "TOOL" && output.toolname === "get_mausam") {
// The AI requested a tool. We fetch the data and feed it back!
let tool_resp = await getWeather(output.input);
messages.push({ role: "system", content: `RESPONSE FROM get_mausam: ${tool_resp}` });
} else {
// Intermediate thinking steps (START, PLAN)
context.push({ sender: "BOT", message: output.context + '...' });
messages.push({ role: "system", content: JSON.stringify(output) });
}
await sleep(5000); // Respect API rate limits
}
}
2. ابزار: استخراج داده های آب و هوا
وقتی هوش مصنوعی تماس می گیرد get_mausam، جاوا اسکریپت ساده را اجرا می کند fetch به wttr.in، یک سرویس هواشناسی شگفت انگیز کنسول محور.
async function getWeather(city) {
// Custom formatting for wttr.in to return exactly what we need
const url = \`https://wttr.in/\${encodeURIComponent(city)}?format=%c+%C+%t+%h+%T\`;
const response = await fetch(url);
if (!response.ok) throw new Error(\`Request failed\`);
const data = await response.text();
return data.trim(); // Returns e.g., "☀️ Clear +22°C 45%"
}
سپس این داده ها دوباره به آن اضافه می شوند messages آرایه به طوری که LLM بتواند آن را بخواند و نهایی آن را فرموله کند OUTPUT گام
3. تماس های دائمی API
برای اینکه MVP خود را در برابر محدودیتهای نرخ یا فرسودگی کلید API قوی نگه داریم، هنگام فراخوانی OpenRouter یک مکانیسم بازگشتی ایجاد کردیم. اگر کلید اصلی از کار بیفتد، به طور خودکار یک کلید ثانویه را امتحان می کند!
const callOpenRouterModel = async function (messages) {
const requestPayload = {
model: "minimax/minimax-m3:free",
messages: messages,
response_format: { type: "json_object" }
};
try {
return await client.chat.completions.create(requestPayload);
} catch (error) {
console.error("Primary key failed, trying fallback key...", error.message);
const fallbackClient = new OpenAI({
baseURL: "https://openrouter.ai/api/v1",
apiKey: process.env.OPEN_ROUTER_KEY_2,
});
return await fallbackClient.chat.completions.create(requestPayload);
}
}
4. Express Backend & Chat UI
ما همه این منطق را در یک سرور Express.js ساده قرار می دهیم (app.jsما جهانی را پشتیبانی می کنیم messages آرایه (باز هم فقط MVP – از یک پایگاه داده تولید واقعی استفاده کنید!) و a را در معرض نمایش قرار دهید GET /messages نقطه پایانی
در قسمت جلو (index.ejs، ما یک رابط کاربری شیک در حالت تاریک داریم. برای به روز نگه داشتن چت در حالی که هوش مصنوعی از آن عبور می کند START -> PLAN -> TOOL در مراحل، رابط از نظرسنجی ساده استفاده می کند:
// Poll every 10 seconds to fetch new messages/thoughts from the bot
setInterval(fetchMessages, 10000);
ما حتی مراحل میانی “تفکر” را سبک کردیم (the BOT فرستنده) غیر از پاسخ نهایی (the SYSTEM فرستنده) بنابراین کاربران بدانند که ربات در پس زمینه اجرا می شود!
نتیجه گیری
ساخت خطوط لوله Agentic به چارچوب های عظیم نیاز ندارد. با پیاده سازی طرحواره های JSON و نوشتن ساده while چرخه، شما می توانید به LLM دسترسی به دنیای خارج بدهید.
به راحتی می توانید مخزن GitHub را بررسی کنید و خودتان آن را امتحان کنید. ابزارهای جدیدی مانند استخراج خبر یا ماشین حساب اضافه کنید!
کد نویسی مبارک!🚀


