LangChain کتابخانهٔ پرکاربرد ساختن برنامه با مدلهای زبانی در پایتون و جاوااسکریپت است: زنجیره، ایجنت، RAG و خروجی ساختاریافته. کلاس ChatOpenAI آن نشانی پایه را میپذیرد،
پس با کلید گیسو مدلهای متنی کاتالوگ، از GPT تا Claude و Gemini، از همین یک کلاس در دسترساند. LangGraph، که ایجنتهای LangChain رویش اجرا میشوند، هم همین مدلها را به کار میبرد.
| base_url / baseURL | https://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)
// npm install @langchain/openai @langchain/core
import { ChatOpenAI } from "@langchain/openai";
const llm = new ChatOpenAI({
model: "gpt-4o-mini",
apiKey: process.env.GISOO_API_KEY,
configuration: { baseURL: "https://gisoo.pro/api/v1" },
maxTokens: 1024,
timeout: 120000,
maxRetries: 2,
});
const reply = await llm.invoke("Explain what an API key is, in two sentences.");
console.log(reply.content);
for await (const chunk of await llm.stream("Write a two-line welcome message for a bakery website.")) {
process.stdout.write(String(chunk.content));
}
مصرف توکن در پایان هر پاسخ، جریانی یا عادی، در 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'}, ...}]
import { tool } from "@langchain/core/tools";
import { z } from "zod";
const orderStatus = tool(async ({ orderId }) => "shipped", {
name: "order_status",
description: "Return the delivery status of an order by its id.",
schema: z.object({ orderId: z.string() }),
});
const agentLlm = new ChatOpenAI({ model: "openrouter/anthropic/claude-sonnet-5.5", apiKey: process.env.GISOO_API_KEY, configuration: { baseURL: "https://gisoo.pro/api/v1" } });
const msg = await agentLlm.bindTools([orderStatus]).invoke("Where is order 1042?");
console.log(msg.tool_calls);
ایجنت
در LangChain نسخهٔ ۱، 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) را همهٔ سازندهها ندارند.
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 جایگزین کنید؛ مسیر و کلید هماناند.
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 جایگزین کنید؛ مسیر و کلید هماناند.
# 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) را با پرسشتان در تیکت بفرستید تا دقیق بررسی کنیم.