Improve data agent workspace UI
This commit is contained in:
@@ -157,6 +157,40 @@ class GuiServerTests(unittest.TestCase):
|
||||
loaded = load_agent_session('thread-1', directory=root / 'sessions')
|
||||
self.assertEqual(loaded.session_id, 'thread-1')
|
||||
|
||||
def test_context_budget_reports_stored_session_prompt_size(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
root = Path(d)
|
||||
client, _ = _build_client(root)
|
||||
session_root = root / 'accounts' / 'alice' / 'sessions'
|
||||
stored = StoredAgentSession(
|
||||
session_id='thread-1',
|
||||
model_config={'model': 'test-model'},
|
||||
runtime_config={'cwd': str(root)},
|
||||
system_prompt_parts=('system prompt',),
|
||||
user_context={},
|
||||
system_context={},
|
||||
messages=({'role': 'user', 'content': 'hello'},),
|
||||
turns=1,
|
||||
tool_calls=0,
|
||||
usage={},
|
||||
total_cost_usd=0.0,
|
||||
file_history=(),
|
||||
budget_state={},
|
||||
plugin_state={},
|
||||
)
|
||||
save_agent_session(stored, directory=session_root)
|
||||
|
||||
response = client.get(
|
||||
'/api/context-budget',
|
||||
params={'account_id': 'alice', 'session_id': 'thread-1'},
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
payload = response.json()
|
||||
self.assertEqual(payload['model'], 'test-model')
|
||||
self.assertEqual(payload['context_window_tokens'], 128000)
|
||||
self.assertGreater(payload['projected_input_tokens'], 0)
|
||||
self.assertGreater(payload['soft_input_limit_tokens'], 0)
|
||||
|
||||
def test_chat_rejects_blank_prompt(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
client, _ = _build_client(Path(d))
|
||||
@@ -220,6 +254,7 @@ class GuiServerTests(unittest.TestCase):
|
||||
'session_id': 'same-id',
|
||||
'turns': 2,
|
||||
'tool_calls': 1,
|
||||
'title': '自动生成标题',
|
||||
'messages': [{'role': 'user', 'content': 'nested'}],
|
||||
}
|
||||
(session_root / 'same-id.json').write_text(
|
||||
@@ -237,7 +272,7 @@ class GuiServerTests(unittest.TestCase):
|
||||
payload = response.json()
|
||||
self.assertEqual(len(payload), 1)
|
||||
self.assertEqual(payload[0]['session_id'], 'same-id')
|
||||
self.assertEqual(payload[0]['preview'], 'nested')
|
||||
self.assertEqual(payload[0]['preview'], '自动生成标题')
|
||||
|
||||
def test_session_detail_404_when_missing(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
@@ -245,6 +280,56 @@ class GuiServerTests(unittest.TestCase):
|
||||
response = client.get('/api/sessions/nope')
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
def test_delete_session_removes_nested_and_legacy_files(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
root = Path(d)
|
||||
client, _ = _build_client(root)
|
||||
session_root = root / 'accounts' / 'alice' / 'sessions'
|
||||
nested = session_root / 'same-id'
|
||||
nested.mkdir(parents=True)
|
||||
(nested / 'session.json').write_text('{}', encoding='utf-8')
|
||||
legacy = session_root / 'same-id.json'
|
||||
legacy.write_text('{}', encoding='utf-8')
|
||||
|
||||
response = client.delete(
|
||||
'/api/sessions/same-id',
|
||||
params={'account_id': 'alice'},
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertTrue(response.json()['deleted'])
|
||||
self.assertFalse(nested.exists())
|
||||
self.assertFalse(legacy.exists())
|
||||
|
||||
missing = client.delete(
|
||||
'/api/sessions/same-id',
|
||||
params={'account_id': 'alice'},
|
||||
)
|
||||
self.assertEqual(missing.status_code, 404)
|
||||
|
||||
def test_update_session_title(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
root = Path(d)
|
||||
client, _ = _build_client(root)
|
||||
session_root = root / 'accounts' / 'alice' / 'sessions'
|
||||
nested = session_root / 'same-id'
|
||||
nested.mkdir(parents=True)
|
||||
session_file = nested / 'session.json'
|
||||
session_file.write_text(
|
||||
json.dumps({'session_id': 'same-id', 'messages': []}),
|
||||
encoding='utf-8',
|
||||
)
|
||||
|
||||
response = client.patch(
|
||||
'/api/sessions/same-id',
|
||||
params={'account_id': 'alice'},
|
||||
json={'title': ' 手动标题 '},
|
||||
)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.json()['title'], '手动标题')
|
||||
data = json.loads(session_file.read_text(encoding='utf-8'))
|
||||
self.assertEqual(data['title'], '手动标题')
|
||||
self.assertEqual(data['title_source'], 'manual')
|
||||
|
||||
def test_clear_runtime_state(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
client, _ = _build_client(Path(d))
|
||||
|
||||
Reference in New Issue
Block a user