การแสดงรายการและจัดการประเด็น
ดึงข้อมูล สร้าง ติดป้ายกำกับ และปิดประเด็นด้วยโปรแกรม
การแสดงรายการและจัดการประเด็น เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
การรับปัญหาจากคลังโค้ด
ใช้ repo.get_issues() เพื่อแสดงรายการปัญหา โดยค่าเริ่มต้นจะแสดงปัญหาที่เปิดอยู่ ส่ง state='closed' หรือ state='all' เพื่อเลือกสถานะอื่น ผลลัพธ์คือ PaginatedList ให้วนซ้ำเพื่อประมวลผลปัญหาแต่ละรายการ
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Open issues (default)
open_issues = repo.get_issues(state='open')
print(f'Open issues: {open_issues.totalCount}')
# Process first 20
for issue in open_issues[:20]:
print(f'#{issue.number}: {issue.title}')
print(f' Labels: {[l.name for l in issue.labels]}')
print(f' Assignee: {issue.assignee.login if issue.assignee else None}')
print(f' Created: {issue.created_at.date()}')การกรองปัญหา
get_issues() รองรับพารามิเตอร์ตัวกรองหลายรายการ ได้แก่ state labels assignee milestone since และ sort ผสมตัวกรองเหล่านี้เพื่อรับเฉพาะปัญหาที่เอเจนต์ของคุณต้องประมวลผล
import datetime
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Issues with the 'bug' label, sorted by newest
bug_issues = repo.get_issues(
state='open',
labels=['bug'],
sort='created',
direction='desc'
)
# Issues updated in the last 7 days
cutoff = datetime.datetime.now() - datetime.timedelta(days=7)
recent_issues = repo.get_issues(
state='open',
since=cutoff
)
# Issues assigned to a specific user
my_issues = repo.get_issues(
state='open',
assignee='username'
)
print(f'Bug issues: {bug_issues.totalCount}')
print(f'Recent issues: {recent_issues.totalCount}')การเข้าถึงคุณสมบัติของปัญหา
ออบเจ็กต์ Issue แต่ละรายการมีคุณสมบัติมากมาย ได้แก่ หมายเลข ชื่อเรื่อง เนื้อหา ป้ายกำกับ ผู้รับผิดชอบ จุดหมาย สถานะ จำนวนความคิดเห็น และเวลาประทับ เข้าถึงคุณสมบัติเหล่านี้เป็นแอตทริบิวต์ของ Python เนื้อหาเป็นข้อความ Markdown ดิบ
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42) # get by number
print(f'Number: #{issue.number}')
print(f'Title: {issue.title}')
print(f'State: {issue.state}') # 'open' or 'closed'
print(f'Author: {issue.user.login}')
print(f'Body length: {len(issue.body or "")}')
print(f'Labels: {[l.name for l in issue.labels]}')
print(f'Assignees: {[a.login for a in issue.assignees]}')
print(f'Milestone: {issue.milestone.title if issue.milestone else None}')
print(f'Comments: {issue.comments}')
print(f'Reactions: {issue.get_reactions().totalCount}')
print(f'URL: {issue.html_url}')การสร้างปัญหาใหม่
ใช้ repo.create_issue() เพื่อสร้างปัญหาใหม่ด้วยโปรแกรม ฟิลด์เดียวที่จำเป็นคือ title เพิ่ม body (Markdown) labels (ต้องมีอยู่แล้ว) assignees (ชื่อผู้ใช้ GitHub) และ milestone (ออบเจ็กต์จุดหมาย)
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Create a bug report
bug_body = (
'## Bug Report\n\n'
'**Observed:** Login fails with 500 error\n'
'**Expected:** Successful login\n'
'**Steps to reproduce:**\n'
'1. Navigate to /login\n'
'2. Enter valid credentials\n'
'3. Click Submit\n\n'
'**Environment:** Production, v2.3.1'
)
issue = repo.create_issue(
title='Login endpoint returns 500 for valid credentials',
body=bug_body,
labels=['bug', 'priority:high'],
assignees=['alice'], # must be repo collaborators
)
print(f'Created issue #{issue.number}: {issue.html_url}')การแก้ไข (อัปเดต) ปัญหา
ใช้ issue.edit() เพื่ออัปเดตคุณสมบัติใด ๆ ของปัญหาที่มีอยู่ คุณสามารถเปลี่ยนชื่อเรื่อง เนื้อหา สถานะ ป้ายกำกับ ผู้รับผิดชอบ หรือจุดหมายได้ในการเรียกครั้งเดียว ส่งเฉพาะฟิลด์ที่ต้องการเปลี่ยนแปลง ฟิลด์อื่นจะยังคงเดิม
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42)
# Update title and add new labels
issue.edit(
title='[URGENT] Login endpoint returns 500',
labels=['bug', 'priority:critical', 'needs-hotfix']
)
# Close the issue
issue.edit(state='closed')
print(f'Issue #{issue.number} closed')
# Reopen it
issue.edit(state='open')
# Assign to a user
from github import NamedUser
issue.edit(assignees=['bob', 'carol'])
# Update the body
issue.edit(body=issue.body + '\n\n**Update:** Hotfix deployed to production.')การจัดการป้ายกำกับ
ป้ายกำกับช่วยจัดระเบียบปัญหา รับป้ายกำกับทั้งหมดของคลังโค้ดด้วย repo.get_labels() สร้างป้ายกำกับใหม่ด้วย repo.create_label() และเพิ่มหรือนำป้ายกำกับออกจากปัญหาด้วย issue.add_to_labels() และ issue.remove_from_labels()
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# List all labels
for label in repo.get_labels():
print(f'{label.name}: #{label.color}')
# Create a new label if it doesn't exist
existing_names = {l.name for l in repo.get_labels()}
if 'agent-reviewed' not in existing_names:
repo.create_label(
name='agent-reviewed',
color='0075ca', # hex without #
description='Reviewed by AI agent'
)
print('Created label: agent-reviewed')
# Add a label to an issue
issue = repo.get_issue(42)
issue.add_to_labels('agent-reviewed')
# Remove a label
issue.remove_from_labels('needs-triage')การอ่านความคิดเห็นของปัญหา
ใช้ issue.get_comments() เพื่อดึงความคิดเห็นทั้งหมดของปัญหา ความคิดเห็นแต่ละรายการมีผู้เขียน (user.login) ข้อความเนื้อหา และเวลาประทับ วนซ้ำตามลำดับเพื่อดูประวัติการสนทนา
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42)
# Get all comments
comments = list(issue.get_comments())
print(f'Comments on #{issue.number}: {len(comments)}')
for comment in comments:
print(f'\n{comment.user.login} ({comment.created_at.date()}):')
print(comment.body[:200])
# Get only recent comments
for comment in issue.get_comments(since=cutoff):
print(f'Recent: {comment.user.login}: {comment.body[:100]}')การเพิ่มความคิดเห็นให้ปัญหา
ใช้ issue.create_comment(body) เพื่อโพสต์ความคิดเห็น เนื้อหารองรับ Markdown ความคิดเห็นจากเอเจนต์ควรระบุอย่างชัดเจนว่าเป็นแบบอัตโนมัติ โดยใส่ส่วนหัว "🤖 Automated analysis" เพื่อกำหนดความคาดหวัง
from github import Github
import os
import datetime
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42)
# Add an agent comment with clear attribution
agent_comment = (
'**Automated Analysis** (via code-review agent)\n\n'
'---\n'
f'**Issue classified as:** Critical Bug\n'
f'**Suggested priority:** P0\n'
f'**Suggested assignee:** @backend-team\n\n'
'**Analysis:**\n'
'The login 500 error matches pattern #12 in our known issues database.\n'
'Likely cause: database connection pool exhaustion during peak traffic.\n\n'
'**Suggested fix:** Increase pool size in `db_config.py` or add circuit breaker.\n\n'
f'_Generated at {datetime.datetime.now().strftime("%Y-%m-%d %H:%M UTC")}_'
)
comment = issue.create_comment(agent_comment)
print(f'Comment added: {comment.html_url}')เอเจนต์คัดแยกปัญหาจำนวนมาก
เอเจนต์คัดแยกจะประมวลผลปัญหาใหม่โดยอัตโนมัติ อ่านชื่อเรื่องและเนื้อหา จัดประเภทผ่าน LLM เพิ่มป้ายกำกับที่เหมาะสม มอบหมายให้ทีมที่ถูกต้อง และโพสต์ความคิดเห็นเริ่มต้น วิธีนี้ช่วยประหยัดเวลาหลายชั่วโมงที่วิศวกรต้องใช้คัดแยกด้วยตนเอง
import anthropic
import json
import os
from github import Github
g = Github(token=os.environ['GITHUB_TOKEN'])
client = anthropic.Anthropic(api_key=os.environ['ANTHROPIC_API_KEY'])
def triage_issue(repo, issue):
prompt = (
'Classify this GitHub issue. Return JSON only:\n'
'{"type": "bug|feature|question|docs", '
'"priority": "critical|high|medium|low", '
'"team": "backend|frontend|infra|ml", '
'"summary": "one sentence"}\n\n'
f'Title: {issue.title}\n'
f'Body: {(issue.body or "")[:1000]}'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
messages=[{'role': 'user', 'content': prompt}]
)
try:
return json.loads(response.content[0].text)
except json.JSONDecodeError:
return {'type': 'question', 'priority': 'medium', 'team': 'backend', 'summary': 'Needs manual review'}การนำผลการคัดแยกไปใช้กับปัญหา
นำการจัดประเภทจากการคัดแยกด้วย LLM ไปใช้กับปัญหา โดยกำหนดป้ายกำกับตามประเภทและลำดับความสำคัญ มอบหมายให้หัวหน้าทีมที่เหมาะสม และโพสต์ความคิดเห็นเกี่ยวกับการคัดแยก ติดตามปัญหาที่คัดแยกแล้วด้วยป้ายกำกับแบบกำหนดเอง เพื่อป้องกันการประมวลผลซ้ำ
TEAM_ASSIGNEES = {
'backend': 'alice',
'frontend': 'bob',
'infra': 'carol',
'ml': 'dave'
}
def apply_triage(repo, issue, classification):
issue_type = classification.get('type', 'question')
priority = classification.get('priority', 'medium')
team = classification.get('team', 'backend')
summary = classification.get('summary', '')
# Apply labels
labels_to_add = [f'type:{issue_type}', f'priority:{priority}', 'agent-triaged']
issue.edit(labels=labels_to_add)
# Assign to team lead
assignee = TEAM_ASSIGNEES.get(team, 'alice')
issue.edit(assignees=[assignee])
# Post triage comment
comment = (
f'**Automated Triage**\n\n'
f'Type: `{issue_type}` | Priority: `{priority}` | Team: `{team}`\n'
f'Summary: {summary}\n\n'
f'Assigned to @{assignee} for follow-up.'
)
issue.create_comment(comment)
print(f'Triaged #{issue.number}: {issue_type}/{priority} -> {assignee}')
# --- demo: minimal stand-in for a GitHub Issue object ---
class _FakeIssue:
number = 501
def edit(self, **kwargs):
print(f'[github] issue.edit({kwargs})')
def create_comment(self, body):
print(f'[github] comment posted:\n{body}')
classification = {'type': 'bug', 'priority': 'high', 'team': 'backend',
'summary': 'Login fails with 500 when email has a plus sign'}
apply_triage('coddy-agents', _FakeIssue(), classification)
การปิดปัญหาที่ไม่มีการใช้งานโดยอัตโนมัติ
การจัดการปัญหาที่ไม่มีการใช้งานเป็นงานอัตโนมัติที่พบบ่อย ได้แก่ ค้นหาปัญหาที่เปิดอยู่และไม่มีความเคลื่อนไหวเป็นเวลา N วัน โพสต์ความคิดเห็นแจ้งเตือน และปิดปัญหาหากไม่มีการตอบกลับภายในช่วงผ่อนผัน ใช้ issue.updated_at เพื่อตรวจสอบกิจกรรม และใช้ issue.edit(state='closed') เพื่อปิดปัญหา
import datetime
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
STALE_DAYS = 90
GRACE_DAYS = 14
now = datetime.datetime.utcnow()
stale_cutoff = now - datetime.timedelta(days=STALE_DAYS)
for issue in repo.get_issues(state='open'):
last_updated = issue.updated_at.replace(tzinfo=None)
if last_updated > stale_cutoff:
continue
# Check if stale warning already posted
comments = list(issue.get_comments())
stale_warned = any('stale' in c.body.lower() for c in comments)
if not stale_warned:
issue.create_comment(
'This issue has been inactive for 90 days. '
'It will be closed in 14 days unless there is activity.'
)
issue.add_to_labels('stale')
print(f'Stale warning: #{issue.number}')ตรวจสอบความเข้าใจอย่างรวดเร็ว: issue.edit() เทียบกับ create_issue()
ทดสอบความเข้าใจเกี่ยวกับการจัดการปัญหาบน GitHub
สรุปการจัดการปัญหา
ขณะนี้เอเจนต์ของคุณสามารถจัดการปัญหาบน GitHub ได้ตั้งแต่ต้นจนจบ:
- repo.get_issues(state, labels, assignee, since) — กรองและแสดงรายการปัญหา
- repo.get_issue(number) — รับปัญหาเฉพาะรายการตามหมายเลข
- repo.create_issue(title, body, labels, assignees) — เปิดปัญหาใหม่
- issue.edit(state, title, labels, assignees) — อัปเดตฟิลด์ใด ๆ
- issue.create_comment(body) — เพิ่มความคิดเห็น Markdown
- repo.create_label() / issue.add_to_labels() — จัดการป้ายกำกับ
- ระบุความคิดเห็นจากเอเจนต์อย่างชัดเจนเสมอ เพื่อแยกออกจากกิจกรรมของมนุษย์
- ใช้ป้ายกำกับ
'agent-triaged'เพื่อป้องกันการประมวลผลซ้ำ
คำถามที่พบบ่อย
บทเรียน “การแสดงรายการและจัดการประเด็น” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแสดงรายการและจัดการประเด็น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแสดงรายการและจัดการประเด็น”
ดึงข้อมูล สร้าง ติดป้ายกำกับ และปิดประเด็นด้วยโปรแกรม คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การแสดงรายการและจัดการประเด็น” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวม GitHub REST API
- การแสดงรายการและจัดการประเด็น
- ความคิดเห็นตรวจสอบ PR อัตโนมัติ
- ประวัติการคอมมิตและการวิเคราะห์ส่วนต่าง