Add teacher microphone and per-question model selection

This commit is contained in:
鲨鱼辣椒 committed 2026-09-29 19:43:45 +08:00
1 parent cd1ba41e21
commit 78cfde6734
20 files changed
+517 -37

No files matched your search

+18
View File
@@ -3,6 +3,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
import { TeacherChatPanel } from '@/pages/Chat/TeacherChatPanel';
import type { TeacherDefinition, TeacherRequest, TeacherSend, TeacherTopic } from '../../shared/coding-teacher';
const api = vi.hoisted(() => ({
models: vi.fn(),
catalog: vi.fn(),
config: vi.fn(),
preview: vi.fn(),
@@ -70,6 +71,7 @@ beforeEach(() => {
vi.resetAllMocks();
localStorage.clear();
streams = new Map();
api.models.mockResolvedValue({ supported: true, models: [{ id: 'qwen' }, { id: 'other-model' }] });
api.config.mockResolvedValue({ enabled: true, published_version: 1, revision: 1, definition });
api.catalog.mockResolvedValue({ items: [{ teacher_id: 'one', version: 1, definition, is_default: true }] });
api.conversation.mockResolvedValue({ topic: null, before: null });
@@ -1008,3 +1010,19 @@ describe('merged cloud teacher classroom', () => {
expect(screen.getByRole('button', { name: '智能体新话题' })).toBeEnabled();
});
});
it('selects a teacher model for the next send and retains it after remount', async () => {
const view = render(<TeacherChatPanel projectId="p" sourceId="c" />);
await ready();
const trigger = screen.getByRole('button', { name: /老师模型/ });
fireEvent.keyDown(trigger, { key: 'Enter' });
fireEvent.click(await screen.findByRole('menuitemradio', { name: 'other-model' }));
fireEvent.change(screen.getByRole('textbox', { name: '向智能体提问' }), { target: { value: '我的想法' } });
api.send.mockResolvedValue(first);
fireEvent.click(screen.getByRole('button', { name: '提问' }));
await waitFor(() => expect(api.send).toHaveBeenCalledWith('p/agent-topics', 'first', expect.objectContaining({ modelId: 'other-model', text: '我的想法' })));
view.unmount();
render(<TeacherChatPanel projectId="p" sourceId="c" />);
await screen.findByRole('button', { name: /老师模型:other-model/ });
expect(screen.getByRole('button', { name: '语音输入' })).toBeInTheDocument();
});