1
- from typing import Sequence
1
+ import json
2
2
3
3
from django .contrib .auth .models import User
4
4
@@ -11,9 +11,9 @@ class IssueTrackerAIAssistant(AIAssistant):
11
11
name = "Issue Tracker Assistant"
12
12
instructions = (
13
13
"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, "
17
17
"to know which issue you or the user are referring to. "
18
18
)
19
19
model = "gpt-4o"
@@ -24,26 +24,34 @@ def get_current_assignee_email(self) -> str:
24
24
"""Get the current user's email"""
25
25
return self ._user .email
26
26
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
-
34
27
@method_tool
35
28
def list_issues (self ) -> str :
36
29
"""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
+ )
38
37
39
38
@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
+ )
43
50
44
51
@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."""
47
55
try :
48
56
issue = Issue .objects .get (id = issue_id )
49
57
if assignee_email :
@@ -56,11 +64,12 @@ def assign_user_to_issue(self, issue_id: int, assignee_email: str = "") -> str:
56
64
return f"ERROR: User { assignee_email } does not exist"
57
65
issue .assignee = assignee
58
66
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 } "
60
68
61
69
@method_tool
62
70
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."""
64
73
if assignee_email :
65
74
try :
66
75
assignee = User .objects .get (email = assignee_email )
@@ -69,19 +78,19 @@ def create_issue(self, title: str, description: str = "", assignee_email: str =
69
78
else :
70
79
assignee = None
71
80
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 } "
73
82
74
83
@method_tool
75
84
def update_issue (self , issue_id : int , title : str , description : str = "" ) -> str :
76
- """Update an issue"""
85
+ """Update an issue. """
77
86
try :
78
87
issue = Issue .objects .get (id = issue_id )
79
88
except Issue .DoesNotExist :
80
89
return f"ERROR: Issue { issue_id } does not exist"
81
90
issue .title = title
82
91
issue .description = description
83
92
issue .save ()
84
- return f"Updated issue { issue . title } # { issue .id } "
93
+ return f"Updated issue # { issue_id } - { issue .title } "
85
94
86
95
@method_tool
87
96
def delete_issue (self , issue_id : int ) -> str :
@@ -91,4 +100,4 @@ def delete_issue(self, issue_id: int) -> str:
91
100
except Issue .DoesNotExist :
92
101
return f"ERROR: Issue { issue_id } does not exist"
93
102
issue .delete ()
94
- return f"Deleted issue { issue . title } # { issue .id } "
103
+ return f"Deleted issue # { issue_id } - { issue .title } "
0 commit comments