メインコンテンツへスキップ
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を返します。

パラメータ

model
string
必須
使用するモデルID(例: 'gpt-4o', 'gpt-4o-mini'
messages
ChatMessage[]
必須
メッセージ配列
tools
Record<string, ChatTool>
ツール定義。execute関数を含めると、SDKが自動実行します。
maxToolRoundtrips
number
デフォルト:"5"
ツール自動実行の最大ラウンドトリップ数
memory
ChatMemoryOption
メモリ注入オプション
temperature
number
温度パラメータ(0〜2)
maxTokens
number
最大生成トークン数
stream
boolean
デフォルト:"true"
ストリーミングの有効/無効
onText
(text: string) => void
テキストチャンク受信時のコールバック
onToolCall
(call) => void
ツールコール発生時のコールバック
onToolResult
(result) => void
ツール結果受信時のコールバック

戻り値: 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

enabled
boolean
必須
メモリ注入を有効にするか
maxTokens
number
注入するコンテキストの最大トークン数
includeEpisodes
boolean
エピソード(Q&A履歴、変更履歴)を含めるか

ツール自動実行

ツール定義に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[];
}

ChatTool

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を構築

Memory API

コンテキスト組み立て

Knowledge API

ナレッジの管理