コード構造

以下のコードファイル構造を参照すると、コードの構成をより理解しやすくなります。

[cmd/]
├── server                // サーバー起動のエントリーポイント
├── lib                   // 共有ライブラリのエントリーポイント
└── test                  // 一般的なテストスクリプト
[build/]                  // 各種アーキテクチャとプラットフォーム用のビルドスクリプト
[internal/]               // 内部パッケージ
├── controller            // HTTPリクエストハンドラ
├── middleware            // リクエスト処理用ミドルウェア
├── server                // サーバーのセットアップと設定
├── service               // コントローラー用のサービス提供
├── static                // 設定ファイル
│   ├── nodejs_syscall    // Node.jsシステムコールのホワイトリスト
│   └── python_syscall    // Pythonシステムコールのホワイトリスト
├── types                 // エンティティ
├── core                  // 分離と実行のためのコアロジック
│   ├── lib               // 共有ライブラリ
│   ├── runner            // コード実行
│   │   ├── nodejs        // Node.jsランナー
|   |   └── python        // Pythonランナー
└── tests                 // CI/CD用のテスト

原理

現在、コアロジックには2つの主要なエントリーポイントがあります。1つはDifySandboxのHTTPサービスエントリーポイント、もう1つは動的リンクライブラリのエントリーポイントです。Sandboxがコードを実行する際、まず一時的なコードファイルが生成されます。このファイルの冒頭で動的リンクライブラリを呼び出して実行環境(Sandbox)を初期化し、その後にユーザーコードが実行されます。最終的に、ユーザーが提出したコードを直接実行するのではなく、この一時ファイルを実行することで、システムの安全性を確保します。

動的リンクライブラリでは、Seccomp(Secure Computing Mode)を使用してシステムコールを制限しています。許可されるシステムコールはstaticディレクトリのnodejs_syscallおよびpython_syscallファイルに定義されており、ARM64とAMD64の両アーキテクチャ向けのシステムコールホワイトリストを提供しています。特別な理由がない限り、これらのファイルを変更しないでください。

貢献方法

タイポやバグなどの小さな問題については、直接プルリクエスト(PR)を送信してください。大規模な変更や新機能の提案については、まずイシューを作成し、議論を行ってください。

今後の課題

現在検討中の課題がいくつかあります。興味があれば、以下のタスクに取り組んでいただけます:

  • 新しいプログラミング言語のサポート:
    • 現在、PythonとNodejsをサポートしていますが、他の言語のサポートも検討しています。
    • 新しい言語を追加する際は、ARM64とAMD64の両アーキテクチャに対応し、安全性を確保するためのCIテストを提供する必要があります。
  • Nodejsの依存関係の問題:
    • 現在、Pythonの依存関係のサポートは完了していますが、Nodejsについてはnode_modulesの複雑さから、まだ適切な解決策がありません。この課題に取り組んでいただけると助かります。
  • 画像処理:
    • 将来的にマルチモーダルが主流になると予想されるため、Sandboxでの画像処理のサポートは重要です。
    • Pillowなどのライブラリのサポートを追加し、DifyからSandboxに画像を渡して処理できるようにすることを検討しています。
  • 包括的なCIテスト:
    • 現在のCIテストはまだ不十分で、基本的なケースしかカバーしていません。より広範なテストの追加が必要です。
  • マルチモーダルデータの生成:
    • Sandboxを使用して、テキストと画像を組み合わせたデータなど、マルチモーダルデータの生成に挑戦してみてください。