{"id":6466,"date":"2026-06-13T16:42:19","date_gmt":"2026-06-13T07:42:19","guid":{"rendered":"https:\/\/secondlife.lol\/?p=6466"},"modified":"2026-06-13T22:45:35","modified_gmt":"2026-06-13T13:45:35","slug":"openclaw-telegram-qwen2-5-coder-local-ai-agent","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/ja\/openclaw-telegram-qwen2-5-coder-local-ai-agent\/","title":{"rendered":"\ub85c\uceec PC\uc5d0\uc11c \ud074\ub77c\uc6b0\ub4dc \ube44\uc6a9 \uc5c6\uc774 \ucf54\ub529 AI \ube44\uc11c \ub9cc\ub4e4\uae30: OpenClaw Telegram Qwen2.5 Coder \uc644\ubcbd \uad6c\ucd95 \uac00\uc774\ub4dc (2026)"},"content":{"rendered":"<style>.kb-image6466_6486f9-72 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image6466_6486f9-72\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"403\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/06\/image-18-600x403.jpg\" alt=\"OpenClaw Telegram Qwen2.5 Coder \uc544\ud0a4\ud14d\ucc98 \ub2e4\uc774\uc5b4\uadf8\ub7a8\" class=\"kb-img wp-image-6468\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/06\/image-18-600x403.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/06\/image-18-300x201.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/06\/image-18-768x516.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/06\/image-18-18x12.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/06\/image-18.jpg 1168w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption>OpenClaw Telegram Qwen2.5 Coder \uc544\ud0a4\ud14d\ucc98 \ub2e4\uc774\uc5b4\uadf8\ub7a8<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/docs.openclaw.ai\/providers\/lmstudio\/\" target=\"_blank\" rel=\"noopener\">OpenClaw<\/a> <a href=\"https:\/\/web.telegram.org\/\" target=\"_blank\" rel=\"noopener\">Telegram<\/a> Qwen2.5 Coder(<a href=\"https:\/\/lmstudio.ai\/\" target=\"_blank\" rel=\"noopener\">LM Studio<\/a>)\ub97c \uacb0\ud569\ud558\uba74 \uc644\uc804 \uc624\ud504\ub77c\uc778 + \ubb34\uc81c\ud55c + \ud504\ub77c\uc774\ubc84\uc2dc 100%\uc778 \ucf54\ub529 AI \uc5d0\uc774\uc804\ud2b8\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud154\ub808\uadf8\ub7a8\uc5d0 \u201c<code>hello.py<\/code> \ub9cc\ub4e4\uc5b4\uc918\u201d \ub610\ub294 \u201c<code>src\/utils<\/code> \ud3f4\ub354\uc5d0 \ub0a0\uc9dc \ud5ec\ud37c \ud568\uc218 \uc791\uc131\ud574\uc918\u201d\ub77c\uace0\ub9cc \ub9d0\ud558\uba74, <strong><a href=\"https:\/\/ollama.com\/library\/qwen2.5-coder:14b\" target=\"_blank\" rel=\"noopener\">Qwen2.5 Coder 14B<\/a><\/strong>\uac00 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\uace0 \ub85c\uceec \ud30c\uc77c\uc2dc\uc2a4\ud15c\uc5d0 \ubc14\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4.<br>\ud074\ub77c\uc6b0\ub4dc API \ube44\uc6a9\ub3c4 \uc5c6\uace0, \ucf54\ub4dc\uac00 \uc678\ubd80\ub85c \uc720\ucd9c\ub418\uc9c0 \uc54a\uc73c\uba70, \uc18d\ub3c4\ub3c4 \ub9e4\uc6b0 \ube60\ub985\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u8a18\u4e8b\u3067\u306f <strong>OpenClaw \uc2a4\ud0c0\uc77c<\/strong>\ub85c \uc124\uacc4\ub41c \uc2e4\uc81c \ub3d9\uc791\ud558\ub294 \uc2dc\uc2a4\ud15c \uc804\uccb4\ub97c \ub2e8\uacc4\ubcc4\ub85c \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uacf5\uac1c\ud569\ub2c8\ub2e4.<br>\ucca8\ubd80\ub41c \uc804\uccb4 \uc18c\uc2a4\ucf54\ub4dc\uc640 \uc0c1\uc138 \uc8fc\uc11d\uae4c\uc9c0 \ud3ec\ud568\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap{padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);border-top:3px solid var(--global-palette2, #2B6CB0);border-right:3px solid var(--global-palette2, #2B6CB0);border-bottom:3px solid var(--global-palette2, #2B6CB0);border-left:3px solid var(--global-palette2, #2B6CB0);border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:5px;box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title-wrap{color:var(--global-palette2, #2B6CB0);}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title{color:var(--global-palette2, #2B6CB0);font-size:28px;font-weight:regular;font-style:normal;}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap .kb-table-of-content-list{color:var(--global-palette1, #3182CE);line-height:2em;font-weight:regular;font-style:normal;margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-bottom:0px;margin-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap .kb-table-of-content-list .kb-table-of-contents__entry:hover{color:var(--global-palette6, #718096);}@media all and (max-width: 1024px){.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap{border-top:3px solid var(--global-palette2, #2B6CB0);border-right:3px solid var(--global-palette2, #2B6CB0);border-bottom:3px solid var(--global-palette2, #2B6CB0);border-left:3px solid var(--global-palette2, #2B6CB0);}}@media all and (max-width: 1024px){.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title{font-size:28px;}}@media all and (max-width: 767px){.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap{border-top:3px solid var(--global-palette2, #2B6CB0);border-right:3px solid var(--global-palette2, #2B6CB0);border-bottom:3px solid var(--global-palette2, #2B6CB0);border-left:3px solid var(--global-palette2, #2B6CB0);}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title{font-size:28px;}}<\/style>\n\n\n<h2 class=\"wp-block-heading\">\uc65c \uc774 \uc870\ud569\uc778\uac00?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OpenClaw<\/strong>: \uc720\uc5f0\ud55c \uc5d0\uc774\uc804\ud2b8 \ud504\ub808\uc784\uc6cc\ud06c + Telegram \ucc44\ub110 \uc9c0\uc6d0<\/li>\n\n\n\n<li><strong>Telegram<\/strong>: \uac00\uc7a5 \ud3b8\ud55c \uc785\ub825 \uc778\ud130\ud398\uc774\uc2a4 (\ubaa8\ubc14\uc77c\/\ub370\uc2a4\ud06c\ud1b1 \uc5b4\ub514\uc11c\ub098)<\/li>\n\n\n\n<li><strong>LM Studio + Qwen2.5 Coder<\/strong>: \ub85c\uceec\uc5d0\uc11c \ucd5c\uace0 \uc218\uc900\uc758 \ucf54\ub529 \uc131\ub2a5 (14B \ud30c\ub77c\ubbf8\ud130, \ucf54\ub4dc \ud2b9\ud654)<\/li>\n\n\n\n<li><strong>\uc644\uc804 \ub85c\uceec<\/strong>: \uc778\ud130\ub137 \uc5c6\uc774\ub3c4 \ub3d9\uc791, \ub370\uc774\ud130 \uc720\ucd9c \uc81c\ub85c, \ubb34\uc81c\ud55c \uc0ac\uc6a9<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\uc2dc\uc2a4\ud15c \uc544\ud0a4\ud14d\ucc98<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\ud154\ub808\uadf8\ub7a8 \uba54\uc2dc\uc9c0\n    \u2193\nPython \ubd07 (python-telegram-bot)\n    \u2193\nLM Studio API (localhost:1234\/v1)\n    \u2514\u2500 Qwen2.5 Coder 14B (mlx \uc591\uc790\ud654)\n    \u2193\n~\/lmstudio-workspace\/ (\uc2e4\uc81c \ud30c\uc77c \uc0dd\uc131)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">1\ub2e8\uacc4: LM Studio \uc124\uce58 \ubc0f Qwen2.5 Coder \ubaa8\ub378 \uc900\ube44<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/lmstudio.ai\" target=\"_blank\" rel=\"noopener\">LM Studio \uacf5\uc2dd \uc0ac\uc774\ud2b8<\/a>\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc \ubc0f \uc124\uce58<\/li>\n\n\n\n<li>\uac80\uc0c9\ucc3d\uc5d0 <code>qwen2.5-coder<\/code> \uc785\ub825 \u2192 <strong>Qwen2.5 Coder 14B Instruct (MLX)<\/strong> \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/li>\n\n\n\n<li>\ubaa8\ub378 \ub85c\ub4dc \ud6c4 \uc88c\uce21 \uba54\ub274 <strong>Local Server<\/strong> \u2192 <strong>Start Server<\/strong><\/li>\n\n\n\n<li><code>http:\/\/localhost:1234<\/code> \uc811\uc18d \ud655\uc778<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc11c\ubc84 \ub3d9\uc791 \ud655\uc778 \uba85\ub839\uc5b4<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \ud130\ubbf8\ub110\uc5d0\uc11c \uc544\ub798\uc758 \uba85\ub839\uc5b4 \uc2e4\ud589\ncurl http:\/\/localhost:1234\/v1\/models<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2\ub2e8\uacc4: Telegram \ubd07 \uc0dd\uc131<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Telegram\uc5d0\uc11c <code>@BotFather<\/code> \u691c\u7d22<\/li>\n\n\n\n<li><code>\/newbot<\/code> \uc785\ub825<\/li>\n\n\n\n<li>\ubd07 \uc774\ub984\uacfc username \uc124\uc815 (<code>_bot<\/code>\uc73c\ub85c \ub05d\ub098\uc57c \ud568)<\/li>\n\n\n\n<li>\uc0dd\uc131\ub41c \ud1a0\ud070 \ubcf5\uc0ac<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">3\ub2e8\uacc4: \ud504\ub85c\uc81d\ud2b8 \ud30c\uc77c \uc0dd\uc131<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354\ub97c \ub9cc\ub4e4\uace0 \uc544\ub798 \ud30c\uc77c\ub4e4\uc744 \uc0dd\uc131\ud558\uc138\uc694.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc804\uccb4 \uad6c\uc870<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>telegram-lmstudio-bot\/\n\u251c\u2500\u2500 bot.py\n\u251c\u2500\u2500 lm_client.py\n\u251c\u2500\u2500 executor.py\n\u251c\u2500\u2500 run.py\n\u251c\u2500\u2500 requirements.txt\n\u251c\u2500\u2500 .env\n\u2514\u2500\u2500 README.md<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">bot.py (\ud154\ub808\uadf8\ub7a8 \ud578\ub4e4\ub7ec)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\"\"\"\n\ud154\ub808\uadf8\ub7a8 \ubd07 \u2192 LM Studio (Qwen2.5 Coder) \u2192 \ub85c\uceec \ud30c\uc77c\uc2dc\uc2a4\ud15c\nOpenClaw \uc2a4\ud0c0\uc77c\uc758 \uac04\uacb0\ud558\uace0 \uac15\ub825\ud55c \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8\n\"\"\"\n\nimport logging\nimport os\nfrom telegram import Update\nfrom telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes\nfrom lm_client import ask_qwen\nfrom executor import execute_actions\n\nlogging.basicConfig(\n    format=\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\",\n    level=logging.INFO\n)\nlogger = logging.getLogger(__name__)\n\n# \ubcf4\uc548: \ud2b9\uc815 \uc720\uc800\ub9cc \ud5c8\uc6a9 (\ube44\uc6cc\ub450\uba74 \ubaa8\ub450 \ud5c8\uc6a9)\nALLOWED_USER_IDS: list&#91;int] = &#91;]  \n\nWORKSPACE = os.path.expanduser(\"~\/lmstudio-workspace\")\nos.makedirs(WORKSPACE, exist_ok=True)\n\ndef is_allowed(user_id: int) -&gt; bool:\n    if not ALLOWED_USER_IDS:\n        return True\n    return user_id in ALLOWED_USER_IDS\n\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    await update.message.reply_text(\n        \"\uc548\ub155\ud558\uc138\uc694! OpenClaw \uc2a4\ud0c0\uc77c LM Studio Qwen2.5 Coder \ubd07\uc785\ub2c8\ub2e4.\\n\\n\"\n        \"\uc790\uc5f0\uc5b4\ub85c \uba85\ub839\uc744 \ub0b4\ub824\uc8fc\uc138\uc694. \uc608\uc2dc:\\n\"\n        \"\u2022 `hello.py \ud30c\uc77c \ub9cc\ub4e4\uc5b4\uc918`\\n\"\n        \"\u2022 `src\/utils \ud3f4\ub354 \ub9cc\ub4e4\uace0 date_helper.py \uc791\uc131\ud574\uc918`\\n\"\n        \"\u2022 `\ud53c\ubcf4\ub098\uce58 \uc218\uc5f4 \ucf54\ub4dc \ub9cc\ub4e4\uc5b4\uc918`\\n\\n\"\n        f\"\uc791\uc5c5 \ud3f4\ub354: `{WORKSPACE}`\",\n        parse_mode=\"Markdown\"\n    )\n\nasync def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    user_id = update.effective_user.id\n    if not is_allowed(user_id):\n        await update.message.reply_text(\"\uc811\uadfc \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.\")\n        return\n\n    user_input = update.message.text\n    logger.info(f\"&#91;{user_id}] \uc785\ub825: {user_input}\")\n\n    status_msg = await update.message.reply_text(\"\u23f3 Qwen2.5 Coder\uc5d0\uac8c \uc694\uccad \uc911...\")\n\n    try:\n        actions = await ask_qwen(user_input, WORKSPACE)\n        if not actions:\n            await status_msg.edit_text(\"\u274c \uc720\ud6a8\ud55c \uc751\ub2f5\uc744 \ubc1b\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4.\")\n            return\n\n        await status_msg.edit_text(f\"\ud83d\udd27 {len(actions)}\uac1c \uc791\uc5c5 \uc2e4\ud589 \uc911...\")\n        results = execute_actions(actions, WORKSPACE)\n        summary = format_results(results)\n        await status_msg.edit_text(summary, parse_mode=\"Markdown\")\n\n    except Exception as e:\n        logger.exception(\"\uc624\ub958 \ubc1c\uc0dd\")\n        await status_msg.edit_text(f\"\u274c \uc624\ub958: {str(e)}\")\n\n# ... (format_results \ud568\uc218 \uc0dd\ub7b5, \uc544\ub798 \uc804\uccb4 \ucf54\ub4dc \ucc38\uc870)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">lm_client.py (LM Studio \ud1b5\uc2e0 \ud575\uc2ec)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\"\"\"\nLM Studio API \ud074\ub77c\uc774\uc5b8\ud2b8\nQwen2.5 Coder\uc5d0\uac8c \uc790\uc5f0\uc5b4 \uba85\ub839 \u2192 JSON \uc561\uc158 \ubcc0\ud658 \uc694\uccad\nOpenClaw \uc2a4\ud0c0\uc77c\uc758 \uac15\ub825\ud55c SYSTEM_PROMPT \uc0ac\uc6a9\n\"\"\"\n\nimport json\nimport logging\nimport httpx\n\nlogger = logging.getLogger(__name__)\n\nLM_STUDIO_BASE_URL = \"http:\/\/localhost:1234\/v1\"\nMODEL_ID = \"qwen2.5-coder-14b-instruct-mlx\"\n\nSYSTEM_PROMPT = \"\"\"\ub2f9\uc2e0\uc740 \ud30c\uc77c \uc2dc\uc2a4\ud15c \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 AI \uc5d0\uc774\uc804\ud2b8\uc785\ub2c8\ub2e4.\n\uc0ac\uc6a9\uc790\uc758 \uc790\uc5f0\uc5b4 \uba85\ub839\uc744 \ubd84\uc11d\ud558\uc5ec \uc218\ud589\ud560 \uc791\uc5c5 \ubaa9\ub85d\uc744 JSON\uc73c\ub85c\ub9cc \ubc18\ud658\ud558\uc138\uc694.\n\n\ubc18\ud658 \ud615\uc2dd (JSON \ubc30\uc5f4\ub9cc, \uc124\uba85 \uc5c6\uc774):\n&#91;\n  {\"action\": \"create_folder\", \"path\": \"\uc0c1\ub300\uacbd\ub85c\/\ud3f4\ub354\uba85\"},\n  {\"action\": \"create_file\", \"path\": \"\uc0c1\ub300\uacbd\ub85c\/\ud30c\uc77c\uba85.py\", \"content\": \"\uc644\uc804\ud55c \ucf54\ub4dc\"},\n  {\"action\": \"append_file\", \"path\": \"...\", \"content\": \"...\"}\n]\n\n\uaddc\uce59:\n- path\ub294 \ud56d\uc0c1 \uc0c1\ub300\uacbd\ub85c (\uc808\ub300\uacbd\ub85c \uae08\uc9c0)\n- \ud544\uc694\ud55c \ud3f4\ub354\ub294 create_folder \uba3c\uc800\n- \ucf54\ub4dc \ud30c\uc77c\uc740 \uc2e4\uc81c \ub3d9\uc791\ud558\ub294 \uc644\uc804\ud55c \ucf54\ub4dc\ub85c \uc791\uc131\n- JSON \uc678 \ub2e4\ub978 \ud14d\uc2a4\ud2b8 \uc808\ub300 \ucd9c\ub825 \uae08\uc9c0\n\"\"\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">executor.py (\uc548\uc804\ud55c \ud30c\uc77c \uc2e4\ud589\uae30)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\"\"\"\n\uc561\uc158 \uc2e4\ud589\uae30\n\uacbd\ub85c \ud2b8\ub798\ubc84\uc124 \uacf5\uaca9 \ubc29\uc9c0 + \ubd80\ubaa8 \ud3f4\ub354 \uc790\ub3d9 \uc0dd\uc131\n\"\"\"\n\nimport logging\nimport os\n\nlogger = logging.getLogger(__name__)\n\ndef safe_path(workspace: str, relative_path: str) -&gt; str | None:\n    \"\"\"\uacbd\ub85c \ud0c8\ucd9c \ubc29\uc9c0 \ud575\uc2ec \ud568\uc218\"\"\"\n    abs_workspace = os.path.realpath(workspace)\n    abs_target = os.path.realpath(os.path.join(abs_workspace, relative_path))\n    if not abs_target.startswith(abs_workspace):\n        logger.warning(f\"\uacbd\ub85c \ud0c8\ucd9c \uc2dc\ub3c4 \ucc28\ub2e8: {relative_path}\")\n        return None\n    return abs_target\n\ndef execute_actions(actions: list&#91;dict], workspace: str) -&gt; list&#91;dict]:\n    results = &#91;]\n    for action in actions:\n        # ... (create_folder, create_file, append_file \ucc98\ub9ac)\n        # \uc0c1\uc138 \ucf54\ub4dc\ub294 \ucca8\ubd80 \ud30c\uc77c \ucc38\uc870\n    return results<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc804\uccb4 \uc18c\uc2a4\ucf54\ub4dc\ub294 \ucca8\ubd80 \ud30c\uc77c<\/strong>\ub85c \uc81c\uacf5\ub418\uba70, \uc704 \ucf54\ub4dc\ub4e4\uc740 \ud575\uc2ec \ubd80\ubd84\uc5d0 \uc0c1\uc138 \uc8fc\uc11d\uc744 \ucd94\uac00\ud55c \ubc84\uc804\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4\ub2e8\uacc4: \uc124\uce58 \ubc0f \uc2e4\ud589<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 -m venv venv\nsource venv\/bin\/activate\npip install -r requirements.txt\n\ncp .env.example .env\n# .env\uc5d0 TELEGRAM_BOT_TOKEN \uc785\ub825\n\npython run.py<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5\ub2e8\uacc4: \uc2e4\uc81c \uc0ac\uc6a9 \uc608\uc2dc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud154\ub808\uadf8\ub7a8\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc785\ub825\ud574\uc8fc\uc138\uc694.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>src\/utils \ud3f4\ub354 \ub9cc\ub4e4\uace0 date_helper.py \uc791\uc131\ud574\uc918. \uc624\ub298 \ub0a0\uc9dc\ub97c YYYY-MM-DD \ud615\uc2dd\uc73c\ub85c \ubc18\ud658\ud558\ub294 \ud568\uc218 \ud3ec\ud568<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 \ubd07\uc774 \uc790\ub3d9\uc73c\ub85c \ud3f4\ub354 \uc0dd\uc131 + \uc644\uc804\ud55c Python \ud30c\uc77c \uc800\uc7a5<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud2b8\ub7ec\ube14\uc288\ud305 (\ucee4\ubba4\ub2c8\ud2f0\uc5d0\uc11c \uc790\uc8fc \ub098\uc624\ub294 \ubb38\uc81c)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q. JSON \ud30c\uc2f1 \uc2e4\ud328<\/strong><br>\u2192 <code>parse_actions<\/code> \ud568\uc218\uac00 \ub9c8\ud06c\ub2e4\uc6b4 \ucf54\ub4dc\ube14\ub85d\uacfc \ubd88\uc644\uc804\ud55c JSON\uc744 \uc790\ub3d9 \uc815\ub9ac\ud569\ub2c8\ub2e4.<br>\uc628\ub3c4(<code>temperature=0.1<\/code>)\ub97c \ub0ae\ucd94\uba74 \ub354 \uc548\uc815\uc801\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q. \uacbd\ub85c\uac00 \uc0dd\uc131\ub418\uc9c0 \uc54a\uc74c<\/strong><br><code>safe_path<\/code> \ud568\uc218\uac00 \uacbd\ub85c \ud0c8\ucd9c\uc744 \ucc28\ub2e8\ud569\ub2c8\ub2e4. \uc0c1\ub300\uacbd\ub85c\ub9cc \uc0ac\uc6a9\ud558\uc138\uc694.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q. LM Studio \uc751\ub2f5\uc774 \ub290\ub9bc<\/strong><br>Qwen2.5 Coder 14B\ub294 8K\/32K context \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>MLX \uc591\uc790\ud654 \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud558\uba74 Mac\uc5d0\uc11c \ub9e4\uc6b0 \ube60\ub985\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q. \ubd07\uc774 \uc8fd\uc74c<\/strong><br><code>termux-wake-lock<\/code> \uc2a4\ud0c0\uc77c\ub85c \uc2dc\uc2a4\ud15c\uc774 \uc808\uc804 \ubaa8\ub4dc\uc5d0 \ub4e4\uc5b4\uac00\uc9c0 \uc54a\ub3c4\ub85d \uc124\uc815\ud558\uac70\ub098, <code>pm2<\/code> \u307e\u305f\u306f <code>systemd<\/code>\ub85c \ub370\ubaac\ud654\ud558\uc138\uc694.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OpenClaw\uc640\uc758 \ud1b5\ud569 \ubc29\ubc95<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubd07\uc740 <strong>OpenClaw\uc758 \ucca0\ud559<\/strong>\uc744 \uadf8\ub300\ub85c \ub530\ub985\ub2c8\ub2e4.<br>OpenClaw\uc5d0\uc11c \uc774\ubbf8 Telegram \ucc44\ub110\uc744 \uc0ac\uc6a9 \uc911\uc774\ub77c\uba74<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>OpenClaw onboarding\uc5d0\uc11c <strong>OpenAI \ud638\ud658 \ud504\ub85c\ubc14\uc774\ub354<\/strong> \uc120\ud0dd<\/li>\n\n\n\n<li>Base URL\uc744 <code>http:\/\/localhost:1234\/v1<\/code>\ub85c \uc124\uc815<\/li>\n\n\n\n<li>Model\uc744 <code>qwen2.5-coder-14b-instruct-mlx<\/code>\ub85c \uc9c0\uc815<\/li>\n\n\n\n<li>\uc704 SYSTEM_PROMPT\ub97c Skills \ub610\ub294 Custom Prompt\ub85c \uc801\uc6a9<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\ub354 \uac15\ub825\ud55c \uc5d0\uc774\uc804\ud2b8\uac00 \ud544\uc694\ud558\ub2e4\uba74 OpenClaw\uc758 \uae30\uc874 \ub3c4\uad6c \uc2dc\uc2a4\ud15c\uacfc \uacb0\ud569\ud558\uc138\uc694.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7d50\u8ad6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>OpenClaw Telegram Qwen2.5 Coder<\/strong>(<strong>LM Studio<\/strong>) \uc870\ud569\uc740 \ud604\uc7ac \uac00\uc7a5 \uc2e4\uc6a9\uc801\uc778 <strong>\ub85c\uceec \ucf54\ub529 AI \uc5d0\uc774\uc804\ud2b8<\/strong>\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc6b0\ub4dc \ube44\uc6a9 \uc5c6\uc774, \ub370\uc774\ud130 \uc720\ucd9c \uc5c6\uc774, \uc5b8\uc81c \uc5b4\ub514\uc11c\ub098 \uc790\uc5f0\uc5b4\ub85c \ucf54\ub4dc\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c0\uae08 \ubc14\ub85c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\ubcf4\uc138\uc694!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uacf5\uc2dd \ucd9c\ucc98 \ubc0f \ucc38\uace0 \uc790\ub8cc<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/lmstudio.ai\/\" target=\"_blank\" rel=\"noopener\">LM Studio<\/a> \uacf5\uc2dd \uc0ac\uc774\ud2b8 \ubc0f \ubb38\uc11c<\/li>\n\n\n\n<li>Qwen2.5 Coder \ubaa8\ub378 (LM Studio \ud5c8\ube0c)<\/li>\n\n\n\n<li>python-telegram-bot \uacf5\uc2dd \ubb38\uc11c<\/li>\n\n\n\n<li><a href=\"https:\/\/openclaw.ai\" target=\"_blank\" rel=\"noopener\">OpenClaw<\/a> \uacf5\uc2dd \ubb38\uc11c \ubc0f \ucca0\ud559<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>OpenClaw Telegram Qwen2.5 Coder(LM Studio)\ub97c \uacb0\ud569\ud558\uba74 \uc644\uc804 \uc624\ud504\ub77c\uc778 + \ubb34\uc81c\ud55c&#8230;<\/p>","protected":false},"author":3,"featured_media":6468,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[7],"tags":[1586,1591,1588,1592,1589,1585,1587],"class_list":["post-6466","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-coding","tag-lm-studio","tag-lm-studio-qwen","tag-openclaw-telegram","tag-qwen2-5-coder","tag--ai-","tag-1585","tag-1587"],"taxonomy_info":{"category":[{"value":7,"label":"\uc778\uacf5\uc9c0\ub2a5(AI)"}],"post_tag":[{"value":1586,"label":"LM Studio"},{"value":1591,"label":"LM Studio Qwen"},{"value":1588,"label":"OpenClaw Telegram"},{"value":1592,"label":"Qwen2.5 Coder"},{"value":1589,"label":"\ub85c\uceec AI \ucf54\ub529"},{"value":1585,"label":"\uc624\ud508\ud074\ub85c"},{"value":1587,"label":"\ud154\ub808\uadf8\ub7a8 \ubd07"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/06\/image-18-600x403.jpg",600,403,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/ja\/author\/tere\/"},"comment_info":0,"category_info":[{"term_id":7,"name":"\uc778\uacf5\uc9c0\ub2a5(AI)","slug":"ai-coding","term_group":0,"term_taxonomy_id":7,"taxonomy":"category","description":"","parent":20,"count":74,"filter":"raw","cat_ID":7,"category_count":74,"category_description":"","cat_name":"\uc778\uacf5\uc9c0\ub2a5(AI)","category_nicename":"ai-coding","category_parent":20}],"tag_info":[{"term_id":1586,"name":"LM Studio","slug":"lm-studio","term_group":0,"term_taxonomy_id":1586,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1591,"name":"LM Studio Qwen","slug":"lm-studio-qwen","term_group":0,"term_taxonomy_id":1591,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1588,"name":"OpenClaw Telegram","slug":"openclaw-telegram","term_group":0,"term_taxonomy_id":1588,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1592,"name":"Qwen2.5 Coder","slug":"qwen2-5-coder","term_group":0,"term_taxonomy_id":1592,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1589,"name":"\ub85c\uceec AI \ucf54\ub529","slug":"%eb%a1%9c%ec%bb%ac-ai-%ec%bd%94%eb%94%a9","term_group":0,"term_taxonomy_id":1589,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1585,"name":"\uc624\ud508\ud074\ub85c","slug":"%ec%98%a4%ed%94%88%ed%81%b4%eb%a1%9c","term_group":0,"term_taxonomy_id":1585,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1587,"name":"\ud154\ub808\uadf8\ub7a8 \ubd07","slug":"%ed%85%94%eb%a0%88%ea%b7%b8%eb%9e%a8-%eb%b4%87","term_group":0,"term_taxonomy_id":1587,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/6466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/comments?post=6466"}],"version-history":[{"count":3,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/6466\/revisions"}],"predecessor-version":[{"id":6471,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/6466\/revisions\/6471"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media\/6468"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media?parent=6466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/categories?post=6466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/tags?post=6466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}