יצירת Agent ראשון
ארכיטקטורת Model + Harness ב-LangChain
createAgent, הפונקציה המרכזית ב-LangChain, מקבלת שני מרכיבים עיקריים: model — איזה מודל שפה מפעיל את ה-agent, ו-harness — כל מה שעוטף אותו: system prompt (הוראות), tools (כלים זמינים), ו-middleware (הרחבות שמתערבות בלולאה, כמו guardrails או ניהול context).
המבנה הזה שקוף בכוונה: אין "קסם" שמסתתר מאחורי הקריאה — כל agent הוא בפשטות מודל שקורא לכלים בלולאה עד שהמשימה מסתיימת, בדיוק כמו הלולאה האגנטית שהוגדרה בנושא AI Agents.
התקנה והגדרה בסיסית
כדי להתחיל צריך את חבילת ה-npm הראשית ומפתח API לספק מודל שבחרתם (למשל Anthropic או OpenAI), שנטען בדרך כלל ממשתנה סביבה.
npm install langchain
# .env
ANTHROPIC_API_KEY=sk-...יצירת Agent עם createAgent
הדוגמה הבאה יוצרת agent פשוט עם כלי אחד שמחזיר מזג אוויר: מגדירים את הכלי עם tool ו-schema של zod לאימות הפרמטרים, ואז מעבירים אותו יחד עם המודל וה-system prompt ל-createAgent.
import { createAgent, tool } from "langchain";
import { z } from "zod";
const getWeather = tool(
async ({ city }: { city: string }) => `${city}: שמש, 22 מעלות`,
{
name: "get_weather",
description: "מחזיר את מזג האוויר הנוכחי בעיר נתונה",
schema: z.object({ city: z.string() }),
}
);
const agent = createAgent({
model: "anthropic:claude-sonnet-5",
tools: [getWeather],
systemPrompt: "אתה עוזר שמדווח על מזג אוויר בקצרה ובעברית.",
});הרצת Agent: invoke, היסטוריית הודעות ו-thread persistence
מריצים agent עם agent.invoke, ומעבירים מערך messages בדיוק כמו בקריאה ישירה ל-API של מודל שפה — ה-agent דואג בעצמו להריץ את לולאת ה-tool calling עד שיש תשובה סופית.
כדי לשמר היסטוריית שיחה בין קריאות (למשל בצ'אט רב-שלבי), מעבירים thread_id קבוע דרך configurable — LangChain שומר את ההיסטוריה משויכת ל-thread הזה, כך שבקריאה הבאה ה-agent "זוכר" מה נאמר קודם, בלי שתצטרכו לנהל את זה ידנית.
const result = await agent.invoke(
{ messages: [{ role: "user", content: "מה מזג האוויר בתל אביב?" }] },
{ configurable: { thread_id: "chat-1" } }
);
console.log(result.messages.at(-1)?.content);
// → "תל אביב: שמש, 22 מעלות"דוגמה מלאה: שיחה רב-שלבית עם אותו agent
כשקוראים שוב ל-agent.invoke עם אותו thread_id, ה-agent רואה את כל ההודעות הקודמות בשיחה, ולכן יכול לענות על שאלת המשך בלי שנחזור ונציין את ההקשר במפורש.
זה בדיוק ה-thread persistence שהוזכר למעלה: ה-state (כל ה-messages) משויך ל-thread_id ברקע, כך שקוד הצריכה שלכם נשאר פשוט — אתם רק שולחים את ההודעה החדשה, לא את כל ההיסטוריה בכל פעם.
const followUp = await agent.invoke(
{ messages: [{ role: "user", content: "ומה לגבי מחר?" }] },
{ configurable: { thread_id: "chat-1" } }
);
console.log(followUp.messages.at(-1)?.content);