เจาะลึกการสร้าง Agentic Workflow ด้วย Kimi CLI: จากการแก้บั๊กอัตโนมัติสู่ระบบ Session Memory แบบไร้รอยต่อ

· By: NatapolK

เจาะลึกการสร้าง Agentic Workflow ด้วย Kimi CLI: จากการแก้บั๊กอัตโนมัติสู่ระบบ Session Memory แบบไร้รอยต่อ

ในบทช่วยสอนนี้ เราจะกำหนดค่าและใช้งาน Kimi CLI ในฐานะ AI coding agent แบบไม่เป็นแบบโต้ตอบ (non-interactive) อย่างเต็มรูปแบบ

กระบวนการเริ่มตั้งแต่การติดตั้ง CLI ผ่าน uv บนสภาพแวดล้อม Python 3.13 แบบแยกส่วน การกำหนดค่าการพิสูจน์ตัวตน Moonshot API ผ่านผู้ให้บริการที่ใช้ TOML และการกำหนดโมเดล ไปจนถึงการสร้าง Python wrapper ที่นำกลับมาใช้ใหม่ได้สำหรับการรันคำสั่ง CLI แบบไม่ต้องโต้ตอบทีละขั้นตอน จากนั้นเราจะใช้ Kimi กับเวิร์กโฟลว์โครงการจริงเพื่อตรวจสอบ codebase, ระบุความเสี่ยง, แก้ไขไฟล์ต้นฉบับอัตโนมัติ, สร้าง unit tests และรันคำสั่งตรวจสอบความถูกต้องจนกว่าโครงการจะผ่านการทดสอบ

นอกจากนี้เรายังสำรวจ structured JSONL event streams, persistent multi-turn sessions, โหมดแผนงาน (plan mode), การเลือกโมเดล, Ralph loops, การผสานรวม MCP, การส่งออกเซสชัน และการเข้าถึงผ่านเว็บ ซึ่งจะช่วยให้เรามีพื้นฐานในการฝัง Kimi CLI เข้ากับไปป์ไลน์การพัฒนาอัตโนมัติและวิศวกรรมแบบ Agentic ได้อย่างมีประสิทธิภาพ

การตั้งค่าสภาพแวดล้อมและการติดตั้ง Kimi CLI

import os, subprocess, textwrap, json, getpass, pathlib, shutil
HOME = pathlib.Path.home()
def sh(cmd, check=True, env=None, cwd=None):
"""Run a shell command, stream its output, return CompletedProcess."""
print(f"\n$ {cmd}")
e = {**os.environ, **(env or {})}
r = subprocess.run(cmd, shell=True, env=e, cwd=cwd,
capture_output=True, text=True)
if r.stdout: print(r.stdout)
if r.stderr: print(r.stderr[-2000:])
if check and r.returncode != 0:
raise RuntimeError(f"Command failed ({r.returncode}): {cmd}")
return r
print("=" * 70, "\nPART 1: Installing uv + Kimi CLI\n", "=" * 70)
sh("curl -LsSf https://astral.sh/uv/install.sh | sh")
UV_BIN = str(HOME / ".local" / "bin")
os.environ["PATH"] = f"{UV_BIN}:{os.environ['PATH']}"
sh("uv tool install --python 3.13 kimi-cli")
sh("kimi --version")

เราเริ่มต้นด้วยการนำเข้าโมดูล Python ที่จำเป็นและกำหนดฟังก์ชันช่วยสำหรับรันคำสั่ง shell เพื่อควบคุม subprocess เราทำการติดตั้ง uv และเพิ่มไดเรกทอรีไบนารีลงใน PATH จากนั้นใช้ uv ติดตั้ง Kimi CLI พร้อมสภาพแวดล้อม Python 3.13 และตรวจสอบความเรียบร้อยของการติดตั้งผ่านคำสั่งเช็คเวอร์ชัน

การกำหนดค่าการพิสูจน์ตัวตน Moonshot API และการเข้าถึงโมเดล

print("=" * 70, "\nPART 2: Configuring API access\n", "=" * 70)
try:
from google.colab import userdata
API_KEY = userdata.get("MOONSHOT_API_KEY")
print("Loaded key from Colab Secrets.")
except Exception:
API_KEY = getpass.getpass("Paste your Moonshot API key (hidden): ")
BASE_URL = "https://api.moonshot.ai/v1"
MODEL_NAME = "kimi-k2-0711-preview"
kimi_dir = HOME / ".kimi"
kimi_dir.mkdir(exist_ok=True)
(kimi_dir / "config.toml").write_text(textwrap.dedent(f"""\
default_model = "kimi-k2"
[providers.moonshot]
type = "kimi"
base_url = "{BASE_URL}"
api_key = "{API_KEY}"
[models.kimi-k2]
provider = "moonshot"
model = "{MODEL_NAME}"
max_context_size = 131072
"""))
print("Wrote ~/.kimi/config.toml")

เราดึงข้อมูล Moonshot API key อย่างปลอดภัยผ่าน Google Colab Secrets หรือ input แบบซ่อน จากนั้นกำหนด endpoint และชื่อโมเดลเป้าหมาย พร้อมสร้างไดเรกทอรีการตั้งค่า .kimi และเขียนไฟล์ config.toml เพื่อระบุรายละเอียดผู้ให้บริการ, รุ่นโมเดล และ context window สำหรับการใช้งานแบบอัตโนมัติโดยไม่ต้องโต้ตอบ

การสร้าง Non-Interactive Kimi Execution Wrapper ที่นำกลับมาใช้ใหม่ได้

def kimi(prompt, work_dir=".", yolo=False, cont=False, quiet=True,
stream_json=False, extra="", timeout=600):
"""Run one headless Kimi CLI turn and return its stdout."""
flags = []
if stream_json:
flags.append("--print --output-format stream-json")
elif quiet:
flags.append("--quiet")
else:
flags.append("--print")
if yolo: flags.append("--yolo")
if cont: flags.append("--continue")
flags.append(f'-w "{work_dir}"')
if extra: flags.append(extra)
cmd = f'kimi {" ".join(flags)} -p "{prompt}"'
print(f"\n$ {cmd}\n" + "-" * 60)
r = subprocess.run(cmd, shell=True, capture_output=True,
text=True, timeout=timeout)
out = r.stdout.strip()
print(out if out else r.stderr[-1500:])
return out

เรากำหนด Python wrapper เพื่อสั่งงาน Kimi CLI ผ่านโปรแกรมโดยไม่ต้องเปิดเทอร์มินัล โดยฟังก์ชันนี้จะประกอบแฟล็กต่างๆ แบบไดนามิก เช่น โหมดเงียบ (quiet), การสตรีม JSON, การอนุมัติเครื่องมืออัตโนมัติ (yolo) และการสานต่อเซสชันเดิม พร้อมดักจับผลลัพธ์เพื่อนำไปประมวลผลต่อในขั้นัดไป

การสร้างและวิเคราะห์ตัวอย่างโครงการจริง

print("=" * 70, "\nPART 4: Demo A — codebase Q&A\n", "=" * 70)
proj = pathlib.Path("/content/demo_project")
if proj.exists(): shutil.rmtree(proj)
(proj / "app").mkdir(parents=True)
(proj / "app" / "inventory.py").write_text(textwrap.dedent("""\
class Inventory:
def __init__(self):
self.items = {}
def add(self, name, qty):
self.items[name] = self.items.get(name, 0) + qty
def remove(self, name, qty):
# BUG: allows negative stock and KeyError on missing items
self.items[name] = self.items[name] - qty
def total(self):
return sum(self.items.values())
"""))
(proj / "app" / "main.py").write_text(textwrap.dedent("""\
from inventory import Inventory
inv = Inventory()
inv.add("widget", 10)
inv.remove("widget", 3)
print("Total stock:", inv.total())
"""))
(proj / "README.md").write_text("# Demo: a tiny inventory service\n")
kimi("Summarize this project's structure and purpose in under 120 words, "
"then list any bugs or design risks you can spot in inventory.py.",
work_dir=str(proj))

เราสร้างโครงการจัดการสินค้าคงคลังจำลองที่มีบั๊กแฝงอยู่ เพื่อทดสอบให้ Kimi ตรวจสอบโครงสร้างไฟล์และระบุความเสี่ยงด้านฟังก์ชันการทำงาน โดยส่งพรอมต์วิเคราะห์โครงการผ่านไดเรกทอรีที่กำหนดและรอรับผลการประเมินทางเทคนิคที่สรุปมาอย่างกระชับ

การแก้ไขโค้ดอัตโนมัติ การทดสอบ และการตรวจสอบความถูกต้อง

print("=" * 70, "\nPART 5: Demo B — Kimi fixes the bug & adds tests\n", "=" * 70)
kimi("Fix the bugs in app/inventory.py: remove() must raise KeyError->ValueError "
"for unknown items and never allow negative stock. Then create tests.py at "
"the project root using unittest covering add/remove/total and edge cases, "
"run it with 'python -m unittest tests -v', and iterate until all tests pass. "
"Finally print the test results.",
work_dir=str(proj), yolo=True, extra="--max-steps-per-turn 30")
print("\n--- Files after Kimi's edits ---")
for f in sorted(proj.rglob("*.py")):
print(f"\n### {f.relative_to(proj)} ###\n{f.read_text()}")
sh("python -m unittest tests -v", cwd=str(proj), check=False)

ในขั้นตอนนี้ เราอนุญาตให้ Kimi แก้ไขโค้ด แก้ไขตรรกะที่ผิดพลาด พร้อมทั้งสร้างและรัน unit tests โดยอัตโนมัติ เรากำหนดจำนวนก้าวสูงสุด (max steps) เพื่อให้เอเจนต์สามารถเรียนรู้จากข้อผิดพลาดและปรับปรุงโค้ดซ้ำๆ จนกว่าการทดสอบทั้งหมดจะผ่าน จากนั้นเราจะตรวจสอบไฟล์ผลลัพธ์และรันเทสซ้ำอีกครั้งเพื่อยืนยันความถูกต้อง

การสำรวจ Structured JSONL, เซสชัน และคุณสมบัติขั้นสูง

print("=" * 70, "\nPART 6: Demo C — machine-readable JSONL events\n", "=" * 70)
raw = kimi("In one sentence, what does app/main.py print when run?",
work_dir=str(proj), stream_json=True, quiet=False)
print("\nParsed event types:")
for line in raw.splitlines():
try:
evt = json.loads(line)
print(" •", evt.get("type", "?"), "-",
str(evt)[:100].replace("\n", " "))
except json.JSONDecodeError:
pass
print("=" * 70, "\nPART 7: Demo D — conversational memory\n", "=" * 70)
kimi("Remember this: our release codename is BLUE-FALCON.", work_dir=str(proj))
kimi("What is our release codename? Answer with just the codename.",
work_dir=str(proj), cont=True)
print("=" * 70, "\nPART 8: Power-user reference\n", "=" * 70)
print(textwrap.dedent("""
# Plan mode — การสำรวจแบบอ่านอย่างเดียว สร้างแผนการดำเนินงาน:
kimi --quiet --plan -w /content/demo_project -p "Plan adding SQLite persistence"
# เลือกโมเดลที่แตกต่างกันในขณะรัน (ต้องมีอยู่ใน config.toml):
kimi --quiet -m kimi-k2 -p "hello"
# Thinking mode (หากโมเดลรองรับ):
kimi --quiet --thinking -p "Prove sqrt(2) is irrational"
# Ralph loop — ส่งพรอมต์เดิมซ้ำๆ สำหรับงานใหญ่หนึ่งงาน
# จนกว่าเอเจนต์จะส่งเอาต์พุต <choice>STOP</choice> หรือครบกำหนดขีดจำกัด:
kimi --print --yolo --max-ralph-iterations 5 -w /content/demo_project \
-p "Keep improving test coverage; STOP when everything is covered."
# MCP tools — ให้ความสามารถเพิ่มเติมแก่ Kimi ผ่านไฟล์กำหนดค่า MCP:
# /content/mcp.json -> {"mcpServers": {"context7":
# {"url": "https://mcp.context7.com/mcp",
# "headers": {"CONTEXT7_API_KEY": "YOUR_KEY"}}}}
kimi --quiet --mcp-config-file /content/mcp.json -p "Use context7 to ..."
# ส่งออกเซสชัน (context.jsonl, wire.jsonl, state.json) สำหรับการดีบัก:
kimi export --yes
# Web UI (ต้องมี tunnel บน Colab เช่น cloudflared/ngrok เนื่องจาก
# เป็นการเชื่อมต่อภายในเครื่อง): kimi web --no-open --port 5494
"""))
print("Tutorial complete ✔ — Kimi CLI is installed, authenticated, and has "
"explored, fixed, tested, and remembered a real project headlessly.")

เราสาธิตการใช้งานระดับสูงด้วยการดึงข้อมูล JSONL เพื่ออ่านเหตุการณ์ที่เกิดขึ้นผ่านโปรแกรม และทดสอบหน่วยความจำระดับเซสชัน (multi-turn memory) ในการจดจำและดึงข้อมูลโค้ดเนมโครงการออกมาใช้งาน รวมถึงการแนะนำเทคนิคสำหรับผู้ใช้ระดับสูง เช่น การใช้ Ralph loops สำหรับงานที่ต้องทำซ้ำๆ การสลับโหมดโมเดล และการเชื่อมต่อผ่าน MCP tools เพื่อขยายความสามารถให้เอเจนต์ โดยสรุป เราได้สร้างเวิร์กโฟลว์ Kimi CLI ที่ครอบคลุมตั้งแต่วงจรการสร้างสภาพแวดล้อมไปจนถึงการแก้ไขและตรวจสอบโค้ดแบบไม่ต้องพึ่งพาการโต้ตอบจากมนุษย์ ระบบ wrapper ที่เราสร้างขึ้นช่วยให้สามารถนำไปประยุกต์ใช้กับระบบ CI, งานตรวจสอบความถูกต้องอัตโนมัติ หรือลูปการพัฒนาซอฟต์แวร์ที่ซับซ้อนยิ่งขึ้นได้ทันที

Source: MarkTechPost
ดูแลงานแปลและเรียบเรียงโดย NatapolK

ความคิดเห็น (0)

เข้าสู่ระบบเพื่อร่วมแสดงความเห็น

สมัครสมาชิก

มาเป็นคนแรกที่แสดงความเห็นกันเลยโบร