ガイド

DifyでPDFやCSVを出力・ダウンロードする完全ガイド:ワークフロー・API・DSLファイルまで網羅

室谷東吾
監修者室谷東吾(@0x__tom

株式会社MYUUU 代表取締役 / 日本最大級AIコミュニティ「.AI」創設者(累計2,000名超)/ セプテーニ・ホールディングス(電通グループ)と資本業務提携 / 著書「お金を使わず、AIを働かせる『Dify』活用」(ぱる出版、3刷)/ Xフォロワー約2万人

テキトー教師
監修者テキトー教師(@tekitoo_T_cher

.AI 認定講師 / 教育×AIの専門家 / 累計300名以上にAI活用を指導 / 「テキトーに学ぶ」がモットーの実践派講師 / Xアカウント

DifyでPDFやCSVを出力・ダウンロードする完全ガイド:ワークフロー・API・DSLファイルまで網羅
室谷室谷
今回はDifyのファイル操作について話しましょう。.AI(ドットエーアイ)のコミュニティでも「ワークフローで生成した結果をファイルとして出力したい」「ユーザーにPDFを返したい」という声が増えてきていて・・・
テキトー教師テキトー教師
増えてますね。講座でも「Difyでファイルを扱うにはどうするんですか?」という質問が毎回出ます。

DifyはLLMとのチャットや文章生成のイメージが強いので、「ファイルを返せるの?」と驚く方が多い。
室谷室谷
そうなんですよね。実はDifyはかなりしっかりファイルを扱えます。

ただ「どこで何ができるか」がドキュメントに散らばっていて、全体像が見えにくい。今回はその整理をしていきましょう。
テキトー教師テキトー教師
前回はDifyのナレッジベースについて学びましたが、今回はファイルのダウンロード・出力に絞って深掘りしていきます。Difyでファイルを扱うには、大きく5つのシーン別に考えると整理しやすいです。
  1. ファイルアップロード変数 — ユーザーから受け取るファイルを変数として扱う
  2. Outputノードのfile型 — ワークフローの実行結果としてファイルを返す
  3. HTTPリクエストノード — 外部サービスからファイルをダウンロードする
  4. API経由のファイル操作 — REST APIでファイルをアップロード・ダウンロードする
  5. DSLファイルの出力 — ワークフロー設定をYAMLファイルとして書き出す
室谷室谷
この5つがごっちゃになっているケースが多いんですよね。「ファイルをダウンロードしたい」と言っても、何をダウンロードしたいかによって全然アプローチが変わります。
テキトー教師テキトー教師
まさにそこが混乱ポイントです。順番に整理していきましょう。

Difyのファイル変数とは何か

Difyのファイル操作パターン:アップロード・ダウンロード・DSLエクスポートの3つの流れ(公式ドキュメントより)

室谷室谷
まず大前提として、Difyにおける「ファイル変数」の概念を理解する必要があります。Difyのワークフローやチャットフローでは、変数にファイルを持たせることができます。
テキトー教師テキトー教師
これ、テキスト変数や数値変数と同じ扱いで、ファイルも「変数の型のひとつ」として存在するんですよね。Difyのドキュメントを確認すると、Outputノードでサポートされる変数型は string, number, integer, boolean, object, file, array[string], array[file] などがあります(より)。
室谷室谷
ファイル変数はDify内部でIDとURLを持ちます。前段のノードでアップロードされたファイルや、HTTPリクエストノードで取得したファイルを後続ノードに渡せる。

これがDifyのファイル操作の基本です。
テキトー教師テキトー教師
コードノードやHTTPリクエストノードからファイルをOutputノードに渡してユーザーに返す、という流れが一番よく使われるパターンですね。
室谷室谷
DifyのHTTPリクエストノードのドキュメントには、「ファイルのダウンロードは自動的に処理され、ダウンロードされたファイルは後続のノードで利用可能なファイル変数になる」と書いてあります。これを知っているかどうかで、できることが全然変わってくる。
テキトー教師テキトー教師
そうなんです。「Difyはファイルを出力できない」と思っている人が多いのはもったいないですよね。

ユーザーからファイルを受け取る:Startノードのファイルアップロード設定

テキトー教師テキトー教師
まずはユーザーからファイルを受け取る側から見ていきましょう。DifyのStartノード(トリガーノード)では、ファイルアップロードを入力変数として設定できます。
室谷室谷
これがDifyのドキュメントアップロード機能のベースになっている部分ですね。PDFや画像、CSVを入力として受け取れる。
テキトー教師テキトー教師
設定の流れはこうです。
  1. Startノードを開く
  2. 入力フィールドに「File」型の変数を追加する
  3. 許可するファイル種別(画像・ドキュメント等)を選ぶ
  4. 後続のノードでその変数を参照する
室谷室谷
ファイルアップロードを許可する種別は、imagedocument(PDF、Word、Excelなど)、audiovideo があります。自分のワークフローで使う用途に合わせて設定します。
テキトー教師テキトー教師
講座でよく聞かれるのが「複数のファイルを同時に受け取れますか?」という質問ですが、複数ファイルは array[file] 型の変数で受け取れます。
室谷室谷
Difyのナレッジベース機能と組み合わせれば、ユーザーがアップロードしたファイルを一時的なドキュメントとして使う「ChatPDF」的なワークフローも作れます。Document Extractorノードでテキストを抽出して、LLMに渡す流れです。
テキトー教師テキトー教師
Document Extractorノードのサポート形式は豊富です。TXT、Markdown、HTML、DOCX、PDF(テキスト系)、Excel、CSV、PowerPoint、EPUBなどに対応しています(より)。

PDF+AI要約のワークフローを作る場合、このノードが必須になります。
室谷室谷
ただし、コードノードのサンドボックス環境はファイルシステムへのアクセスが制限されているので注意が必要です。ローカルファイルの直接操作はセキュリティ上できない。
テキトー教師テキトー教師
ここ、コミュニティのメンバーさんがよくハマるポイントです。「Pythonコードでファイルを開こうとしたらエラーになる」というやつですね。

ワークフローの実行結果をファイルで返す:Outputノードのfile型

DifyのOutputノード:ワークフロー結果をAPI呼び出し元に返す(公式ドキュメントより)

室谷室谷
次に、ワークフローの実行結果をファイルとして返す方法です。DifyのOutputノード(以前はEndノードと呼ばれていました)では、変数型としてfileを選択できます。
テキトー教師テキトー教師
これを使うことで、ワークフローの実行結果としてファイルをAPIレスポンスに含められます。例えばHTTPリクエストノードで外部APIから取得したPDFをそのままユーザーに返す、というパターンです。
室谷室谷
APIレスポンスの構造はシンプルで、outputs オブジェクトの中に変数名をキーとして値が入ります。file型の場合、ファイルのメタデータ(ID、URL、MIMEタイプなど)がJSON形式で返ってきます。
テキトー教師テキトー教師
ここで注意が必要なのが、OutputノードはワークフローのEnd(終了)じゃないという点です。最新のDifyでは「Outputノードがないと実行結果がAPIに返らない」けど、「Outputノードでワークフローが止まるわけではない」。
室谷室谷
これ、v1.0以降で仕様が変わったんですよね。以前のEndノードはワークフローの終了を意味していたけど、今のOutputノードは「結果を返す」だけで、並列ブランチは引き続き実行される。
テキトー教師テキトー教師
ドキュメントにも「The Output node does not stop workflow execution—other parallel branches (if any) continue running after it completes.」と書かれています。
室谷室谷
MYUUUでもファイルを返すワークフローをいくつか作っていますが、OutputノードのAPIレスポンス構造を把握していると、フロントエンド側での実装がだいぶ楽になります。

HTTPリクエストノードで外部ファイルをダウンロードする

テキトー教師テキトー教師
次はHTTPリクエストノードを使ったファイルダウンロードです。外部のAPIからPDFや画像を取得して、次のノードに渡すパターンです。

DifyのHTTPリクエストノードのFile Operations設定(公式ドキュメントより)

室谷室谷
これ、使いこなせるかどうかでDifyでできることが一気に広がるんですよね。HTTPリクエストノードはファイルレスポンスを自動検出してくれます。
テキトー教師テキトー教師
具体的には、レスポンスの Content-Disposition ヘッダーや MIMEタイプを見て、バイナリコンテンツはファイル変数として扱ってくれます。公式ドキュメントには「Text-based responses (JSON, XML, HTML, etc.) are treated as regular data, while binary content becomes file variables.」と書かれています(より)。
室谷室谷
つまり、https://example.com/report.pdf にGETリクエストを投げるだけで、自動的にファイル変数として扱われる。この変数を次のノードに渡したり、OutputノードでAPIレスポンスに含めたりできます。
テキトー教師テキトー教師
実際の使い方の例を整理するとこうなります。
ユースケース方法
外部APIのPDFをダウンロードして処理HTTPリクエストノード(GET) → Document Extractor → LLM
S3などのクラウドストレージからCSVを取得HTTPリクエストノード(GET) + 署名付きURL
生成したドキュメントをSlackに添付LLM → コードノード → HTTPリクエストノード(POST)
外部サービスにファイルをアップロードファイル変数 → HTTPリクエストノード(POST/binary)
室谷室谷
ファイルのアップロードも同じノードでできます。Binary ボディタイプを選択して、前のノードからのファイル変数を選ぶだけです。
テキトー教師テキトー教師
Google DriveやDropboxのAPIと組み合わせれば、「ユーザーがアップロードしたファイルを処理してクラウドストレージに保存する」といったワークフローも組めます。
室谷室谷
室谷のツイートでも紹介しましたが、n8nと組み合わせてGoogleドライブへのファイルアップロードを検知 → DifyでAI処理 → 結果をGoogleドライブに保存、という完全自動化フローが作れます。これが実務レベルの活用方法です。

Dify APIでファイルをアップロード・ダウンロードする

テキトー教師テキトー教師
ここからはDifyをAPIとして使う場合のファイル操作の話をしていきましょう。開発者がDifyを外部から呼び出すときに関係してくる部分です。
室谷室谷
アプリに組み込む場合とか、バックエンドから呼び出す場合ですね。DifyのAPIには専用のファイルエンドポイントがあります。
テキトー教師テキトー教師
ファイルのアップロードは POST /files/upload、ダウンロードは GET /files/{file_id}/preview です(より)。
室谷室谷
ファイルアップロードAPIの仕様はこんな感じです。
POST /files/upload
Content-Type: multipart/form-data
Authorization: Bearer {API_KEY}

-- file: [アップロードするファイル]
-- user: [ユーザーID]

レスポンスに含まれる id が、その後のワークフロー実行時に使えるファイルIDです。

テキトー教師テキトー教師
ワークフロー実行APIでファイルを渡すときは、inputs の中にファイル型変数のキーを入れます。
{
  "inputs": {
    "file_variable_name": {
      "type": "document",
      "transfer_method": "local_file",
      "upload_file_id": "ここに/files/uploadで取得したID"
    }
  },
  "user": "user-123",
  "response_mode": "blocking"
}
室谷室谷
transfer_methodlocal_file の場合は事前にアップロードが必要で、remote_url の場合は直接URLを指定できます。外部のS3リンクや公開URLなら後者の方が楽ですね。
テキトー教師テキトー教師
remote_url を使うときは url フィールドにURLを入れます。ただし、ネットワークアクセスできないURL(ローカルネットワークのみ等)は使えません。
室谷室谷
ダウンロード側ですが、GET /files/{file_id}/preview はアップロードAPIで取得したIDに対してのみ機能します。別のアプリでアップロードしたファイルは取得できない設計です。

セキュリティ面でちゃんと考えられていますね。
テキトー教師テキトー教師
ナレッジベース側にはまた別のダウンロードAPIがあります。GET /datasets/{dataset_id}/documents/{document_id}/download でドキュメントをダウンロードでき、複数まとめて取りたい場合は POST /datasets/{dataset_id}/documents/download-zip でZIPとしてまとめてダウンロードできます(より)。
室谷室谷
ナレッジベースのバックアップを定期的に取りたい場合はこのAPIが便利です。

DSLファイルのダウンロードとインポート

室谷室谷
次に「DSLファイルのダウンロード」の話をしましょう。Difyのワークフロー設定はDSL(Domain Specific Language)形式のYAMLファイルでエクスポートできます。

これが dify dslファイル ダウンロード とか dify dslファイル インポート で検索している人が求めているものです。
テキトー教師テキトー教師
DSLファイルは、ワークフローの設定を丸ごとYAML形式で書き出したものです。これを別のDifyインスタンスにインポートすれば、同じワークフローを再現できます。

チーム共有や環境移行のときに使います。
室谷室谷
室谷もDSLファイルを配布することがよくあります。DSLファイルさえあれば、Difyを使っている人なら誰でも同じワークフローを手元で動かせる。
テキトー教師テキトー教師
DSLファイルのダウンロード方法はシンプルです。

DifyのExporting Applications:DSLファイルのエクスポート手順(公式ドキュメントより)

UIからDSLファイルをダウンロードする手順

  1. Difyのスタジオページを開く
  2. 対象のアプリにカーソルを合わせる
  3. 右クリックメニューか「...」から「Export DSL」を選ぶ
  4. または、アプリの編集画面(オーケストレーション画面)左上の「Export DSL」をクリック
室谷室谷
エクスポートされるのはワークフローの設定情報(ノードの配置、プロンプト、モデルパラメータ)です。APIキーのような機密情報はデフォルトではエクスポートされません。

Secretタイプの環境変数は「含めるかどうか」を選べます。
テキトー教師テキトー教師
インポート(読み込み)のほうはこちらです。

DSLファイルをインポートする手順

  1. Difyのスタジオページの「+新しいアプリ」または「アプリを作成」を選ぶ
  2. 「DSLファイルからインポート」を選択
  3. YAMLファイルをアップロードする
  4. バージョン互換性の確認が行われ、インポートが完了する
室谷室谷
DSLのバージョンはv0.6以降が現在の標準です。クラウド版(SaaS)は常に最新バージョンのDSLが使われますが、セルフホスト版ではバージョンの差異に注意が必要です。
テキトー教師テキトー教師
「dify dslファイル」で詰まりやすいのが、古いバージョンのDSLを新しいDifyにインポートしようとする場合です。警告が出ても多くの場合はインポート自体はできますが、一部のノード設定が反映されないことがあります。

複数アプリのDSLを一括ダウンロードする(コンソールAPI活用)

室谷室谷
アプリが多くなってくると、UIで一つずつエクスポートするのが大変になります。そこで使えるのがDifyの内部API(Console API)を使った一括ダウンロードです。
テキトー教師テキトー教師
これ、知っている人が少ないんですよね。Difyには公開されているAPP API(ワークフロー実行用)とは別に、ダッシュボードの内部処理を担うCONSOLE APIがあります。

このAPIを使えばプログラム的に全アプリのDSLを取得できます。
室谷室谷
実用的なユースケースとしては、定期バックアップ自動化や、本番環境から開発環境への設定同期があります。MYUUUでも複数のDifyプロジェクトを運用しているので、こういった自動化は地味に重要なんですよね。
テキトー教師テキトー教師
CONSOLE APIはDifyのWebUIが内部的に使っているAPIです。Pythonスクリプトで認証セッションを取得してから、アプリ一覧を取得→各アプリのDSLをダウンロードという手順で実装できます。
室谷室谷
ただし、CONSOLE APIは公式に公開されているものではないので、バージョンアップで仕様が変わる可能性があります。実務で使う場合はその点を踏まえて実装する必要があります。

コードノードとPythonライブラリでファイルを操作する

テキトー教師テキトー教師
コードノードについてはさっき少し触れましたが、改めて整理しましょう。DifyのコードノードはPythonとJavaScriptをサポートしています。
室谷室谷
重要な制約として、コードノードのサンドボックスはファイルシステムへのアクセスを制限しています。ドキュメントにも「Code executes in a strict sandbox that prevents file system access, network requests, and system commands.」と明記されています(より)。
テキトー教師テキトー教師
これが「dify コード実行 ファイル」で詰まる人の原因です。ローカルファイルを open() で開こうとしてもできない。
室谷室谷
ではコードノードでファイル関連の何ができるかというと・・・
テキトー教師テキトー教師
テキストデータの変換・整形はできます。例えばCSVの文字列を受け取って、JSONに変換してOutputに返すとか、Markdownを整形するとか。
室谷室谷
jsonmathdatetimere などの標準ライブラリは使えます。加えて、numpypandasrequests(ただしネットワークアクセスは制限あり)などの外部ライブラリも事前インストールされているものは使えます。
テキトー教師テキトー教師
dify python ライブラリ 追加 で調べている人もいますが、コードノードで使えるライブラリは基本的に事前インストールされているものに限られます。自由にインストールすることは(クラウド版では)できません。
室谷室谷
セルフホスト版であれば、サンドボックスのDockerイメージをカスタマイズすることで追加ライブラリを使えるようにはなりますが、これはかなり上級者向けです。
テキトー教師テキトー教師
実務的なアドバイスとしては、「ファイルの生成や保存が必要な処理はコードノードではなく、HTTPリクエストノードで外部APIを呼ぶ」というアプローチが安全です。

ナレッジベースのファイルをダウンロードする

室谷室谷
ナレッジベース(RAG機能)に登録したファイルのダウンロードについても触れておきましょう。dify ナレッジ ファイル ダウンロード で検索している人が求めているのがここです。
テキトー教師テキトー教師
ナレッジベースには自分でドキュメントをアップロードして、LLMが参照できるようにする機能です。このドキュメントをAPIで取得できます。
室谷室谷
APIとしては GET /datasets/{dataset_id}/documents でドキュメント一覧を取得して、個別ダウンロードは GET /datasets/{dataset_id}/documents/{document_id}/download で取得できます。複数をまとめたい場合は先ほど触れたZIPダウンロードAPIを使います。
テキトー教師テキトー教師
ナレッジベースのAPIキーはDifyのナレッジAPIキー(Knowledge API Key)を使います。通常のワークフロー用APIキーとは別なので注意が必要です。
室谷室谷
dify pdf ダウンロードdify csv ダウンロード と検索している方は多くの場合、「ナレッジベースに登録したPDFやCSVを取り出したい」というケースが多いと思います。
テキトー教師テキトー教師
ナレッジベースに登録したドキュメントは、元のファイル形式で取り出せます。PDFを登録したらPDFで、CSVを登録したらCSVで返ってきます。

セルフホスト版のローカルファイル操作

室谷室谷
最後にセルフホスト版特有の話をしましょう。dify ローカル ファイル 操作dify python ファイル 読み込み で検索している人はほぼセルフホスト版ユーザーです。
テキトー教師テキトー教師
セルフホスト版のDifyはDockerで動いているので、コンテナ内のファイルシステムはホストマシンとは分離されています。ここがローカルファイルアクセスの難しさの原因です。
室谷室谷
Docker Composeのボリュームマウントを設定することで、ホストマシンのフォルダをDifyのコンテナ内に見せることができます。ただ、コードノードのサンドボックスはさらに別のコンテナで動いているので、そこからもアクセスするには追加の設定が必要です。
テキトー教師テキトー教師
コミュニティのメンバーさんからよく聞くのが「Difyのワークフローで処理した結果をサーバー上のファイルに保存したい」という要望です。この場合、コードノードで直接ファイルを書くのではなく、HTTPリクエストノードで自前のAPIエンドポイントを叩いてファイル保存を行うアーキテクチャが推奨されます。
室谷室谷
「ファイルの書き込みはDify外の仕組みに任せる」という設計思想ですね。Difyはあくまでオーケストレーター(指揮者)として使い、ファイル操作の実行は別のマイクロサービスやサーバーレス関数に委譲する。
テキトー教師テキトー教師
これがDifyを実務で使いこなす上での重要な考え方だと思います。Difyに全部やらせようとすると制限に当たる。

どこをDifyがやって、どこを別のシステムに委ねるかを設計する力が問われます。

よくあるトラブルと解決策

室谷室谷
実際にファイル操作を実装する中でよく出てくるエラーを整理しておきましょう。
テキトー教師テキトー教師
一番多いのは「コードノードでファイルを開こうとしてエラーになる」ですね。原因はサンドボックスによるファイルシステムアクセス制限です。
トラブル原因解決策
open() でファイルを開けないコードノードのサンドボックス制限HTTPリクエストノードで外部APIを経由する
ファイルアップロードに失敗するファイルサイズ制限(デフォルト15MB)セルフホスト版はdocker-compose.yamlで変更可能
DSLインポート後にノードが見つからないDifyのバージョン不一致Difyをアップデートするか、古いバージョンのDSLを使用
file_idが見つからないエラー別アプリのファイルIDを使用している同じアプリで発行したfile_idを使う
HTTPリクエストでファイルが変数にならないレスポンスがテキスト形式Content-Typeがバイナリ形式か確認する
室谷室谷
dify ファイルアップロード 失敗 で調べている人の多くは、ファイルサイズ制限にひっかかっているケースが多いです。セルフホスト版ではnginx.confclient_max_body_sizeを変更することで上限を引き上げられます。
テキトー教師テキトー教師
dify ファイルアップロード できない の別パターンとして、ファイル種別が許可されていないケースもあります。Startノードでどのファイル種別を受け付けるかを設定していないと、アップロード自体ができません。
室谷室谷
あとは dify ファイル url 関係で「ファイルのURLを取得して別のサービスに渡したい」という質問もよく来ます。ファイルアップロードAPIのレスポンスに source_urlpreview_url が含まれているので、これを使います。
テキトー教師テキトー教師
preview_url は一時的なURLで、有効期限があります。永続的にアクセスしたい場合は自前のストレージ(S3等)に保存してURLを管理する必要があります。

FAQ

室谷室谷
よくある質問をまとめてお答えします。

Q: DifyワークフローでPDFを生成してダウンロードさせることはできますか?

室谷室谷
「LLMで生成したテキストをPDFにしてダウンロードさせる」というのは、現時点のDifyの標準機能だけでは難しいです。PDF生成の処理はコードノードやDifyのサンドボックスで直接できない。
テキトー教師テキトー教師
実現するなら、LLMの出力テキストをHTTPリクエストノードでPDF生成API(WeasyPrintやPuppeteerを使った自前API、または外部サービス)に送信して、返ってきたPDFファイルをOutputノードに渡す、という構成になります。

Q: Difyのチャットフローでファイルを返せますか?

テキトー教師テキトー教師
チャットフローにはOutputノードがなく、Answerノードを使います。Answerノードはテキストの返却が主目的なので、ファイルそのものを「チャット画面でダウンロードさせる」のは標準機能では難しいです。
室谷室谷
チャットインターフェースでファイルを出力したい場合は、ファイルへのリンクURLをMarkdown形式でAnswerノードに渡すのが現実的なアプローチです。

Q: DifyのAPIで生成した画像をダウンロードするには?

室谷室谷
画像生成AIとDifyを組み合わせた場合、生成した画像URLをOutputノードで返すのが基本です。その後、クライアント側でURLに対してGETリクエストを投げてダウンロードします。
テキトー教師テキトー教師
dify 画像 ダウンロード で調べている方は、多くの場合この流れで解決します。Dify側はあくまでURLを返すまでが仕事で、ダウンロード処理はクライアント側で行います。

Q: dify ファイルアップロード URLとはどういう意味ですか?

テキトー教師テキトー教師
これは transfer_method: remote_url の話です。ファイルをサーバー上にアップロードする代わりに、公開URLを直接指定してファイルを渡す方法です。

dify ファイルアップロード urldify ファイル url で調べている方はこれを求めているケースが多いです。
室谷室谷
S3の署名付きURLやCDNのURLを直接指定できるので、大きなファイルを扱うときに便利です。ただし、Difyのサーバーからアクセスできる公開URLである必要があります。

まとめ

室谷室谷
では今回のまとめをしましょう。Difyのファイルダウンロード・出力は「何をしたいか」によってアプローチが全然変わります。
テキトー教師テキトー教師
整理するとこういう対応になります。
やりたいこと使う機能
ユーザーからファイルを受け取るStartノードのfile型変数
外部サービスのファイルを取得するHTTPリクエストノード(GET)
ワークフロー結果としてファイルを返すOutputノードのFile型変数
APIからファイルをアップロードPOST /files/upload
APIからファイルをダウンロードGET /files/{file_id}/preview
DSLファイルを書き出すUIの「Export DSL」
ナレッジのドキュメントを取得Knowledge API
室谷室谷
「Difyでファイルを出力できない」と思っていた方に、できることのイメージが伝わったなら嬉しいです。制限はありますが、アーキテクチャの設計次第でかなりのことができます。
テキトー教師テキトー教師
コードノードでファイルを直接操作しようとして詰まっている方は、「HTTPリクエストノードで外部APIを呼ぶ」という発想の転換が突破口になります。
室谷室谷
.AI(ドットエーアイ)のコミュニティでも、Difyのより高度な使い方について情報共有しています。ファイル操作以外にも困っていることがあれば、ぜひコミュニティで聞いてみてください。

出典

#Dify#ワークフロー#ファイル#AI#API
.AI TIMES一覧に戻る