پرش به محتوا

LangChain و LangGraph

ChatOpenAI و OpenAIEmbeddings در LangChain پایتون و جاوااسکریپت را به گیسو وصل کنید: پاسخ جریانی، ابزار، خروجی ساختاریافته، ایجنت و ChatAnthropic برای Claude.

بازبینی: ۱۵ مهر ۱۴۰۵ ۷ دقیقه مطالعه

LangChain کتابخانهٔ پرکاربرد ساختن برنامه با مدل‌های زبانی در پایتون و جاوااسکریپت است: زنجیره، ایجنت، RAG و خروجی ساختاریافته. کلاس ChatOpenAI آن نشانی پایه را می‌پذیرد، پس با کلید گیسو مدل‌های متنی کاتالوگ، از GPT تا Claude و Gemini، از همین یک کلاس در دسترس‌اند. LangGraph، که ایجنت‌های LangChain رویش اجرا می‌شوند، هم همین مدل‌ها را به کار می‌برد.

base_url / baseURLhttps://gisoo.pro/api/v1
api_key / apiKeyکلید گیسو، از متغیر محیطی GISOO_API_KEY
modelشناسهٔ دقیق مدل گیسو، مثلاً gpt-4o-mini یا openrouter/anthropic/claude-sonnet-5.5

مدل گفت‌وگو و پاسخ جریانی

برای سرورها و کاربران داخل ایران، در این نمونه نشانی gisoo.pro را با ir.gisoo.pro جایگزین کنید؛ مسیر و کلید همان‌اند.

# pip install -U langchain-openai
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-4o-mini",
    base_url="https://gisoo.pro/api/v1",
    api_key=os.environ["GISOO_API_KEY"],
    temperature=0.3,
    max_tokens=1024,
    timeout=120,
    max_retries=2,
)

print(llm.invoke("Explain what an API key is, in two sentences.").content)

# Streaming: chunks arrive as the model writes them
for chunk in llm.stream("Write a two-line welcome message for a bakery website."):
    print(chunk.content, end="", flush=True)

مصرف توکن در پایان هر پاسخ، جریانی یا عادی، در usage_metadata پیام می‌آید؛ گیسو آن را همیشه می‌فرستد. در نسخه‌های تازهٔ langchain-openai گزینه‌ای برای استفاده از Responses API هست (use_responses_api)؛ برای مدل‌های غیر OpenAI آن را روشن نکنید.

ابزارها (Tool Calling)

با bind_tools تابع‌های خودتان را به مدل معرفی کنید؛ مدل تصمیم می‌گیرد کدام را با چه ورودی صدا بزند. مدلی بگذارید که فراخوانی ابزار دارد؛ Claude و GPT در این کار دقیق‌اند.

برای سرورها و کاربران داخل ایران، در این نمونه نشانی gisoo.pro را با ir.gisoo.pro جایگزین کنید؛ مسیر و کلید همان‌اند.

from langchain_core.tools import tool

@tool
def order_status(order_id: str) -> str:
    """Return the delivery status of an order by its id."""
    return "shipped"                     # call your own service here

agent_llm = ChatOpenAI(model="openrouter/anthropic/claude-sonnet-5.5", base_url="https://gisoo.pro/api/v1", api_key=os.environ["GISOO_API_KEY"])

msg = agent_llm.bind_tools([order_status]).invoke("Where is order 1042?")
print(msg.tool_calls)    # [{'name': 'order_status', 'args': {'order_id': '1042'}, ...}]

ایجنت

در LangChain نسخهٔ ۱، create_agent چرخهٔ «فکر، صدا زدن ابزار، خواندن نتیجه» را خودش اجرا می‌کند:

Python create_agent
# pip install -U langchain langchain-openai   (LangChain 1.x; the agent runs on LangGraph)
from langchain.agents import create_agent

agent = create_agent(model=agent_llm, tools=[order_status], system_prompt="Answer in Persian.")
result = agent.invoke({"messages": [{"role": "user", "content": "Where is order 1042?"}]})
print(result["messages"][-1].content)

خروجی ساختاریافته

با with_structured_output پاسخ را مستقیم به شکل یک شیء Pydantic بگیرید. method="function_calling" با بیشترین تعداد مدل‌ها کار می‌کند؛ حالت پیش‌فرض (json_schema) را همهٔ سازنده‌ها ندارند.

Python with_structured_output
from pydantic import BaseModel, Field

class Ticket(BaseModel):
    category: str = Field(description="billing, technical or other")
    urgent: bool

classifier = llm.with_structured_output(Ticket, method="function_calling")
print(classifier.invoke("My card was charged twice and I need it fixed today!"))
# category='billing' urgent=True

امبدینگ و RAG

برای سرورها و کاربران داخل ایران، در این نمونه نشانی gisoo.pro را با ir.gisoo.pro جایگزین کنید؛ مسیر و کلید همان‌اند.

Python OpenAIEmbeddings
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(
    model="text-embedding-3-small",
    base_url="https://gisoo.pro/api/v1",
    api_key=os.environ["GISOO_API_KEY"],
)
vectors = embeddings.embed_documents(["first text", "second text"])
query = embeddings.embed_query("what is in the first text?")

همین شیء را به هر پایگاه برداری LangChain (Chroma، FAISS، Qdrant، PGVector) بدهید. اگر مدل امبدینگی غیر از مدل‌های OpenAI انتخاب کردید، check_embedding_ctx_length=False را هم بگذارید تا LangChain متن را با توکن‌شمار OpenAI تکه نکند. مدل‌ها و ابعاد بردار در امبدینگ آمده است.

ChatAnthropic برای Claude

اگر کدتان از قبل با ChatAnthropic نوشته شده، همان را نگه دارید؛ گیسو Messages API شرکت Anthropic را هم می‌پذیرد:

برای سرورها و کاربران داخل ایران، در این نمونه نشانی gisoo.pro را با ir.gisoo.pro جایگزین کنید؛ مسیر و کلید همان‌اند.

Python ChatAnthropic
# pip install -U langchain-anthropic
from langchain_anthropic import ChatAnthropic

claude = ChatAnthropic(
    model="claude-sonnet-5-5",
    base_url="https://gisoo.pro/api",            # not .../v1 — the Anthropic SDK adds /v1/messages
    api_key=os.environ["GISOO_API_KEY"],
    max_tokens=1024,
)
print(claude.invoke("Hello, Claude").content)

کدام مدل را بگذارید

برایشناسهٔ مدلپنجرهٔ ورودی (توکن)ورودی / خروجی (دلار برای هر یک میلیون توکن)
زنجیره‌های ساده، خلاصه، دسته‌بندی
ارزان و سریع.
gpt-4o-mini ۱۲۸٬۰۰۰ $0.21 / $0.84
ایجنت با چند ابزار openrouter/anthropic/claude-sonnet-5.5 ۱٬۰۰۰٬۰۰۰ $3.0595 / $15.2975
سند بلند و ورودی تصویر gemini-3.6-flash ۱٬۰۴۸٬۵۷۶ $1.05 / $5.25
حجم بالا با هزینهٔ کم deepseek-v4-flash ۱٬۰۰۰٬۰۰۰ $0.42 / $1.68

شناسه‌ها و قیمت‌ها هنگام باز شدن این صفحه از کاتالوگ خوانده می‌شوند و با تغییر قیمت سرویس‌دهنده عوض می‌شوند. فهرست کامل، با قیمت هر مدل به سکه، در صفحهٔ مدل‌ها است.

خطاهای رایج

نشانهعلتراه رفع
NotFoundError (۴۰۴) برای هر مدلینشانی پایه بدون /v1.دقیقاً https://gisoo.pro/api/v1. در جاوااسکریپت نشانی داخل configuration.baseURL می‌رود.
404 model_not_foundشناسهٔ مدل دقیق نیست.شناسه را از صفحهٔ مدل‌ها کپی کنید.
AuthenticationError (۴۰۱)کلید خوانده نشده؛ LangChain بدون api_key سراغ OPENAI_API_KEY می‌رود.api_key را صریح بدهید.
خطای خروجی ساختاریافته روی Claude یا Geminiحالت json_schema سخت‌گیرانه برای آن مدل در دسترس نیست.method="function_calling" بگذارید.
402 insufficient_creditاعتبار برای مبلغ کنارگذاشتنی کافی نیست.شارژ کنید یا max_tokens را کمتر بگذارید.
RateLimitError (۴۲۹) در پردازش دسته‌ایbatch درخواست‌های همزمان زیادی می‌فرستد.config={"max_concurrency": 4} بدهید.

پرسش‌های پرتکرار

LlamaIndex هم کار می‌کند؟

بله، با کلاس OpenAILike. نمونهٔ کامل در یکپارچه‌سازی‌ها آمده است.

می‌توانم چند مدل را با مسیر پشتیبان کنار هم بگذارم؟

بله، با with_fallbacks در LangChain، یا با LiteLLM اگر چند سرویس و کلید را یک‌جا مدیریت می‌کنید.

LangSmith لازم است؟

نه. LangSmith ابزار جدای ردیابی است و ربطی به اتصال به گیسو ندارد؛ اگر روشنش کنید، ردپای اجراها به سرور LangSmith می‌رود.

راهنماهای مرتبط

پاسخ پرسشتان را پیدا نکردید؟

شناسهٔ درخواست (هدر X-Request-Id) را با پرسشتان در تیکت بفرستید تا دقیق بررسی کنیم.

تیکت پشتیبانی