{"id":21386,"date":"2026-02-09T07:00:00","date_gmt":"2026-02-08T22:00:00","guid":{"rendered":"https:\/\/blog.capilano-fw.com\/?p=21386"},"modified":"2026-01-09T07:22:34","modified_gmt":"2026-01-08T22:22:34","slug":"%e9%a0%98%e5%8f%8e%e6%9b%b8%e3%80%81%e8%ab%8b%e6%b1%82%e6%9b%b8%e3%80%81%e8%a6%8b%e7%a9%8d%e6%9b%b8%e3%82%92-line%e3%81%a7%e9%80%81%e3%82%8b%e3%81%a0%e3%81%91%e8%87%aa%e5%8b%95%e5%87%a6%e7%90%86","status":"publish","type":"post","link":"https:\/\/blog.capilano-fw.com\/?p=21386","title":{"rendered":"\u9818\u53ce\u66f8\u3001\u8acb\u6c42\u66f8\u3001\u898b\u7a4d\u66f8\u3092 LINE\u3067\u9001\u308b\u3060\u3051\u81ea\u52d5\u51e6\u7406\uff01\u30b9\u30e2\u30fc\u30eb\u30d3\u30b8\u30cd\u30b9\u306e\u7d4c\u7406\u3092\u697d\u306b\u3059\u308b\u30b7\u30b9\u30c6\u30e0"},"content":{"rendered":"\n<p>\u3055\u3066\u3055\u3066\u3001\u3053\u306e\u3068\u3053\u308d\u30ed\u30fc\u30ab\u30ebAI\u306b\u611f\u52d5\u3057\u3066\u3044\u308d\u3044\u308d\u3068\u30b7\u30b9\u30c6\u30e0\u3092\u8a66\u3057\u3066\u3044\u307e\u3059\u304c\u3001<strong>\u793e\u5916\u79d8\u3092\u5168\u9762\u306b\u62bc\u3057\u51fa\u3057\u3066\u3044\u305f<\/strong>\u306e\u3067\u3001\u3084\u3063\u3066\u3044\u306a\u3044\u3053\u3068\u304c\u3042\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u305d\u308c\u306f\u3001\u3082\u3061\u308d\u3093\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u3068\u306e\u9023\u643a<\/strong><\/p>\n\n\n\n<p>\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3068\u3044\u3046\u306e\u3082\u3001\u3042\u308b<code>YouTube<\/code>\u52d5\u753b\u3092\u898b\u305f\u3068\u304d\u306b\u51fa\u6f14\u3057\u3066\u305f\u65b9\u304c<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>AI\u3063\u3066\u65e5\u5e38\u4f7f\u3044\u3059\u308b\u5834\u6240\u306b\u306a\u3044\u3068\u4f7f\u3063\u3066\u3082\u3089\u3048\u306a\u3044\u3093\u3067\u3059\u3088\u306d\uff01<\/strong><\/p>\n\n\n\n<p>\u3068\u304a\u3063\u3057\u3083\u3063\u3066\u3044\u305f\u304b\u3089\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u305d\u3057\u3066\u3001\u65e5\u5e38\u4f7f\u3044\u3068\u805e\u3044\u30661\u756a\u306b\u601d\u3044\u3064\u304f\u306e\u306f<code>LINE<\/code>\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u30a2\u30a4\u30c7\u30a2\u3092\u8003\u3048\u3066\u3044\u305f\u3089<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>LINE\u3067\u9818\u53ce\u66f8\u3092\u9001\u308c\u3070\u3001\u81ea\u52d5\u51e6\u7406\u3059\u308b\u30b7\u30b9\u30c6\u30e0<\/strong><\/p>\n\n\n\n<p>\u304c\u3064\u304f\u3063\u3066\u307f\u305f\u304f\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u4eca\u56de\u306f\u6b21\u306e\u3088\u3046\u306a\u4eba\u306b\u5411\u3051\u3066\u8a18\u4e8b\u3092\u66f8\u3044\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u300c\u7d4c\u7406\u306e\u305f\u3081\u306b\u6bce\u6708\u6642\u9593\u3092\u30e0\u30c0\u306b\u3057\u3066\u3044\u308b\u6c17\u304c\u3059\u308b\u300d<\/li>\n\n\n\n<li>\u300cLINE\u3067\u5b8c\u7d50\u3059\u308b\u3068\u805e\u304f\u3068\u300e\u3044\u3084\u3001\u305d\u308c\u306a\u3089\u4f7f\u3046\u304b\u3082\u300f\u3068\u611f\u3058\u305f\u300d<\/li>\n\n\n\n<li>\u300c\u7d4c\u7406\u306f\u91cd\u8981\u3060\u3051\u3069\u3001\u3084\u308a\u305f\u304f\u306a\u3044\u4ed5\u4e8b\u306e\u30c8\u30c3\u30d7\u3060\u3068\u601d\u3046\u300d<\/li>\n\n\n\n<li>\u300c\u5916\u6ce8\u3057\u3066\u3082\u623b\u3063\u3066\u304f\u308b\u78ba\u8a8d\u4f5c\u696d\u3067\u75b2\u5f0a\u3057\u3066\u308b\u300d<\/li>\n\n\n\n<li>\u300c\u6642\u9593\u5358\u4fa1\u304c\u9ad8\u3044\u4eba\u304c\u7d4c\u7406\u51e6\u7406\u307e\u3067\u3057\u3066\u3066\u3001\u3082\u3063\u305f\u3044\u306a\u3044\u300d<\/li>\n\n\n\n<li>\u300cLINE\u306a\u3089\u958b\u304f\u3051\u3069\u4f1a\u8a08\u30bd\u30d5\u30c8\u306f\u958b\u304b\u306a\u3044\u3068\u601d\u3046\u300d<\/li>\n\n\n\n<li>\u300c\u7d4c\u7406\u306fAI\u306b\u4efb\u305b\u3066\u3001\u672c\u696d\u3092\u4f38\u3070\u3059\u6642\u4ee3\u304c\u6765\u305f\u3068\u611f\u3058\u3066\u3044\u308b\u300d<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"226\" height=\"320\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2020\/03\/no_12.png\" alt=\"\" class=\"wp-image-6068\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2020\/03\/no_12.png 226w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2020\/03\/no_12-212x300.png 212w\" sizes=\"auto, (max-width: 226px) 100vw, 226px\" \/><\/figure><\/div>\n\n\n<p class=\"has-text-align-center\">\u300c\u540c\u7d1a\u751f\u3068\u30ab\u30e9\u30aa\u30b1\u3044\u3063\u3066\u3082\u3001<br>Switch2\u3067\u30b2\u30fc\u30e0\u3070\u3063\u304b\u3057\u3066\u307e\u3059\ud83d\ude02\u300d<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u524d\u63d0\u3068\u3057\u3066<\/h2>\n\n\n\n<p>\u4eca\u56de\u306f\u4ee5\u4e0b3\u3064\u3092\u4f7f\u3063\u3066\u5b9f\u88c5\u3057\u307e\u3059\u3002<br>\u5148\u306b\u6e96\u5099\u3092\u3057\u3066\u304a\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>LINE Messaging API\uff1a<\/strong>\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3&amp;\u30a6\u30a7\u30d6\u30d5\u30c3\u30af<\/li>\n\n\n\n<li><strong>ngrok\uff1a<\/strong>\u30a6\u30a7\u30d6\u30d5\u30c3\u30af\u3092\u30ed\u30fc\u30ab\u30eb\u306b\u8ee2\u9001<\/li>\n\n\n\n<li><strong>Ollama\uff1a<\/strong>localhost:11434\u3067\u52d5\u3044\u3066\u308b\u60f3\u5b9a<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u51e6\u7406\u3092\u3059\u308b\u6d41\u308c<\/h2>\n\n\n\n<p>\u4eca\u56de\u306f\u4ee5\u4e0b\u306e\u6d41\u308c\u3067\u51e6\u7406\u3092\u81ea\u52d5\u5316\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>LINE\u306b\uff5b\u9818\u53ce\u66f8\u3001\u8acb\u6c42\u66f8\u3001\u898b\u7a4d\u66f8\uff5d\u3092\u9001\u4fe1<\/li>\n\n\n\n<li>LINE\u304b\u3089\u306e\u30a6\u30a7\u30d6\u30d5\u30c3\u30af\u3092ngrok\u3067\u30ed\u30fc\u30ab\u30eb\u306b\u8ee2\u9001<\/li>\n\n\n\n<li>FastAPI\u3067\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u3068\u308b<\/li>\n\n\n\n<li>PDF\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3001Docling\u3067\u30c6\u30ad\u30b9\u30c8\u62bd\u51fa<\/li>\n\n\n\n<li>Ollama\uff08gemma4n:e4b\uff09\u3067\u30c7\u30fc\u30bf\u52a0\u5de5<\/li>\n\n\n\n<li>\u96fb\u5b50\u5e33\u7c3f\u4fdd\u5b58\u6cd5\u306b\u5bfe\u5fdc\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u540d\u3067\u3001\u7279\u5b9a\u30d5\u30a9\u30eb\u30c0\u3078\u632f\u308a\u5206\u3051<\/li>\n<\/ol>\n\n\n\n<p>\u3061\u3087\u3063\u3068\u9577\u304f\u611f\u3058\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001<code>FastAPI<\/code>\u306f1\u30d5\u30a1\u30a4\u30eb\u3067\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<br>\u697d\u3057\u3093\u3067\u3084\u3063\u3066\u3044\u304d\u307e\u3057\u3087\u3046\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FastAPI\u90e8\u5206\u3092\u3064\u304f\u308b<\/h2>\n\n\n\n<p>\u3067\u306f\u3001\u3044\u304d\u306a\u308a\u30b3\u30fc\u30c9\u90e8\u5206\u3067\u3059\u3002<br>\u307e\u305a\u306f\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>pip install fastapi uvicorn line-bot-sdk docling requests<\/strong><\/pre>\n\n\n\n<p>\u6b21\u306b\u3001\u9069\u5f53\u306a\u30d5\u30a9\u30eb\u30c0\u3092\u3064\u304f\u3063\u3066<code>main.py<\/code>\u3068\u3057\u3066\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p><strong>main.py<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>import os<br>import re<br>import json<br>import requests<br>import tempfile<br>from datetime import datetime<br>from fastapi import FastAPI, Request, HTTPException<br>from fastapi.responses import PlainTextResponse<br>from docling.document_converter import DocumentConverter<br><br>app = FastAPI()<br>converter = DocumentConverter()<br><br>LINE_CHANNEL_ACCESS_TOKEN = \"\uff08\u3053\u3053\u306bLINE\u306e\u30c1\u30e3\u30cd\u30eb\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\uff09\"<br>LINE_CONTENT_API = \"https:\/\/api-data.line.me\/v2\/bot\/message\/{message_id}\/content\"<br>OLLAMA_API_URL = \"http:\/\/localhost:11434\/api\/generate\"<br><br>TYPE_ITEMS = {<br>    \"estimate\": {\"label\": \"\u898b\u7a4d\u66f8\", \"folder\": \"estimate\"},<br>    \"invoice\":  {\"label\": \"\u8acb\u6c42\u66f8\", \"folder\": \"invoice\"},<br>    \"receipt\":  {\"label\": \"\u9818\u53ce\u66f8\", \"folder\": \"receipt\"},<br>}<br><br>OUTPUT_DIRS = {<br>    key: value[\"folder\"] for key, value in TYPE_ITEMS.items()<br>}<br><br>for dir_name in OUTPUT_DIRS.values():<br>    os.makedirs(dir_name, exist_ok=True)<br><br><br>@app.post(\"\/webhook\", response_class=PlainTextResponse)<br>async def webhook(request: Request):<br>    body = await request.json()<br>    events = body.get(\"events\", [])<br>    if not events:<br>        return \"OK\"<br><br>    event = events[0]<br>    if event.get(\"type\") != \"message\":<br>        return \"OK\"<br><br>    message = event.get(\"message\", {})<br>    message_type = message.get(\"type\")<br>    message_id = message.get(\"id\")<br>    file_name = message.get(\"fileName\")<br><br>    if message_type != \"file\":<br>        return \"OK\"<br><br>    if not message_id:<br>        raise HTTPException(status_code=400, detail=\"message id not found\")<br><br>    pdf_bytes = download_line_content_sync(message_id)<br>    md_text = convert_pdf_bytes_to_markdown(pdf_bytes)<br>    llm_reply = call_ollama_gemma(md_text)<br><br>    try:<br>        parsed = extract_json(llm_reply)<br>    except (json.JSONDecodeError, ValueError):<br>        print(\"Failed to parse JSON from LLM\")<br>        return \"OK\"<br><br>    save_path = save_pdf_by_type(pdf_bytes, parsed, file_name)<br>    print(f\"Saved to: {save_path}\")<br>    return \"OK\"<br><br><br>def download_line_content_sync(message_id: str) -> bytes:<br>    url = LINE_CONTENT_API.format(message_id=message_id)<br>    headers = {\"Authorization\": f\"Bearer {LINE_CHANNEL_ACCESS_TOKEN}\"}<br>    resp = requests.get(url, headers=headers)<br>    resp.raise_for_status()<br>    return resp.content<br><br><br>def convert_pdf_bytes_to_markdown(data: bytes) -> str:<br>    with tempfile.NamedTemporaryFile(suffix=\".pdf\", delete=True) as tmp:<br>        tmp.write(data)<br>        tmp.flush()<br>        result = converter.convert(tmp.name)<br>        return result.document.export_to_markdown()<br><br><br>def call_ollama_gemma(md_text: str) -> str:<br>    print(\"Processing PDF text with Ollama...\")<br>    prompt = f\"\"\"PDF\u304b\u3089\u62bd\u51fa\u3057\u305f\u30c6\u30ad\u30b9\u30c8\u3092\u4ee5\u4e0b\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3067\u51fa\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br>{{<br> \"company_name\": \"(\u4f1a\u793e\u540d)\",<br> \"date\": \"(\u767a\u751f\u65e5:YYYY\/MM\/DD)\",<br> \"total_amount\": \"(\u5408\u8a08\u91d1\u984d)\",<br> \"type\": \"document type (estimate \/ invoice \/ receipt)\",<br>}}<br><br>\u3010PDF\u304b\u3089\u62bd\u51fa\u3057\u305f\u30c6\u30ad\u30b9\u30c8\u3011<br>{md_text}\"\"\"<br>    payload = {<br>        \"model\": \"gemma3n:e4b\",<br>        \"prompt\": prompt,<br>        \"stream\": False,<br>    }<br>    resp = requests.post(OLLAMA_API_URL, json=payload, timeout=120)<br>    resp.raise_for_status()<br>    data = resp.json()<br>    return data.get(\"response\", \"\")<br><br><br>def extract_json(text: str) -> dict:<br>    match = re.search(r\"```(?:json)?\\s*\\n?(\\{.*?\\})\\s*```\", text, re.DOTALL)<br>    if match:<br>        json_str = match.group(1)<br>    else:<br>        brace_match = re.search(r\"\\{.*\\}\", text, re.DOTALL)<br>        if brace_match:<br>            json_str = brace_match.group(0)<br>        else:<br>            raise ValueError(\"JSON not found\")<br><br>    return json.loads(json_str)<br><br><br>def save_pdf_by_type(pdf_bytes: bytes, parsed: dict, original_name: str) -> str:<br>    doc_type = parsed.get(\"type\", \"\").strip().lower()<br><br>    if doc_type not in TYPE_ITEMS:<br>        print(f\"Unknown type: {doc_type}\")<br>        return \"OK\"<br><br>    meta = TYPE_ITEMS[doc_type]<br>    suffix = meta[\"label\"]<br>    folder = OUTPUT_DIRS[doc_type]<br><br>    date_str = parsed.get(\"date\", \"\")<br>    match = re.search(r\"\\d{4}\/\\d{1,2}\/\\d{1,2}\", date_str)<br>    ymd = match.group(0).replace(\"\/\", \"\") if match else datetime.now().strftime(\"%Y%m%d\")<br><br>    company = parsed.get(\"company_name\", \"\").strip() or \"Unknown\"<br>    amount = re.sub(r\"[^0-9]\", \"\", parsed.get(\"total_amount\", \"\").strip()) or \"0\"<br>    safe_company = re.sub(r'[\\\\\/:*?\"&lt;>|]', \"_\", company)<br><br>    filename = f\"{ymd}_{safe_company}_{amount}_{suffix}.pdf\"<br>    filepath = os.path.join(folder, filename)<br><br>    with open(filepath, \"wb\") as f:<br>        f.write(pdf_bytes)<br><br>    return filepath<\/strong><\/pre>\n\n\n\n<p>\u306a\u304a\u3001<code>LINE<\/code>\u306e\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u306f\u300c<strong>\u30c1\u30e3\u30cd\u30eb\u540d > Messaging API\u8a2d\u5b9a<\/strong>\u300d\u306e\u30c1\u30e3\u30cd\u30eb\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u3067\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\" id=\"image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"175\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-3.png\" alt=\"\" class=\"wp-image-21416\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-3.png 536w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-3-300x98.png 300w\" sizes=\"auto, (max-width: 536px) 100vw, 536px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u3059\u3079\u3066\u3092\u8d77\u52d5\u3057\u3066\u9023\u643a\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b<\/h2>\n\n\n\n<p>\u3067\u306f\u3001\u5927\u304d\u304f\u4ee5\u4e0b3\u3064\u304c\u9023\u643a\u3057\u3066\u30b7\u30b9\u30c6\u30e0\u3092\u52d5\u304b\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ngrok<\/li>\n\n\n\n<li>LINE\u30a6\u30a7\u30d6\u30d5\u30c3\u30af<\/li>\n\n\n\n<li>Ollama<\/li>\n<\/ul>\n\n\n\n<p>ngrok\u306f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305f\u3089\u4ee5\u4e0b\u30b3\u30de\u30f3\u30c9\u3067\u7c21\u5358\u306b\u8d77\u52d5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>ngrok http 8000<\/strong><\/pre>\n\n\n\n<p>\u3059\u308b\u3068\u3001<code>ngrok<\/code>\u306e\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u3092\u5272\u308a\u5f53\u3066\u3066\u304f\u308c\u307e\u3059\u306e\u3067\u3001\u3053\u308c\u3092<code>LINE<\/code>\u30a6\u30a7\u30d6\u30d5\u30c3\u30af\u306b\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"195\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-4.png\" alt=\"\" class=\"wp-image-21427\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-4.png 640w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-4-300x91.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001<code>Forwarding<\/code>\u306b\u8868\u793a\u3055\u308c\u305f<code>URL<\/code>\u304c<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>https:\/\/abcdefgh123.ngrok-free.app<\/strong><\/pre>\n\n\n\n<p>\u3060\u3063\u305f\u3068\u3057\u305f\u3089\u3001LINE\u30a6\u30a7\u30d6\u30d5\u30c3\u30af\u306b\u8a2d\u5b9a\u3059\u308b\u306e\u306f\u3001<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>https:\/\/abcdefgh123.ngrok-free.app\/webhook<\/strong><\/pre>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"594\" height=\"253\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-5.png\" alt=\"\" class=\"wp-image-21431\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-5.png 594w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-5-300x128.png 300w\" sizes=\"auto, (max-width: 594px) 100vw, 594px\" \/><\/figure>\n\n\n\n<p>\u3053\u308c\u3067<code>LINE<\/code>\u30c1\u30e3\u30cd\u30eb\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u6765\u305f\u3089\u3001\u30ed\u30fc\u30ab\u30eb\u30d1\u30bd\u30b3\u30f3\u306b\u30c7\u30fc\u30bf\u8ee2\u9001\u3057\u3066\u304f\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u203b\u81ea\u52d5\u5fdc\u7b54\u304c\u521d\u671f\u72b6\u614b\u3067\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u308b\u3068\u601d\u3046\u306e\u3067\u3001\u958b\u767a\u3059\u308b\u3068\u304d\u306fOFF\u306b\u3057\u3068\u3044\u305f\u307b\u3046\u304c\u3044\u3044\u3067\u3059\u3002\u8d85\u30a6\u30b6\u3044\u306e\u3067\uff08\u7b11\uff09<\/p>\n\n\n\n<p>\u3067\u306f\u3001\u7d9a\u3044\u3066<code>FastAPI<\/code>\u3067\u3059\u3002<br>\u4ee5\u4e0b\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>uvicorn main:app --reload --port 8000<\/strong><\/pre>\n\n\n\n<p>\u3053\u308c\u3067\u3001<code>LINE<\/code>\u2192<code>ngrok<\/code>\u2192<code>FastAPI<\/code>\u304c\u7e4b\u304c\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3067\u306f\u6700\u5f8c\u306b<code>FastAPI<\/code>\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3053\u3068\u306b\u306a\u308b<code>Ollama<\/code>\u3067\u3059\u3002<br>\u4eca\u56de\u306f<code>Open WebUI<\/code>\uff08<code>docker compose<\/code>\uff09\u3067\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>docker compose up -d<\/strong><\/pre>\n\n\n\n<p><code>docker compose<\/code>\u306e\u69cb\u6210\u306f\u4ee5\u4e0b\u30da\u30fc\u30b8\u3068\u540c\u3058\u3067\u3059\uff08<code>Qdrant<\/code>\u306f\u4e0d\u8981\uff09<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u53c2\u8003\u30da\u30fc\u30b8\uff1a<a href=\"https:\/\/blog.capilano-fw.com\/?p=20187\" target=\"_blank\" rel=\"noreferrer noopener\">\u30aa\u30d5\u30e9\u30a4\u30f3\u3067\u5b8c\u7d50\u3059\u308b\u300c\u793e\u5185\u30de\u30cb\u30e5\u30a2\u30eb\u300dAI\u30c1\u30e3\u30c3\u30c8\u3092\u3064\u304f\u3063\u3066\u307f\u305f\uff01<\/a><\/p>\n\n\n\n<p>\u307e\u305f\u3001\u4f7f\u7528\u3059\u308b\u30e2\u30c7\u30eb\u306f\u8efd\u91cf\u306a\u306e\u306b\u8ce2\u3044Google\u88fd\u306e\u300c<strong>gemma3n:e4b<\/strong>\u300d\u3092\u4f7f\u3044\u307e\u3059\u3002\u4ee5\u4e0b\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>docker exec -it $(docker ps -qf \"name=ollama\") ollama pull gemma3n:e4b<\/strong><\/pre>\n\n\n\n<p>\u3053\u308c\u3067\u6e96\u5099\u306f\u5b8c\u4e86\u3067\u3059\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30c6\u30b9\u30c8\u3057\u3066\u307f\u308b<\/h2>\n\n\n\n<p>\u3067\u306f\u3001\u30c6\u30b9\u30c8\u7528\u306e<code>PDF<\/code>\u3092\u9001\u4fe1\u3057\u3066\u3001\u3046\u307e\u304f\u3044\u304f\u304b\u898b\u3066\u307f\u307e\u3057\u3087\u3046\uff01<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"404\" height=\"237\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-2.png\" alt=\"\" class=\"wp-image-21462\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-2.png 404w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-2-300x176.png 300w\" sizes=\"auto, (max-width: 404px) 100vw, 404px\" \/><\/figure>\n\n\n\n<p>\u3059\u308b\u3068\u3001\u30a6\u30a7\u30d6\u30d5\u30c3\u30af\u2192<code>ngrok<\/code>\u7d4c\u7531\u3067<code>FastAPI<\/code>\u304c\u52d5\u304d\u51fa\u3057\u307e\u3057\u305f\uff01<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"748\" height=\"250\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/Screenshot-from-2026-01-09-06-00-15.png\" alt=\"\" class=\"wp-image-21466\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/Screenshot-from-2026-01-09-06-00-15.png 748w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/Screenshot-from-2026-01-09-06-00-15-300x100.png 300w\" sizes=\"auto, (max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px\" \/><\/figure>\n\n\n\n<p>\u5341\u6570\u79d2\u307b\u3069\u6642\u9593\u304c\u7d4c\u3063\u3066\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"534\" height=\"43\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/Screenshot-from-2026-01-09-06-00-42.png\" alt=\"\" class=\"wp-image-21468\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/Screenshot-from-2026-01-09-06-00-42.png 534w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/Screenshot-from-2026-01-09-06-00-42-300x24.png 300w\" sizes=\"auto, (max-width: 534px) 100vw, 534px\" \/><\/figure>\n\n\n\n<p>\u306f\u3044\uff01<br>\u51e6\u7406\u304c\u7d42\u308f\u3063\u305f\u3068\u8868\u793a\u304c\u3067\u307e\u3057\u305f\ud83d\ude0a<\/p>\n\n\n\n<p>\u5b9f\u969b\u306b\u30d5\u30a9\u30eb\u30c0\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\uff01<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"550\" height=\"266\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-1.png\" alt=\"\" class=\"wp-image-21461\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-1.png 550w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2026\/01\/dify-line-integration-1-300x145.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/figure>\n\n\n\n<p>\u306f\u3044\uff01<\/p>\n\n\n\n<p>\u3061\u3083\u3093\u3068<code>estimate<\/code>\u306e\u30d5\u30a9\u30eb\u30c0\u306b\u5165\u3063\u3066\u307e\u3059\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u540d\u306f\u300c<strong>20251218_\u4e5d\u4fdd\u3059\u3053\u3072_<em>67897<\/em>_\u898b\u7a4d\u66f8.pdf<\/strong>\u300d\u3068\u3001\u96fb\u5b50\u5e33\u7c3f\u4fdd\u5b58\u6cd5\u306b\u5bfe\u5fdc\u3059\u3079\u304f\u691c\u7d22\u3057\u3084\u3059\u3044\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3059\u3079\u3066\u6210\u529f\u3067\u3059\ud83d\ude0a\u2728<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f01\u696d\u69d8\u3078\u306e\u3054\u63d0\u6848<\/h2>\n\n\n\n<p>\u4eca\u56de\u306e\u3088\u3046\u306b\u3001\u65e5\u5e38\u4f7f\u3044\u3057\u3066\u3044\u308b\u30a2\u30d7\u30ea\u3068\u30ed\u30fc\u30ab\u30eb\u306eAI\u3092\u9023\u643a\u3055\u305b\u308b\u3053\u3068\u3067\u696d\u52d9\u306e\u52b9\u7387\u5316\u3001\u4eba\u7684\u30b3\u30b9\u30c8\u306e\u524a\u6e1b\u306b\u3064\u306a\u3052\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u308c\u304b\u3089\u306f\u3001\u96fb\u5b50\u7684\u306a\u30b7\u30b9\u30c6\u30e0\u3060\u3051\u3067\u306a\u304f\u5168\u3066\u306e\u3082\u306e\u304c\u300cAI\u3092\u524d\u63d0\u3068\u3057\u305f\u69cb\u7bc9\u3092\u3059\u308b\u3088\u3046\u306b\u306a\u308b\u300d\u3068\u3082\u8a00\u308f\u308c\u3066\u304a\u308a\u3001\u30e9\u30a4\u30d0\u30eb\u4f01\u696d\u3068\u306e\u7af6\u4e89\u306b\u3082\u5f71\u97ff\u3059\u308b\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3082\u3057\u30ed\u30fc\u30ab\u30ebAI\u3092\u4f7f\u3063\u305f\u3054\u76f8\u8ac7\u304c\u3042\u308a\u307e\u3057\u305f\u3089\u3001\u304a\u6c17\u8efd\u306b\u304a\u554f\u3044\u5408\u308f\u305b\u304b\u3089\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>\u304a\u5f85\u3061\u3057\u3066\u304a\u308a\u307e\u3059\ud83d\ude0a\u2728<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u304a\u308f\u308a\u306b<\/h2>\n\n\n\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u4eca\u56de\u306f<code>LINE<\/code>\u2192<code>ngrok<\/code>\u2192<code>FastAPI<\/code>\u2192<code>Ollama<\/code>\u3068\u3044\u3046\u7d50\u69cb\u306a\u30ed\u30f3\u30b0\u30b8\u30e3\u30fc\u30cb\u30fc\u306a\u30b7\u30b9\u30c6\u30e0\u69cb\u7bc9\u3092\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u5f53\u521d\u306f<code>Dify<\/code>\u306e\u30a6\u30a7\u30d6\u30d5\u30c3\u30af\u30fb\u30c8\u30ea\u30ac\u30fc\u3092\u4f7f\u3048\u3070\u30ed\u30fc\u30b3\u30fc\u30c9\u3067\u3082\u3044\u3051\u308b\u304b\u306a\u3068\u601d\u3063\u3066\u305f\u3093\u3067\u3059\u304c\u3001\u3069\u3046\u3084\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3059\u308b\u6a5f\u80fd\u306f<code>Dify<\/code>\u306b\u306f\u306a\u3044\uff08\u30b3\u30fc\u30c9\u306e\u5b9f\u884c\u3067\u3082\u30c0\u30e1\u307f\u305f\u3044\u3067\u3059\uff09\u306e\u3067\u3001\u3084\u306f\u308a<code>AI<\/code>\u3068\u306e\u9023\u643a\u3092\u3059\u308b\u306b\u306f\u3001\u307e\u3060\u307e\u3060\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5fc5\u8981\u306a\u3093\u3060\u306a\u3068\u518d\u8a8d\u8b58\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u6b63\u76f4\u306a\u3068\u3053\u308d\u3001<code>FastAPI<\/code>\u306e\u30b3\u30fc\u30c9\u306f\u751f\u6210AI\u306b\u3064\u304f\u3063\u3066\u3082\u3089\u3044\u307e\u3057\u305f\u304c\u3001\u5c71\u307b\u3069\u4fee\u6b63&amp;\u30ea\u30d5\u30a1\u30af\u30bf\u30ea\u30f3\u30b0\u3057\u3066\u307e\u3059\u3057\u3001\u3053\u308c\u304b\u3089\u306e\u6642\u4ee3\u306f\u305d\u3053\u304c\u4fa1\u5024\u306b\u306a\u3063\u3066\u3044\u304d\u305d\u3046\u306a\u6c17\u304c\u3057\u3066\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3068\u306a\u308b\u3068\u30011\u884c\u305a\u3064\u30b3\u30fc\u30c9\u3092\u66f8\u3044\u3066\u305f\u7d4c\u9a13\u306f\u3001\u7d50\u69cb\u6709\u5229\u306a\u3093\u3058\u3083\u306a\u3044\u304b\u306a\u3068\u3082\u8003\u3048\u3066\u307e\u3059\uff08\u3069\u3046\u3067\u3057\u3087\u3046\u304b\u2026\ud83e\udd14\uff09<\/p>\n\n\n\n<p>\u30db\u30f3\u30c8\u306b\u5909\u5316\u306e\u65e9\u3044\u6642\u4ee3\u306b\u751f\u304d\u3066\u3044\u307e\u3059\u304c\u3001\u3044\u3064\u304b\u9006\u306b\u300c\u307b\u307c\u5909\u5316\u306a\u3093\u3066\u3057\u306a\u3044\u4e16\u754c\u300d\u304c\u6765\u305f\u308a\u3059\u308b\u3093\u3067\u3057\u3087\u3046\u304b\u3002\u3046\u30fc\u3093\u2026\u3002<\/p>\n\n\n\n<p>\u3067\u306f\u3067\u306f\u301c\uff01<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"294\" height=\"320\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/08\/no_13.png\" alt=\"\" class=\"wp-image-9470\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/08\/no_13.png 294w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/08\/no_13-276x300.png 276w\" sizes=\"auto, (max-width: 294px) 100vw, 294px\" \/><\/figure><\/div>\n\n\n<p class=\"has-text-align-center\">\u300c\u51b7\u51cd\u305f\u3053\u713c\u304d+\u677e\u8338\u306e\u304a\u5438\u3044\u7269<br>\u3067\u3001\u660e\u77f3\u713c\u304d\u3068\u3057\u3066\u98df\u3079\u3066\u307e\u3059\ud83d\udc4d\u300d<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3055\u3066\u3055\u3066\u3001\u3053\u306e\u3068\u3053\u308d\u30ed\u30fc\u30ab\u30ebAI\u306b\u611f\u52d5\u3057\u3066\u3044\u308d\u3044\u308d\u3068\u30b7\u30b9\u30c6\u30e0\u3092\u8a66\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u793e\u5916\u79d8\u3092\u5168\u9762\u306b\u62bc\u3057\u51fa\u3057\u3066\u3044\u305f\u306e\u3067\u3001\u3084\u3063\u3066\u3044\u306a\u3044\u3053\u3068\u304c\u3042\u308a\u307e\u3057\u305f\u3002 \u305d\u308c\u306f\u3001\u3082\u3061\u308d\u3093 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.capilano-fw.com\/?p=21386\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;\u9818\u53ce\u66f8\u3001\u8acb\u6c42\u66f8\u3001\u898b\u7a4d\u66f8\u3092 LINE\u3067\u9001\u308b\u3060\u3051\u81ea\u52d5\u51e6\u7406\uff01\u30b9\u30e2\u30fc\u30eb\u30d3\u30b8\u30cd\u30b9\u306e\u7d4c\u7406\u3092\u697d\u306b\u3059\u308b\u30b7\u30b9\u30c6\u30e0&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":21582,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39,265],"tags":[272],"class_list":["post-21386","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-ai","tag-docling"],"_links":{"self":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/21386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21386"}],"version-history":[{"count":188,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/21386\/revisions"}],"predecessor-version":[{"id":21583,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/21386\/revisions\/21583"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/media\/21582"}],"wp:attachment":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}