Chat APIは、LLMとの対話にNeuradexのナレッジを自動注入するChat Completionsインターフェースです。OpenAI SDK風のシンプルなAPIでありながら、プロジェクトのナレッジベースが自動的にコンテキストとして注入されます。
さらに、execute関数を持つツールはSDKが自動的にループ実行するため、ツール呼び出しの結果をLLMに返す処理を自分で書く必要がありません。
const client = new NdxClient({
apiKey: process.env.NEURADEX_API_KEY,
projectId: 'your-project-id',
});
// テキスト生成(メモリ自動注入)
const stream = client.chat.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: 'プロジェクトの返品ポリシーを教えて' }],
memory: { enabled: true },
});
// ストリーミングで受信
for await (const chunk of stream.textStream) {
process.stdout.write(chunk);
}
メモリが有効な場合、Neuradexはクエリに関連するナレッジ・エピソードを自動的に取得し、LLMのコンテキストに挿入します。自分でRAGパイプラインを組む必要はありません。
メソッド一覧
| メソッド | 説明 |
|---|
create(params) | Chat Completionを作成(ストリーミング対応) |
create()
Chat Completionを作成し、ChatStreamを返します。
パラメータ
使用するモデルID(例: 'gpt-4o', 'gpt-4o-mini')
ツール定義。execute関数を含めると、SDKが自動実行します。
戻り値: ChatStream
ChatStreamは多重消費パターンを提供します。同じストリームからテキスト・イベント・最終結果のいずれでもアクセスできます。
interface ChatStream {
textStream: AsyncIterable<string>; // テキストチャンクのストリーム
fullStream: AsyncIterable<ChatStreamEvent>; // 全イベントのストリーム
text: Promise<string>; // 最終テキスト全体
toolCalls: Promise<ToolCallInfo[]>; // 全ツールコール情報
usage: Promise<ChatUsage | null>; // トークン使用量
finishReason: Promise<string>; // 完了理由
}
メモリ自動注入
memoryオプションを有効にすると、ユーザーの質問に関連するナレッジとエピソードがLLMのコンテキストに自動注入されます。
const stream = client.chat.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: '最新の返品ポリシーは?' }],
memory: {
enabled: true,
maxTokens: 4000, // コンテキストのトークン予算
includeEpisodes: true, // Q&A履歴も含める
},
});
console.log(await stream.text);
ChatMemoryOption
ツール自動実行
ツール定義にexecute関数を含めると、SDKがツールの実行とLLMへの結果返却を自動で行います。LLMが「ツール不要」と判断するまで、またはmaxToolRoundtripsに達するまで自動ループします。
const stream = client.chat.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: '東京の天気を調べて、傘が必要か教えて' }],
tools: {
getWeather: {
description: '指定した都市の現在の天気を取得します',
parameters: {
type: 'object',
properties: {
city: { type: 'string', description: '都市名' },
},
required: ['city'],
},
// この関数をSDKが自動実行し、結果をLLMに返します
execute: async ({ city }) => {
const res = await fetch(`https://api.weather.example/v1/${city}`);
const data = await res.json();
return JSON.stringify(data);
},
},
},
maxToolRoundtrips: 3,
});
// ツール実行を含めた最終回答を取得
console.log(await stream.text);
execute関数のないツールが呼ばれた場合、ストリームはfinishReason: 'tool_calls'で終了します。この場合、toolCallsプロパティから呼ばれたツール情報を取得し、自分で処理できます。
ストリーミング
textStream — テキストのみ
const stream = client.chat.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: 'こんにちは!' }],
});
for await (const chunk of stream.textStream) {
process.stdout.write(chunk); // リアルタイム表示
}
fullStream — 全イベント
ツールコールや完了イベントも含めて処理する場合:
const stream = client.chat.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: '質問' }],
tools: { /* ... */ },
});
for await (const event of stream.fullStream) {
switch (event.type) {
case 'text-delta':
process.stdout.write(event.textDelta);
break;
case 'tool-call':
console.log(`ツール呼び出し: ${event.name}`, event.args);
break;
case 'tool-result':
console.log(`ツール結果: ${event.name}`, event.result);
break;
case 'roundtrip-complete':
console.log(`ラウンドトリップ ${event.roundtrip} 完了`);
break;
case 'finish':
console.log(`完了: ${event.finishReason}`);
if (event.usage) {
console.log(`トークン: ${event.usage.totalTokens}`);
}
break;
case 'error':
console.error(`エラー: ${event.error}`);
break;
}
}
コールバック方式
ストリームを消費せずにコールバックで処理することもできます:
const stream = client.chat.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: '質問' }],
onText: (text) => process.stdout.write(text),
onToolCall: (call) => console.log(`ツール: ${call.name}`),
onToolResult: (result) => console.log(`結果: ${result.result}`),
});
// 完了を待つ
const finalText = await stream.text;
非ストリーミング — 最終結果のみ
const stream = client.chat.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: '短い回答を' }],
});
// ストリームを消費せず、最終テキストだけ取得
const text = await stream.text;
const usage = await stream.usage;
console.log(text);
console.log(`使用トークン: ${usage?.totalTokens}`);
型定義
ChatMessage
interface ChatMessage {
role: 'system' | 'user' | 'assistant' | 'tool';
content: string | null;
name?: string;
tool_call_id?: string;
tool_calls?: ChatToolCall[];
}
interface ChatTool<TArgs = Record<string, unknown>> {
description: string;
parameters: Record<string, unknown>; // JSON Schema
execute?: (args: TArgs) => Promise<string> | string;
}
ChatStreamEvent
type ChatStreamEvent =
| { type: 'text-delta'; textDelta: string }
| { type: 'tool-call'; toolCallId: string; name: string; args: Record<string, unknown> }
| { type: 'tool-result'; toolCallId: string; name: string; result: string }
| { type: 'roundtrip-complete'; roundtrip: number }
| { type: 'finish'; usage: ChatUsage | null; finishReason: string }
| { type: 'error'; error: string };
ChatUsage
interface ChatUsage {
promptTokens: number;
completionTokens: number;
totalTokens: number;
}
ユースケース
メモリ付きカスタマーサポートBot
import { NdxClient } from '@neuradex/sdk';
const client = new NdxClient({
apiKey: process.env.NEURADEX_API_KEY,
projectId: process.env.NEURADEX_PROJECT_ID,
});
async function handleCustomerQuery(question: string): Promise<string> {
const stream = client.chat.create({
model: 'gpt-4o',
messages: [
{
role: 'system',
content: 'あなたはカスタマーサポートアシスタントです。丁寧に回答してください。',
},
{ role: 'user', content: question },
],
memory: {
enabled: true,
maxTokens: 8000,
includeEpisodes: true, // 過去のQ&Aも参照
},
});
return await stream.text;
}
ツール付きAIエージェント
const stream = client.chat.create({
model: 'gpt-4o',
messages: [
{ role: 'system', content: 'あなたはタスク管理アシスタントです。' },
{ role: 'user', content: '明日の会議をリマインドして' },
],
tools: {
createReminder: {
description: 'リマインダーを作成します',
parameters: {
type: 'object',
properties: {
title: { type: 'string' },
datetime: { type: 'string', format: 'date-time' },
},
required: ['title', 'datetime'],
},
execute: async ({ title, datetime }) => {
await db.reminders.create({ title, datetime });
return `リマインダー「${title}」を${datetime}に設定しました`;
},
},
searchCalendar: {
description: 'カレンダーからイベントを検索します',
parameters: {
type: 'object',
properties: {
query: { type: 'string' },
date: { type: 'string', format: 'date' },
},
required: ['query'],
},
execute: async ({ query, date }) => {
const events = await calendar.search(query, date);
return JSON.stringify(events);
},
},
},
memory: { enabled: true },
maxToolRoundtrips: 5,
});
for await (const event of stream.fullStream) {
if (event.type === 'tool-call') {
console.log(`実行中: ${event.name}...`);
}
if (event.type === 'text-delta') {
process.stdout.write(event.textDelta);
}
}
次のステップ
React
useChatフックでチャットUIを構築