Add session-level bridge model settings (#811)

This commit is contained in:
ekko
2026-05-17 12:20:53 +08:00
committed by GitHub
parent fa035f348e
commit 5e8f8bd4a1
35 changed files with 697 additions and 60 deletions
+23
View File
@@ -12,6 +12,8 @@ const localGetSessionDetailMock = vi.fn()
const localSearchSessionsMock = vi.fn()
const localDeleteSessionMock = vi.fn()
const localRenameSessionMock = vi.fn()
const localCreateSessionMock = vi.fn()
const localUpdateSessionMock = vi.fn()
const getGroupChatServerMock = vi.fn()
const getLocalUsageStatsMock = vi.fn()
const getActiveProfileNameMock = vi.fn()
@@ -55,6 +57,9 @@ vi.mock('../../packages/server/src/db/hermes/session-store', () => ({
getSessionDetail: localGetSessionDetailMock,
deleteSession: localDeleteSessionMock,
renameSession: localRenameSessionMock,
createSession: localCreateSessionMock,
getSession: getSessionMock,
updateSession: localUpdateSessionMock,
}))
vi.mock('../../packages/server/src/db/hermes/usage-store', () => ({
@@ -110,6 +115,8 @@ describe('session conversations controller', () => {
localSearchSessionsMock.mockReset()
localDeleteSessionMock.mockReset()
localRenameSessionMock.mockReset()
localCreateSessionMock.mockReset()
localUpdateSessionMock.mockReset()
getGroupChatServerMock.mockReset()
getGroupChatServerMock.mockReturnValue(null)
getLocalUsageStatsMock.mockReset()
@@ -296,6 +303,22 @@ describe('session conversations controller', () => {
])
})
it('sets a session model and provider in the local session store', async () => {
getSessionMock.mockReturnValue({ id: 'session-1' })
const mod = await import('../../packages/server/src/controllers/hermes/sessions')
const ctx: any = {
params: { id: 'session-1' },
request: { body: { model: 'grok-4', provider: 'xai' } },
body: null,
}
await mod.setModel(ctx)
expect(localCreateSessionMock).not.toHaveBeenCalled()
expect(localUpdateSessionMock).toHaveBeenCalledWith('session-1', { model: 'grok-4', provider: 'xai' })
expect(ctx.body).toEqual({ ok: true })
})
describe('exportSession', () => {
it('returns session as JSON download with correct headers (full mode)', async () => {
const sessionData = { id: 'abc-123', title: 'Test Session', messages: [{ id: 1, role: 'user', content: 'hello' }] }
+4
View File
@@ -11,6 +11,7 @@ const getMock = vi.fn(async (ctx: any) => { ctx.body = { session: { id: ctx.para
const removeMock = vi.fn(async (ctx: any) => { ctx.body = { ok: true } })
const renameMock = vi.fn(async (ctx: any) => { ctx.body = { ok: true } })
const setWorkspaceMock = vi.fn(async (ctx: any) => { ctx.body = { ok: true } })
const setModelMock = vi.fn(async (ctx: any) => { ctx.body = { ok: true } })
const listWorkspaceFoldersMock = vi.fn(async (ctx: any) => { ctx.body = { folders: [] } })
const usageBatchMock = vi.fn(async (ctx: any) => { ctx.body = {} })
const usageSingleMock = vi.fn(async (ctx: any) => { ctx.body = { input_tokens: 0, output_tokens: 0 } })
@@ -32,6 +33,7 @@ vi.mock('../../packages/server/src/controllers/hermes/sessions', () => ({
batchRemove: batchRemoveMock,
rename: renameMock,
setWorkspace: setWorkspaceMock,
setModel: setModelMock,
listWorkspaceFolders: listWorkspaceFoldersMock,
usageBatch: usageBatchMock,
usageSingle: usageSingleMock,
@@ -51,6 +53,7 @@ describe('session routes', () => {
getMock.mockClear()
removeMock.mockClear()
renameMock.mockClear()
setModelMock.mockClear()
})
it('registers conversations, session list, and search routes', async () => {
@@ -71,6 +74,7 @@ describe('session routes', () => {
'/api/hermes/sessions/:id/export',
'/api/hermes/sessions/:id/usage',
'/api/hermes/sessions/:id/rename',
'/api/hermes/sessions/:id/model',
]))
})