Improve data agent workspace UI

This commit is contained in:
武阳
2026-05-06 17:19:13 +08:00
parent e6e9968ede
commit d9a8110b7c
17 changed files with 910 additions and 201 deletions
+86 -1
View File
@@ -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))