🏄‍♂️

Dify の Java クライアントを一つおすすめします

に公開

Dify Java Client

Dify Java Clientは、Difyプラットフォームと連携するためのJavaクライアントライブラリです。DifyアプリケーションAPIとナレッジベースAPIの完全なサポートを提供し、Java開発者がDifyの生成AIの機能を自らのアプリケーションに簡単に統合できるようにします。

機能

Dify Java Clientは以下の主要機能を提供します:

1. 複数のアプリケーションタイプのサポート

  • チャットアプリケーション: DifyChatClientを通じて会話型アプリケーションを利用し、会話管理、メッセージフィードバックなどの機能をサポート
  • テキスト生成アプリケーション: DifyCompletionClientを通じてテキスト生成アプリケーションを利用
  • ワークフロー制御会話: DifyChatflowClientを通じてワークフロー制御の会話型アプリケーションを利用
  • ワークフローアプリケーション: DifyWorkflowClientを通じてワークフローアプリケーションを利用
  • ナレッジベース管理: DifyDatasetsClientを通じてナレッジベース、ドキュメント、検索を管理

2. 豊富なインタラクションモード

  • ブロッキングモード: 同期的にAPIを呼び出し、完全な応答を待機
  • ストリーミングモード: コールバックを通じてリアルタイムで生成されたコンテンツを受信し、タイプライター効果をサポート
  • ファイル処理: ファイルのアップロード、音声からテキスト、テキストから音声などのマルチメディア機能をサポート

3. 完全な会話管理

  • 会話の作成と管理
  • 履歴メッセージの取得
  • 会話の名前変更
  • メッセージフィードバック(いいね/悪いね)
  • 提案質問の取得

4. ナレッジベースの完全サポート

  • ナレッジベースの作成と管理
  • ドキュメントのアップロードと管理
  • ドキュメントセグメント管理
  • セマンティック検索

5. 柔軟な設定オプション

  • カスタム接続タイムアウト
  • カスタム読み取り/書き込みタイムアウト
  • カスタムHTTPクライアント

インストール

システム要件

  • Java 8以上
  • Maven 3.x または Gradle 4.x以上

Maven

<dependency>
    <groupId>io.github.imfangs</groupId>
    <artifactId>dify-java-client</artifactId>
    <version>1.0.4</version>
</dependency>

Gradle

implementation 'io.github.imfangs:dify-java-client:1.0.4'

クイックスタート

クライアントの作成

// 完全なDifyクライアントの作成
DifyClient client = DifyClientFactory.createClient("https://api.dify.ai/v1", "your-api-key");

// 特定タイプのクライアントの作成
DifyChatClient chatClient = DifyClientFactory.createChatClient("https://api.dify.ai/v1", "your-api-key");
DifyCompletionClient completionClient = DifyClientFactory.createCompletionClient("https://api.dify.ai/v1", "your-api-key");
DifyChatflowClient chatflowClient = DifyClientFactory.createChatWorkflowClient("https://api.dify.ai/v1", "your-api-key");
DifyWorkflowClient workflowClient = DifyClientFactory.createWorkflowClient("https://api.dify.ai/v1", "your-api-key");
DifyDatasetsClient datasetsClient = DifyClientFactory.createDatasetsClient("https://api.dify.ai/v1", "your-api-key");

// カスタム設定でクライアントを作成
DifyConfig config = DifyConfig.builder()
    .baseUrl("https://api.dify.ai/v1")
    .apiKey("your-api-key")
    .connectTimeout(5000)
    .readTimeout(60000)
    .writeTimeout(30000)
    .build();

DifyClient clientWithConfig = DifyClientFactory.createClient(config);

使用例

1. チャットアプリケーション

ブロッキングモード

// チャットクライアントの作成
DifyChatClient chatClient = DifyClientFactory.createChatClient("https://api.dify.ai/v1", "your-api-key");

// チャットメッセージの作成
ChatMessage message = ChatMessage.builder()
    .query("こんにちは、自己紹介をお願いします")
    .user("user-123")
    .responseMode(ResponseMode.BLOCKING)
    .build();

// メッセージを送信して応答を取得
ChatMessageResponse response = chatClient.sendChatMessage(message);
System.out.println("返信: " + response.getAnswer());
System.out.println("会話ID: " + response.getConversationId());
System.out.println("メッセージID: " + response.getMessageId());

ストリーミングモード

// チャットメッセージの作成
ChatMessage message = ChatMessage.builder()
    .query("短い物語を教えてください")
    .user("user-123")
    .responseMode(ResponseMode.STREAMING)
    .build();

// ストリーミングメッセージの送信
chatClient.sendChatMessageStream(message, new ChatStreamCallback() {
    @Override
    public void onMessage(MessageEvent event) {
        System.out.println("メッセージチャンク受信: " + event.getAnswer());
    }

    @Override
    public void onMessageEnd(MessageEndEvent event) {
        System.out.println("メッセージ終了、完全なメッセージID: " + event.getMessageId());
    }

    @Override
    public void onError(ErrorEvent event) {
        System.err.println("エラー: " + event.getMessage());
    }

    @Override
    public void onException(Throwable throwable) {
        System.err.println("例外: " + throwable.getMessage());
    }
});

会話管理

// 会話履歴メッセージの取得
MessageListResponse messages = chatClient.getMessages(conversationId, "user-123", null, 10);

// 会話リストの取得
ConversationListResponse conversations = chatClient.getConversations("user-123", null, 10, "-updated_at");

// 会話の名前変更
Conversation renamedConversation = chatClient.renameConversation(conversationId, "新しい会話名", false, "user-123");

// 会話の削除
SimpleResponse deleteResponse = chatClient.deleteConversation(conversationId, "user-123");

メッセージフィードバック

// メッセージフィードバックの送信(いいね)
SimpleResponse feedbackResponse = chatClient.feedbackMessage(messageId, "like", "user-123", "これは良い回答です");

// 提案質問の取得
SuggestedQuestionsResponse suggestedQuestions = chatClient.getSuggestedQuestions(messageId, "user-123");

音声変換

// 音声からテキスト
AudioToTextResponse textResponse = chatClient.audioToText(audioFile, "user-123");
System.out.println("変換されたテキスト: " + textResponse.getText());

// テキストから音声
byte[] audioData = chatClient.textToAudio(null, "これはテストテキストです", "user-123");

2. テキスト生成アプリケーション

ブロッキングモード

// テキスト生成クライアントの作成
DifyCompletionClient completionClient = DifyClientFactory.createCompletionClient("https://api.dify.ai/v1", "your-api-key");

// リクエストの作成
Map<String, Object> inputs = new HashMap<>();
inputs.put("content", "なす");

CompletionRequest request = CompletionRequest.builder()
    .inputs(inputs)
    .responseMode(ResponseMode.BLOCKING)
    .user("user-123")
    .build();

// リクエストを送信して応答を取得
CompletionResponse response = completionClient.sendCompletionMessage(request);
System.out.println("生成されたテキスト: " + response.getAnswer());

ストリーミングモード

// リクエストの作成
Map<String, Object> inputs = new HashMap<>();
inputs.put("content", "なす");

CompletionRequest request = CompletionRequest.builder()
    .inputs(inputs)
    .responseMode(ResponseMode.STREAMING)
    .user("user-123")
    .build();

// ストリーミングリクエストの送信
completionClient.sendCompletionMessageStream(request, new CompletionStreamCallback() {
    @Override
    public void onMessage(MessageEvent event) {
        System.out.println("メッセージチャンク受信: " + event.getAnswer());
    }

    @Override
    public void onMessageEnd(MessageEndEvent event) {
        System.out.println("メッセージ終了、完全なメッセージID: " + event.getMessageId());
    }

    @Override
    public void onComplete() {
        System.out.println("完了");
    }

    @Override
    public void onError(ErrorEvent event) {
        System.err.println("エラー: " + event.getMessage());
    }

    @Override
    public void onException(Throwable throwable) {
        System.err.println("例外: " + throwable.getMessage());
    }
});

生成の停止

// テキスト生成の停止
SimpleResponse stopResponse = completionClient.stopCompletion(taskId, "user-123");

3. ワークフローアプリケーション

ブロッキングモード

// ワークフロークライアントの作成
DifyWorkflowClient workflowClient = DifyClientFactory.createWorkflowClient("https://api.dify.ai/v1", "your-api-key");

// ワークフローリクエストの作成
Map<String, Object> inputs = new HashMap<>();
inputs.put("content", "AIアプリケーションのシナリオを紹介してください");

WorkflowRunRequest request = WorkflowRunRequest.builder()
    .inputs(inputs)
    .responseMode(ResponseMode.BLOCKING)
    .user("user-123")
    .build();

// ワークフローを実行して応答を取得
WorkflowRunResponse response = workflowClient.runWorkflow(request);
System.out.println("ワークフロー実行ID: " + response.getTaskId());

// 結果の出力
if (response.getData() != null) {
    for (Map.Entry<String, Object> entry : response.getData().getOutputs().entrySet()) {
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }
}

ストリーミングモード

// ワークフローリクエストの作成
Map<String, Object> inputs = new HashMap<>();
inputs.put("content", "機械学習の基本原理を詳しく説明してください");

WorkflowRunRequest request = WorkflowRunRequest.builder()
    .inputs(inputs)
    .responseMode(ResponseMode.STREAMING)
    .user("user-123")
    .build();

// ワークフローストリーミングリクエストの実行
workflowClient.runWorkflowStream(request, new WorkflowStreamCallback() {
    @Override
    public void onWorkflowStarted(WorkflowStartedEvent event) {
        System.out.println("ワークフロー開始: " + event);
    }

    @Override
    public void onNodeStarted(NodeStartedEvent event) {
        System.out.println("ノード開始: " + event);
    }

    @Override
    public void onNodeFinished(NodeFinishedEvent event) {
        System.out.println("ノード完了: " + event);
    }

    @Override
    public void onWorkflowFinished(WorkflowFinishedEvent event) {
        System.out.println("ワークフロー完了: " + event);
    }

    @Override
    public void onError(ErrorEvent event) {
        System.err.println("エラー: " + event.getMessage());
    }

    @Override
    public void onException(Throwable throwable) {
        System.err.println("例外: " + throwable.getMessage());
    }
});

ワークフロー管理

// ワークフローの停止
WorkflowStopResponse stopResponse = workflowClient.stopWorkflow(taskId, "user-123");

// ワークフロー実行状況の取得
WorkflowRunStatusResponse statusResponse = workflowClient.getWorkflowRun(workflowRunId);

// ワークフローログの取得
WorkflowLogsResponse logsResponse = workflowClient.getWorkflowLogs(null, null, 1, 10);

4. ナレッジベース管理

ナレッジベースの作成と管理

// ナレッジベースクライアントの作成
DifyDatasetsClient datasetsClient = DifyClientFactory.createDatasetsClient("https://api.dify.ai/v1", "your-api-key");

// ナレッジベースの作成
CreateDatasetRequest createRequest = CreateDatasetRequest.builder()
    .name("テストナレッジベース-" + System.currentTimeMillis())
    .description("これはテストナレッジベースです")
    .indexingTechnique("high_quality")
    .permission("only_me")
    .provider("vendor")
    .build();

DatasetResponse dataset = datasetsClient.createDataset(createRequest);
System.out.println("作成されたナレッジベースID: " + dataset.getId());

// ナレッジベースリストの取得
DatasetListResponse datasetList = datasetsClient.getDatasets(1, 10);
System.out.println("ナレッジベース総数: " + datasetList.getTotal());

ドキュメント管理

// テキストによるドキュメント作成
CreateDocumentByTextRequest docRequest = CreateDocumentByTextRequest.builder()
    .name("テストドキュメント-" + System.currentTimeMillis())
    .text("これはテストドキュメントの内容です。\nこれは2行目の内容です。\nこれは3行目の内容です。")
    .indexingTechnique("high_quality")
    .build();

DocumentResponse docResponse = datasetsClient.createDocumentByText(datasetId, docRequest);
System.out.println("作成されたドキュメントID: " + docResponse.getDocument().getId());

// ドキュメントリストの取得
DocumentListResponse docList = datasetsClient.getDocuments(datasetId, null, 1, 10);
System.out.println("ドキュメント総数: " + docList.getTotal());

// ドキュメントの削除
SimpleResponse deleteResponse = datasetsClient.deleteDocument(datasetId, documentId);

ナレッジベース検索

// 検索リクエストの作成
RetrievalModel retrievalModel = new RetrievalModel();
retrievalModel.setTopK(3);
retrievalModel.setScoreThreshold(0.5f);

RetrieveRequest retrieveRequest = RetrieveRequest.builder()
    .query("人工知能とは何ですか")
    .retrievalModel(retrievalModel)
    .build();

// 検索リクエストの送信
RetrieveResponse retrieveResponse = datasetsClient.retrieveDataset(datasetId, retrieveRequest);

// 検索結果の処理
System.out.println("検索クエリ: " + retrieveResponse.getQuery().getContent());
System.out.println("検索結果数: " + retrieveResponse.getRecords().size());
retrieveResponse.getRecords().forEach(record -> {
    System.out.println("スコア: " + record.getScore());
    System.out.println("内容: " + record.getSegment().getContent());
});

API リファレンス

クライアントタイプ

クライアントタイプ 説明 主な機能
DifyClient 完全クライアント すべてのAPI機能をサポート
DifyChatClient チャットアプリケーションクライアント 会話、会話管理、メッセージフィードバック
DifyCompletionClient テキスト生成アプリケーションクライアント テキスト生成、生成停止
DifyChatflowClient ワークフロー制御会話アプリケーションクライアント ワークフロー制御会話
DifyWorkflowClient ワークフローアプリケーションクライアント ワークフロー実行、ワークフロー管理
DifyDatasetsClient ナレッジベースクライアント ナレッジベース管理、ドキュメント管理、検索

レスポンスモード

モード 列挙値 説明
ブロッキングモード ResponseMode.BLOCKING 同期呼び出し、完全な応答を待機
ストリーミングモード ResponseMode.STREAMING コールバックを通じてリアルタイムで生成されたコンテンツを受信

イベントタイプ

イベントタイプ 説明
MessageEvent メッセージイベント、生成されたテキストチャンクを含む
MessageEndEvent メッセージ終了イベント、完全なメッセージIDを含む
MessageFileEvent ファイルメッセージイベント、ファイル情報を含む
TtsMessageEvent テキストから音声へのイベント
TtsMessageEndEvent テキストから音声への終了イベント
MessageReplaceEvent メッセージ置換イベント
AgentMessageEvent エージェントメッセージイベント
AgentThoughtEvent エージェント思考イベント
WorkflowStartedEvent ワークフロー開始イベント
NodeStartedEvent ノード開始イベント
NodeFinishedEvent ノード完了イベント
WorkflowFinishedEvent ワークフロー完了イベント
ErrorEvent エラーイベント
PingEvent ピングイベント

高度な設定

カスタムHTTPクライアント

// カスタム設定の作成
DifyConfig config = DifyConfig.builder()
    .baseUrl("https://api.dify.ai/v1")
    .apiKey("your-api-key")
    .connectTimeout(5000)  // 接続タイムアウト(ミリ秒)
    .readTimeout(60000)    // 読み取りタイムアウト(ミリ秒)
    .writeTimeout(30000)   // 書き込みタイムアウト(ミリ秒)
    .build();

// カスタム設定でクライアントを作成
DifyClient client = DifyClientFactory.createClient(config);

ライセンス

このプロジェクトはApache License 2.0の下でライセンスされています。

Discussion