コード
LlamaIndex
LlamaIndexの OpenAILike クラスに、ベースURL、キー、モデルIDを渡します。推測できない4つのフラグを設定すれば、残りのLlamaIndexの機能がそのまま使えます。
2026年10月29日 確認
インストールと接続
pip install llama-index-core llama-index-llms-openai-like
export NOKEEP_API_KEY="sk-nokeep-test" # your own key once it connectsimport 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はチャットcompletionsを送信します。これがないと、LlamaIndexはnokeepにない/v1/completionsを呼び出します。is_function_calling_model=Trueを指定すると、エージェントとchat_with_toolsがツールを送信できます。context_windowのデフォルトは3,900トークンなので、LlamaIndexは長いチャットや取得したテキストを切り詰めて収めます。モデルの実際のコンテキスト長を設定してください。DeepSeekは1,000,000、GLMは128,000です。temperatureのデフォルトは0.1で、フィクションが平板で単調になります。自分で設定してください。
チャットとストリーミング
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)ツールとエージェント
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())ループを使わず、ツール付きの呼び出しを1回だけ行うには、llm.chat_with_tools([tool], user_msg=...) を使い、llm.get_tool_calls_from_response(...) で呼び出しを読み取ります。ツール呼び出しを参照してください。
思考とその他のフィールド
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` は1でなければなりません。 複数の返信が必要な場合は、複数回呼び出してください。
- チャットcompletionsのみ対応です。
/v1/responsesも/v1/embeddingsもありません。どちらかをデフォルトにするフレームワークは、チャットcompletionsを使うように指定する必要があります。埋め込みには別のプロバイダーが必要です。
RAGアプリでは Settings.llm = llm を設定し、埋め込みモデルはそのままにしてください。nokeepが動かすのはチャットモデルで、埋め込みは動かしません。glm-5.3-flash-uncensored の場合、LlamaIndexが毎回送る temperature は無視され、x-nokeep-ignored に記載されます。
よくある質問
なぜOpenAILikeを使い、OpenAIは使わないのですか?
LlamaIndexの OpenAI クラスは、モデル名を自分の一覧と照らし合わせ、知らない名前を拒否します。OpenAILike はどんなモデル名もどんなベースURLも受け付けます。
LlamaIndexはnokeep上でドキュメントをインデックス化しますか?
いいえ。インデックス化と埋め込みは、あなたが設定した場所で実行されます。nokeepに届くのはチャットの呼び出しだけで、nokeepが保存するのは各呼び出しのトークン数だけです。