abrakjamson commited on
Commit
b13abdb
·
1 Parent(s): d37bc24

adding session support to the client

Browse files
__pycache__/task_management.cpython-310.pyc CHANGED
Binary files a/__pycache__/task_management.cpython-310.pyc and b/__pycache__/task_management.cpython-310.pyc differ
 
app.py CHANGED
@@ -1,5 +1,14 @@
1
  import gradio as gr
2
- from task_management import get_task_status, a2a_respond
 
 
 
 
 
 
 
 
 
3
  from server_management import (
4
  connect_to_server,
5
  disconnect_from_server,
@@ -74,15 +83,24 @@ def fetch_tasks() -> list:
74
  statuses.append(f"{tid}: {status.get('result', {}).get('status', 'unknown')}")
75
  return statuses
76
 
 
 
 
 
 
 
 
 
 
77
  def respond(message: str, history: list) -> tuple[str, list]:
78
  server_url = get_selected_server()
79
- return a2a_respond(message, history, server_url)
80
 
81
  def create_chat_interface():
82
  with gr.Blocks() as demo:
83
  with gr.Row():
84
  with gr.Column(scale=1):
85
- server_url_input = gr.Textbox(label="Server URL", placeholder="Enter server URL")
86
  add_server_btn = gr.Button("Add Server")
87
  servers_list = gr.Dropdown(
88
  label="Available Servers",
@@ -92,8 +110,13 @@ def create_chat_interface():
92
  allow_custom_value=True
93
  )
94
  remove_server_btn = gr.Button("Remove Selected Server")
95
- tasks_list = gr.List(label="Executing Tasks")
96
- refresh_tasks_btn = gr.Button("Refresh Tasks")
 
 
 
 
 
97
 
98
  add_server_btn.click(
99
  add_server_and_select,
@@ -119,12 +142,14 @@ def create_chat_interface():
119
  outputs=servers_list,
120
  )
121
 
122
- refresh_tasks_btn.click(
123
- fetch_tasks,
124
  inputs=None,
125
- outputs=tasks_list,
126
  )
127
 
 
 
128
  with gr.Column(scale=2):
129
  chatbot = gr.Chatbot(label="Chat", type="messages")
130
  chat_input = gr.Textbox(label="Message", placeholder="Type a message...")
@@ -136,6 +161,13 @@ def create_chat_interface():
136
  outputs=[chat_input, chatbot],
137
  queue=False,
138
  )
 
 
 
 
 
 
 
139
  return demo
140
 
141
  if __name__ == "__main__":
 
1
  import gradio as gr
2
+ from task_management import (
3
+ get_task_status,
4
+ get_task_history,
5
+ send_task,
6
+ cancel_task,
7
+ new_session,
8
+ get_current_session_id,
9
+ list_sessions,
10
+ change_session
11
+ )
12
  from server_management import (
13
  connect_to_server,
14
  disconnect_from_server,
 
83
  statuses.append(f"{tid}: {status.get('result', {}).get('status', 'unknown')}")
84
  return statuses
85
 
86
+ def create_session_and_select() -> list:
87
+ new_session_id = new_session()
88
+ sessions = list_sessions()
89
+ return gr.Dropdown(list(sessions), value=new_session_id)
90
+
91
+ def load_session_history(session_id: str) -> list:
92
+ history = get_task_history(session_id)
93
+ return history
94
+
95
  def respond(message: str, history: list) -> tuple[str, list]:
96
  server_url = get_selected_server()
97
+ return "", send_task(server_url, message)
98
 
99
  def create_chat_interface():
100
  with gr.Blocks() as demo:
101
  with gr.Row():
102
  with gr.Column(scale=1):
103
+ server_url_input = gr.Textbox(label="Server URL", value="https://agent-too-agent.azurewebsites.net/api/")
104
  add_server_btn = gr.Button("Add Server")
105
  servers_list = gr.Dropdown(
106
  label="Available Servers",
 
110
  allow_custom_value=True
111
  )
112
  remove_server_btn = gr.Button("Remove Selected Server")
113
+ sessions_list = gr.Dropdown(
114
+ label="Previous Sessions",
115
+ choices=[],
116
+ value=None,
117
+ interactive=True,
118
+ allow_custom_value=True)
119
+ new_session_btn = gr.Button("New Session")
120
 
121
  add_server_btn.click(
122
  add_server_and_select,
 
142
  outputs=servers_list,
143
  )
144
 
145
+ new_session_btn.click(
146
+ create_session_and_select,
147
  inputs=None,
148
+ outputs=sessions_list,
149
  )
150
 
151
+
152
+
153
  with gr.Column(scale=2):
154
  chatbot = gr.Chatbot(label="Chat", type="messages")
155
  chat_input = gr.Textbox(label="Message", placeholder="Type a message...")
 
161
  outputs=[chat_input, chatbot],
162
  queue=False,
163
  )
164
+
165
+ sessions_list.change(
166
+ load_session_history,
167
+ inputs=sessions_list,
168
+ outputs=chatbot,
169
+ )
170
+
171
  return demo
172
 
173
  if __name__ == "__main__":
task_management.py CHANGED
@@ -1,28 +1,91 @@
1
  import uuid
2
  import requests
3
 
4
- def send_task(server_url, task_id, thread, content):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  payload = {
6
  "jsonrpc": "2.0",
7
  "method": "tasks/send",
8
  "params": {
9
- "sessionId": thread,
10
- "message": content
 
11
  },
12
  "id": task_id
13
  }
14
- #remove trailing slash if present
15
- if server_url.endswith("/"):
16
- server_url = server_url[:-1]
17
- json_endpoint = f"{server_url}/jsonrpc"
18
  response = requests.post(json_endpoint, json=payload)
19
  response.raise_for_status()
20
- return response.json()
21
 
22
- def get_task_status(server_url, task_id):
23
- import requests
24
- import json
 
25
 
 
 
 
 
 
 
26
  payload = {
27
  "jsonrpc": "2.0",
28
  "method": "tasks/get",
@@ -36,9 +99,6 @@ def get_task_status(server_url, task_id):
36
  return response.json()
37
 
38
  def cancel_task(server_url, task_id):
39
- import requests
40
- import json
41
-
42
  payload = {
43
  "jsonrpc": "2.0",
44
  "method": "tasks/cancel",
@@ -50,34 +110,3 @@ def cancel_task(server_url, task_id):
50
 
51
  response = requests.post(server_url, json=payload)
52
  return response.json()
53
-
54
- def a2a_respond(user_message, history, server_url):
55
- """
56
- Sends a plain JSON POST to the server_url with user_input and session_id.
57
- Only adds the 'content' field from the response to the message history.
58
- """
59
- if not server_url:
60
- history = history or []
61
- history.append({"role": "assistant", "content": "No server selected."})
62
- return "", history
63
-
64
- session_id = str(uuid.uuid4())
65
-
66
- history = history or []
67
- history.append({"role": "user", "content": user_message})
68
-
69
- try:
70
- # Call send_task with the server_url and session_id
71
- response = send_task(server_url, session_id, "thread", user_message)
72
- if response.get("error"):
73
- error_message = response["error"].get("message", "Unknown error")
74
- history.append({"role": "assistant", "content": f"Error: {error_message}"})
75
- return "", history
76
- # get the result.content from the json
77
- agent_reply = response.get("result", {}).get("content", "")
78
- if agent_reply:
79
- history.append({"role": "assistant", "content": agent_reply})
80
- except Exception as e:
81
- history.append({"role": "assistant", "content": f"Error: {e}"})
82
-
83
- return "", history
 
1
  import uuid
2
  import requests
3
 
4
+ # Data class of a session with ID and task history
5
+ class Session:
6
+ def __init__(self, session_id):
7
+ self.session_id = session_id
8
+ #tasks are a list of tuples with role and content
9
+ self.task_history = []
10
+
11
+ def add_task(self, task):
12
+ self.task_history.append(task)
13
+
14
+ def get_history(self):
15
+ return self.task_history
16
+
17
+ # Global session tracking
18
+ sessions = {}
19
+ current_session_id = None
20
+
21
+ def new_session():
22
+ """ Creates a new session, sets it as current, and returns the session ID. """
23
+ global current_session_id
24
+ session_id = str(uuid.uuid4())
25
+ # add a new Session object to the sessions dictionary
26
+ sessions[session_id] = Session(session_id)
27
+ current_session_id = session_id
28
+ return session_id
29
+
30
+ def get_current_session_id():
31
+ """ Returns the current active session ID, or None if none exists. """
32
+ return current_session_id
33
+
34
+ def list_sessions():
35
+ """ Returns a list of all session IDs being tracked. """
36
+ return list(sessions.keys())
37
+
38
+ def change_session(session_id):
39
+ """ Changes the current session to the specified session ID. """
40
+ global current_session_id
41
+ if session_id in sessions:
42
+ current_session_id = session_id
43
+ else:
44
+ raise ValueError(f"Session ID {session_id} not found.")
45
+
46
+ def get_task_history(session_id):
47
+ """ Retrieves the task history for a given session ID."""
48
+ return sessions[session_id].get_history()
49
+
50
+ def send_task(server_url, content):
51
+ """
52
+ Sends a message to the A2A server using the current session ID.
53
+ If no session exists, a new one is created automatically.
54
+ """
55
+ global current_session_id
56
+ if not current_session_id:
57
+ new_session()
58
+
59
+ task_id = str(uuid.uuid4())
60
+ sessions[current_session_id].add_task({"role": "user", "content": content})
61
+
62
  payload = {
63
  "jsonrpc": "2.0",
64
  "method": "tasks/send",
65
  "params": {
66
+ "sessionId": current_session_id,
67
+ "message": content,
68
+ "historyLength": 5
69
  },
70
  "id": task_id
71
  }
72
+
73
+ json_endpoint = f"{server_url.rstrip('/')}/jsonrpc"
 
 
74
  response = requests.post(json_endpoint, json=payload)
75
  response.raise_for_status()
76
+ result = response.json()
77
 
78
+ if "error" in result:
79
+ error_message = result["error"].get("message", "Unknown error")
80
+ sessions[current_session_id].append({"role": "assistant", "content": f"Error: {error_message}"})
81
+ return f"Error: {error_message}"
82
 
83
+ agent_reply = result.get("result", {}).get("content", "")
84
+ if agent_reply:
85
+ sessions[current_session_id].add_task({"role": "assistant", "content": agent_reply})
86
+ return sessions[current_session_id].get_history()
87
+
88
+ def get_task_status(server_url, task_id):
89
  payload = {
90
  "jsonrpc": "2.0",
91
  "method": "tasks/get",
 
99
  return response.json()
100
 
101
  def cancel_task(server_url, task_id):
 
 
 
102
  payload = {
103
  "jsonrpc": "2.0",
104
  "method": "tasks/cancel",
 
110
 
111
  response = requests.post(server_url, json=payload)
112
  return response.json()