﻿Dify 掲載コード




リスト10-1
________________


def main(keywords_str: str) -> dict:
    try:
        # カンマ区切りの文字列をリストに変換し、不要な空白を除去
        # さらに各キーワードを小文字に変換する
        items =[]
        for item in keywords_str.split(","):
            items.append(item.lower().strip())
        
        # set()を使って重複を削除
        unique_items = list(set(items))
        
        # アルファベット順にソートする
        unique_items.sort()
        
        # 各キーワードの先頭を大文字にする
        formatted_items = [item.capitalize() for item in unique_items]
        
        # 処理結果を整形されたリストとして返す
        return {
            "result":{
                "processed_keywords": formatted_items,
                "original_count": len(items),
                "unique_count": len(unique_items),
                "error": None
            }
        }
    except Exception as e:
        return {
            "result":{
                "processed_keywords": [],
                "original_count": 0,
                "unique_count": 0,
                "error": str(e)
            }
        }
________________




リスト11-1
________________


{
  "openapi": "3.1.0",
  "info": {
    "title": "Google News",
    "description": "Googleニュースからニュースを取得する。",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://news.google.com"
    }
  ],
  "paths": {
    "/rss/search?q={query}&hl=ja&gl=JP&ceid=JP:ja": {
      "get": {
        "description": "queryパラメータの値を含むニュースをGoogleニュースで検索する。",
        "operationId": "GetGoogleNewsForQuery",
        "parameters": [
          {
            "name": "query",
            "in": "path",
            "description": "Googleニュースで検索するクエリ",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}
________________




リスト11-2
________________


{
  "openapi": "3.1.0",
  "info": {
    "title": "Get weather data",
    "description": "特定の場所の現在の天気データを取得します。",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://www.jma.go.jp"
    }
  ],
  "paths": {
    "/bosai/forecast/data/overview_forecast/{area_code}.json": {
      "get": {
        "description": "Get temperature for a specific location",
        "operationId": "GetCurrentWeather",
        "parameters": [
          {
            "name": "area_code",
           "in": "path",
            "description": "天気を取得する都道府県",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}
________________




リスト12-1
________________


curl -X POST エンドポイント ⏎
     -H "Authorization: Bearer シークレットキー" ⏎
     -H "Content-Type: application/json" ⏎
     -d '{
           "inputs": {
             "memo_text": "来週月曜15時から佐藤さんとウェブ会議。⏎
               テーマは予算案について。資料の準備をしておくこと。"
           },
           "response_mode": "blocking",
           "user": "api-test-user-001"
         }'
________________






リスト12-2
________________


import requests
import json


# 設定値
api_endpoint = "エンドポイント" # Difyアプリのエンドポイント
api_key = "シークレットキー" # あなたのシークレットキー
user_id = "python-user-001"


memo = input('メモを記入：')


headers = {
  "Authorization": f"Bearer {api_key}",
  "Content-Type": "application/json"
}


data = {
  "inputs": {
    "memo_text": memo
  },
  "response_mode": "blocking", 
  "user": user_id
}


try:
  response = requests.post(api_endpoint, headers=headers, json=data)
  response.raise_for_status() # エラーがあれば例外を発生させる


  result = response.json()
  print("API呼び出し成功:")


  # 回答部分を取り出す
  answer = result["data"]["outputs"]
  if answer:
    print(json.dumps(answer, indent=2, ensure_ascii=False))


except requests.exceptions.RequestException as e:
  print(f"API呼び出しエラー: {e}")
  if e.response is not None:
    print(f"ステータスコード: {e.response.status_code}")
    try:
      print(f"エラー詳細: {e.response.json()}")
    except json.JSONDecodeError:
      print(f"エラー詳細 (テキスト): {e.response.text}")
________________




リスト12-3
________________


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>API example</title>
  <style>
    body { font-family: sans-serif; margin: 20px; }
    input[type="text"] { width: 300px; padding: 8px; margin-right: 10px; }
    button { padding: 8px 15px; }
  </style>
</head>
<body>
  <h1>API Example</h1>


  <pre id="result">type memo:</pre>
  <div><textarea id="memo" cols="50" rows="5"></textarea></div>
  <div><button onclick="doAction();">Click</button></div>


  <script>
  // 重要：実際にはAPIキーやエンドポイントは安全な方法で管理してください。
  const DIFY_API_ENDPOINT = 'エンドポイント'; // エンドポイント
  const DIFY_API_KEY = 'シークレットキー'; // フロントエンド直書きは非推奨
  
  async function doAction(e) {
    const result_area = document.querySelector('#result');
    let memo = document.querySelector('#memo').value;
    result_area.textContent = "wait...";
    let result = await api(memo);
    result_area.textContent = JSON.stringify(result,'','\n\t');
  }


  async function api(memo) {
    try {
      const response = await fetch(DIFY_API_ENDPOINT, {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${DIFY_API_KEY}`,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          inputs: { "memo_text": memo }, 
          response_mode: 'blocking', // または 'streaming'
          user: 'webapp-user-01' // 任意のユーザーID
        })
      });


      if (!response.ok) {
        const errorData = await response.json();
        throw new Error(`APIエラー: ${response.status} - ${errorData.message || '不明なエラー'}`);
      }
      const data = await response.json();
      console.log(data);
      return data.data.outputs;
    } catch (error) {
      console.error('エラー:', error);
      return {'error': error};
    }


  }
  </script>
</body>
</html>
________________




リスト12-4
________________


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Dify</title>
  <style>
    body { font-family: sans-serif; margin: 20px; }
    input[type="text"] { width: 300px; padding: 8px; margin-right: 10px; }
    button { padding: 8px 15px; }
    #result { margin-top: 20px; white-space: pre-wrap; border: 1px solid #ccc; padding: 10px; }
  </style>
</head>
<body>
  <h1>Dify Sample</h1>
  <pre>{{ result }}</pre>
  <form action="/" method="post">
    <div><textarea id="memo" name="memo" 
      cols="50" rows=""5>{{ memo }}</textarea></div>
    <div><button type="submit">送信</button></div>
  </form>
</body>
</html>
________________




リスト12-5
________________


import requests
import json
from flask import Flask, render_template, request


app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def index():
  memo = ''
  result = ''
  if request.method == 'POST':
    # フォームが送信された場合
    memo = request.form['memo']
    result = api(memo)
  return render_template('index.html', memo=memo, result=result)


def api(memo):
  api_endpoint = "http://ドメイン/v1/workflows/run" # エンドポイント
  api_key = "…APIシークレットキー…" # APIキー
  user_id = "python-test-user-001"


  headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
  }


  data = {
    "inputs": {
      "memo_text": memo 
    },
    "response_mode": "blocking",
    "user": user_id
  }


  try:
    response = requests.post(api_endpoint, headers=headers, json=data)
    response.raise_for_status() # エラーなら例外を発生させる


    result = response.json()


    # 回答部分を取り出す
    answer = result["data"]["outputs"]
    if answer:
      return json.dumps(answer, indent=2, ensure_ascii=False)


  except requests.exceptions.RequestException as e:
    print(f"API呼び出しエラー: {e}")
    if e.response is not None:
      print(f"ステータスコード: {e.response.status_code}")
      try:
        print(f"エラー詳細: {e.response.json()}")
      except json.JSONDecodeError:
        print(f"エラー詳細 (テキスト): {e.response.text}")
  return 'no result...'


if __name__ == '__main__':
  app.run(debug=True, port=5100)


# python flask_app.py
# http://127.0.0.1:5100/
________________