Skip to content

Commit adae65d

Browse files
committed
Improve issue tracker example
1 parent 2965da0 commit adae65d

File tree

1 file changed

+32
-23
lines changed

1 file changed

+32
-23
lines changed
Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Sequence
1+
import json
22

33
from django.contrib.auth.models import User
44

@@ -11,9 +11,9 @@ class IssueTrackerAIAssistant(AIAssistant):
1111
name = "Issue Tracker Assistant"
1212
instructions = (
1313
"You are a issue tracker assistant. "
14-
"Help the user manage issues using the provided tools. "
15-
"Issue IDs are unique and auto-incremented, they are represented as #<id>. "
16-
"Make sure to include it in your responses, "
14+
"Interact with the issue DB by using the provided tools. "
15+
"Always refer to issue IDs as #<id>. "
16+
"Make sure to include issue IDs in your responses, "
1717
"to know which issue you or the user are referring to. "
1818
)
1919
model = "gpt-4o"
@@ -24,26 +24,34 @@ def get_current_assignee_email(self) -> str:
2424
"""Get the current user's email"""
2525
return self._user.email
2626

27-
def _format_issues(self, issues: Sequence[Issue]) -> str:
28-
if not issues:
29-
return "No issues found"
30-
return "\n\n".join(
31-
[f"- {issue.title} #{issue.id}\n{issue.description}" for issue in issues]
32-
)
33-
3427
@method_tool
3528
def list_issues(self) -> str:
3629
"""List all issues"""
37-
return self._format_issues(list(Issue.objects.all()))
30+
return json.dumps(
31+
{
32+
"issues": list(
33+
Issue.objects.values("id", "title", "description", "assignee__email")
34+
),
35+
}
36+
)
3837

3938
@method_tool
40-
def list_user_assigned_issues(self, assignee_email: str) -> str:
41-
"""List the issues assigned to the provided user"""
42-
return self._format_issues(list(Issue.objects.filter(assignee__email=assignee_email)))
39+
def list_assigned_issues(self, assignee_email: str) -> str:
40+
"""List the issues assigned to the user with the email from `assignee_email` param."""
41+
return json.dumps(
42+
{
43+
"issues": list(
44+
Issue.objects.filter(
45+
assignee__email=assignee_email,
46+
).values("id", "title", "description", "assignee__email")
47+
),
48+
}
49+
)
4350

4451
@method_tool
45-
def assign_user_to_issue(self, issue_id: int, assignee_email: str = "") -> str:
46-
"""Assign a user to an issue. When assignee_email is empty, the issue assignment is removed."""
52+
def assign_user_to_issue(self, issue_id: int, assignee_email: str) -> str:
53+
"""Assign a user to an issue. Set the `assignee_email` param to an user's email.
54+
Or pass an empty string to remove the issue assignment."""
4755
try:
4856
issue = Issue.objects.get(id=issue_id)
4957
if assignee_email:
@@ -56,11 +64,12 @@ def assign_user_to_issue(self, issue_id: int, assignee_email: str = "") -> str:
5664
return f"ERROR: User {assignee_email} does not exist"
5765
issue.assignee = assignee
5866
issue.save()
59-
return f"Assigned {assignee_email} to issue {issue.title} #{issue.id}"
67+
return f"Assigned {assignee_email} to issue #{issue.id} - {issue.title}"
6068

6169
@method_tool
6270
def create_issue(self, title: str, description: str = "", assignee_email: str = "") -> str:
63-
"""Create a new issue. Title is required. Description is optional. Assignee is optional."""
71+
"""Create a new issue.
72+
Assign it to a user by passing the `assignee_email` param."""
6473
if assignee_email:
6574
try:
6675
assignee = User.objects.get(email=assignee_email)
@@ -69,19 +78,19 @@ def create_issue(self, title: str, description: str = "", assignee_email: str =
6978
else:
7079
assignee = None
7180
issue = Issue.objects.create(title=title, description=description, assignee=assignee)
72-
return f"Created issue {issue.title} #{issue.id}"
81+
return f"Created issue #{issue.id} - {issue.title}"
7382

7483
@method_tool
7584
def update_issue(self, issue_id: int, title: str, description: str = "") -> str:
76-
"""Update an issue"""
85+
"""Update an issue."""
7786
try:
7887
issue = Issue.objects.get(id=issue_id)
7988
except Issue.DoesNotExist:
8089
return f"ERROR: Issue {issue_id} does not exist"
8190
issue.title = title
8291
issue.description = description
8392
issue.save()
84-
return f"Updated issue {issue.title} #{issue.id}"
93+
return f"Updated issue #{issue_id} - {issue.title}"
8594

8695
@method_tool
8796
def delete_issue(self, issue_id: int) -> str:
@@ -91,4 +100,4 @@ def delete_issue(self, issue_id: int) -> str:
91100
except Issue.DoesNotExist:
92101
return f"ERROR: Issue {issue_id} does not exist"
93102
issue.delete()
94-
return f"Deleted issue {issue.title} #{issue.id}"
103+
return f"Deleted issue #{issue_id} - {issue.title}"

0 commit comments

Comments
 (0)