پرش به محتوا
همه مستندات

کد

LlamaIndex

کلاس OpenAILike در LlamaIndex را با آدرس پایه، کلیدت و شناسهٔ مدل به کار ببر. چهار پرچم را تنظیم کن که خودش نمی‌تواند حدس بزند؛ بقیهٔ LlamaIndex روی آن کار می‌کند.

بررسی‌شده در ۷ آبان ۱۴۰۵

نصب و اتصال

Shell
pip install llama-index-core llama-index-llms-openai-like
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
llm.py
import os
from llama_index.llms.openai_like import OpenAILike

llm = OpenAILike(
    model="deepseek-v4.1-flash-uncensored",
    api_base="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
    is_chat_model=True,
    is_function_calling_model=True,
    context_window=1000000,
    temperature=0.8,
)

print(llm.complete("Name three good names for a tavern.").text)
  • is_chat_model=True درخواست‌های چت می‌فرستد. بدون آن، LlamaIndex به /v1/completions می‌زند که nokeep ندارد.
  • is_function_calling_model=True به عامل‌ها و chat_with_tools اجازه می‌دهد ابزار بفرستند.
  • context_window به‌طور پیش‌فرض ۳٬۹۰۰ توکن است، پس LlamaIndex چت‌های بلند و متن بازیابی‌شده را کوتاه می‌کند تا جا شوند. آن را به زمینهٔ واقعی مدل تنظیم کن: ۱٬۰۰۰٬۰۰۰ برای DeepSeek و ۱۲۸٬۰۰۰ برای GLM.
  • temperature به‌طور پیش‌فرض ۰٫۱ است که داستان را بی‌روح و تکراری می‌کند. مقدار خودت را بگذار.

چت و استریم

Python
from llama_index.core.llms import ChatMessage

messages = [
    ChatMessage(role="system", content="You are a blunt editor."),
    ChatMessage(role="user", content="Cut this opening line to ten words: ..."),
]
print(llm.chat(messages).message.content)

for part in llm.stream_chat(messages):
    print(part.delta, end="", flush=True)

ابزارها و عامل‌ها

Python
import asyncio
from llama_index.core.agent.workflow import FunctionAgent

def get_weather(city: str) -> str:
    """Get the weather in a city."""
    return f"18°C and clear in {city}"

agent = FunctionAgent(
    tools=[get_weather],
    llm=llm,
    system_prompt="You answer questions about the weather.",
)

async def main():
    print(await agent.run("What's the weather in Lisbon?"))

asyncio.run(main())

برای یک درخواست با ابزار و بدون حلقه، از llm.chat_with_tools([tool], user_msg=...) استفاده کن و فراخوانی‌ها را با llm.get_tool_calls_from_response(...) بخوان. ببین فراخوانی ابزار.

تفکر و فیلدهای دیگر

Python
import os
from llama_index.llms.openai_like import OpenAILike

thinker = OpenAILike(
    model="deepseek-v4.1-flash-uncensored",
    api_base="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
    is_chat_model=True,
    context_window=1000000,
    max_tokens=4000,
    additional_kwargs={"reasoning_effort": "high", "min_p": 0.05},
)

additional_kwargs همان‌طور که هست در هر درخواست می‌رود. تفکر جزو max_tokens حساب می‌شود، پس جا برایش بگذار. ببین تفکر.

نکات مهم

  • `reasoning_effort` فقط مقادیر خود مدل را می‌پذیرد. deepseek-v4.1-flash-uncensored مقادیر none، low، high و max را می‌گیرد؛ glm-5.3-flash-uncensored مقادیر low و high را. مقادیر minimal، medium و xhigh اپ‌های دیگر در نزدیک‌ترین سطح مدل اجرا می‌شوند (medium مثل high، و xhigh مثل max در جایی که مدل داشته باشد)؛ هر مقدار دیگری 400 invalid_reasoning_effort می‌گیرد. ببین تفکر.
  • GLM ابزارهایش را خودش انتخاب می‌کند. glm-5.3-flash-uncensored فقط tool_choice با مقدار auto یا none را می‌گیرد. اجبار به یک ابزار (required یا نام بردن از یک تابع) 400 unsupported_tool_choice می‌گیرد. اگر لازم داری ابزاری اجباری شود، از DeepSeek استفاده کن.
  • فیلدهایی که یک مدل نمی‌پذیرد حذف می‌شوند، رد نمی‌شوند. درخواست همچنان جواب می‌گیرد و هدر پاسخ x-nokeep-ignored نام آنچه کنار گذاشته شده را می‌آورد. GLM فقط tools، tool_choice و reasoning_effort را نگه می‌دارد، پس temperature و response_format آن حذف می‌شوند. ببین هر مدل کدام فیلدها را می‌پذیرد.
  • `n` باید ۱ باشد. برای چند پاسخ، چند درخواست جدا بفرست.
  • فقط چت کامپلیشن‌ها. /v1/responses و /v1/embeddings وجود ندارد؛ چارچوبی که به یکی از آن‌ها پیش‌فرض دارد باید روی چت کامپلیشن‌ها تنظیم شود، و embedding از ارائه‌دهندهٔ دیگری گرفته شود.

برای اپ RAG، Settings.llm = llm را بگذار و مدل embedding خود را همان‌جا نگه دار: nokeep مدل چت را اجرا می‌کند، نه embedding ها. با glm-5.3-flash-uncensored، temperature که LlamaIndex در هر درخواست می‌فرستد حذف می‌شود و در x-nokeep-ignored نام برده می‌شود.

پرسش‌ها

چرا OpenAILike و نه OpenAI؟

کلاس OpenAI در LlamaIndex نام مدل را با فهرست خودش مقایسه می‌کند و نام‌هایی را که نمی‌شناسد نمی‌پذیرد. OpenAILike هر نام و هر آدرس پایه‌ای را می‌پذیرد.

آیا LlamaIndex اسناد مرا روی nokeep ایندکس می‌کند؟

نه. ایندکس‌سازی و embedding ها همان‌جایی اجرا می‌شوند که خودت تنظیم کرده‌ای. فقط درخواست‌های چت به nokeep می‌رسند و nokeep فقط تعداد توکن هر کدام را نگه می‌دارد.