feat(ollama): 支持 Cloud 官方用量自动刷新

This commit is contained in:
alfadb
2026-07-23 15:50:44 +08:00
parent 2c76506e07
commit 5ac4a9fac2
47 changed files with 5571 additions and 85 deletions
@@ -0,0 +1,68 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
const { get, post, put, del } = vi.hoisted(() => ({
get: vi.fn(),
post: vi.fn(),
put: vi.fn(),
del: vi.fn()
}))
vi.mock('@/api/client', () => ({
apiClient: { get, post, put, delete: del }
}))
import {
deleteOllamaCloudUsageSession,
getOllamaCloudUsage,
getOllamaCloudUsageSettings,
refreshOllamaCloudUsage,
saveOllamaCloudUsageSession,
setOllamaCloudUsageAutoRefresh,
updateOllamaCloudUsageSettings
} from '@/api/admin/accounts'
const state = {
account_id: 7,
eligible: true,
configured: true,
auto_refresh_enabled: false,
encryption_key_configured: true
}
describe('admin Ollama Cloud usage API', () => {
beforeEach(() => {
get.mockReset()
post.mockReset()
put.mockReset()
del.mockReset()
})
it('uses dedicated global settings endpoints', async () => {
const settings = { enabled: false, interval_minutes: 60 }
get.mockResolvedValueOnce({ data: settings })
put.mockResolvedValueOnce({ data: settings })
await expect(getOllamaCloudUsageSettings()).resolves.toEqual(settings)
await expect(updateOllamaCloudUsageSettings(settings)).resolves.toEqual(settings)
expect(get).toHaveBeenCalledWith('/admin/accounts/ollama-cloud-usage/settings')
expect(put).toHaveBeenCalledWith('/admin/accounts/ollama-cloud-usage/settings', settings)
})
it('keeps session configuration write-only and separate from account updates', async () => {
get.mockResolvedValueOnce({ data: state })
put.mockResolvedValueOnce({ data: state }).mockResolvedValueOnce({ data: state })
del.mockResolvedValueOnce({ data: { ...state, configured: false } })
post.mockResolvedValueOnce({ data: state })
await expect(getOllamaCloudUsage(7)).resolves.toEqual(state)
await expect(saveOllamaCloudUsageSession(7, 'wos-session=secret')).resolves.toEqual(state)
await expect(setOllamaCloudUsageAutoRefresh(7, true)).resolves.toEqual(state)
await expect(refreshOllamaCloudUsage(7)).resolves.toEqual(state)
await expect(deleteOllamaCloudUsageSession(7)).resolves.toMatchObject({ configured: false })
expect(put).toHaveBeenNthCalledWith(1, '/admin/accounts/7/ollama-cloud-usage/session', { session: 'wos-session=secret' })
expect(put).toHaveBeenNthCalledWith(2, '/admin/accounts/7/ollama-cloud-usage/auto-refresh', { enabled: true })
expect(post).toHaveBeenCalledWith('/admin/accounts/7/ollama-cloud-usage/refresh')
expect(del).toHaveBeenCalledWith('/admin/accounts/7/ollama-cloud-usage/session')
})
})
+55 -2
View File
@@ -22,7 +22,9 @@ import type {
CheckMixedChannelRequest,
CheckMixedChannelResponse,
UpstreamBillingProbeResult,
UpstreamBillingProbeSettings
UpstreamBillingProbeSettings,
OllamaCloudUsageSettings,
OllamaCloudUsageState
} from '@/types'
/**
@@ -882,6 +884,50 @@ export async function probeUpstreamBillingBatch(accountIds: number[]): Promise<U
return data.results
}
export async function getOllamaCloudUsageSettings(): Promise<OllamaCloudUsageSettings> {
const { data } = await apiClient.get<OllamaCloudUsageSettings>('/admin/accounts/ollama-cloud-usage/settings')
return data
}
export async function updateOllamaCloudUsageSettings(
settings: OllamaCloudUsageSettings
): Promise<OllamaCloudUsageSettings> {
const { data } = await apiClient.put<OllamaCloudUsageSettings>(
'/admin/accounts/ollama-cloud-usage/settings',
settings
)
return data
}
export async function getOllamaCloudUsage(id: number): Promise<OllamaCloudUsageState> {
const { data } = await apiClient.get<OllamaCloudUsageState>(`/admin/accounts/${id}/ollama-cloud-usage`)
return data
}
export async function saveOllamaCloudUsageSession(id: number, session: string): Promise<OllamaCloudUsageState> {
const { data } = await apiClient.put<OllamaCloudUsageState>(`/admin/accounts/${id}/ollama-cloud-usage/session`, {
session
})
return data
}
export async function deleteOllamaCloudUsageSession(id: number): Promise<OllamaCloudUsageState> {
const { data } = await apiClient.delete<OllamaCloudUsageState>(`/admin/accounts/${id}/ollama-cloud-usage/session`)
return data
}
export async function setOllamaCloudUsageAutoRefresh(id: number, enabled: boolean): Promise<OllamaCloudUsageState> {
const { data } = await apiClient.put<OllamaCloudUsageState>(`/admin/accounts/${id}/ollama-cloud-usage/auto-refresh`, {
enabled
})
return data
}
export async function refreshOllamaCloudUsage(id: number): Promise<OllamaCloudUsageState> {
const { data } = await apiClient.post<OllamaCloudUsageState>(`/admin/accounts/${id}/ollama-cloud-usage/refresh`)
return data
}
export const accountsAPI = {
list,
listWithEtag,
@@ -933,7 +979,14 @@ export const accountsAPI = {
updateUpstreamBillingProbeSettings,
setUpstreamBillingProbeEnabled,
probeUpstreamBilling,
probeUpstreamBillingBatch
probeUpstreamBillingBatch,
getOllamaCloudUsageSettings,
updateOllamaCloudUsageSettings,
getOllamaCloudUsage,
saveOllamaCloudUsageSession,
deleteOllamaCloudUsageSession,
setOllamaCloudUsageAutoRefresh,
refreshOllamaCloudUsage
}
export default accountsAPI