chore(server): disable audio endpoint
This commit is contained in:
@@ -12,7 +12,6 @@ import type { HonoEnv } from '../../../types/hono'
|
||||
import { useLogger } from '@guiiai/logg'
|
||||
import { context, SpanStatusCode, trace } from '@opentelemetry/api'
|
||||
import { Hono } from 'hono'
|
||||
import { bodyLimit } from 'hono/body-limit'
|
||||
|
||||
import { authGuard } from '../../../middlewares/auth'
|
||||
import { configGuard } from '../../../middlewares/config-guard'
|
||||
@@ -315,148 +314,148 @@ export function createV1CompletionsRoutes(fluxService: FluxService, billingServi
|
||||
return c.json(responseBody)
|
||||
}
|
||||
|
||||
async function handleTTS(c: Context<HonoEnv>) {
|
||||
const user = c.get('user')!
|
||||
const flux = await fluxService.getFlux(user.id)
|
||||
if (flux.flux <= 0) {
|
||||
throw createPaymentRequiredError('Insufficient flux')
|
||||
}
|
||||
// async function handleTTS(c: Context<HonoEnv>) {
|
||||
// const user = c.get('user')!
|
||||
// const flux = await fluxService.getFlux(user.id)
|
||||
// if (flux.flux <= 0) {
|
||||
// throw createPaymentRequiredError('Insufficient flux')
|
||||
// }
|
||||
|
||||
const body = await c.req.json()
|
||||
const gatewayBaseUrl = await configKV.getOrThrow('GATEWAY_BASE_URL')
|
||||
const baseUrl = normalizeBaseUrl(gatewayBaseUrl)
|
||||
const serverAttributes = getServerConnectionAttributes(baseUrl)
|
||||
const requestModel = body.model || 'auto'
|
||||
// const body = await c.req.json()
|
||||
// const gatewayBaseUrl = await configKV.getOrThrow('GATEWAY_BASE_URL')
|
||||
// const baseUrl = normalizeBaseUrl(gatewayBaseUrl)
|
||||
// const serverAttributes = getServerConnectionAttributes(baseUrl)
|
||||
// const requestModel = body.model || 'auto'
|
||||
|
||||
const span = tracer.startSpan('llm.gateway.tts', {
|
||||
attributes: {
|
||||
[GEN_AI_ATTR_REQUEST_MODEL]: requestModel,
|
||||
[AIRI_ATTR_GEN_AI_OPERATION_KIND]: 'text_to_speech',
|
||||
...serverAttributes,
|
||||
},
|
||||
})
|
||||
// const span = tracer.startSpan('llm.gateway.tts', {
|
||||
// attributes: {
|
||||
// [GEN_AI_ATTR_REQUEST_MODEL]: requestModel,
|
||||
// [AIRI_ATTR_GEN_AI_OPERATION_KIND]: 'text_to_speech',
|
||||
// ...serverAttributes,
|
||||
// },
|
||||
// })
|
||||
|
||||
const startedAt = Date.now()
|
||||
// const startedAt = Date.now()
|
||||
|
||||
const response = await context.with(trace.setSpan(context.active(), span), () =>
|
||||
fetch(`${baseUrl}audio/speech`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(body),
|
||||
}))
|
||||
// const response = await context.with(trace.setSpan(context.active(), span), () =>
|
||||
// fetch(`${baseUrl}audio/speech`, {
|
||||
// method: 'POST',
|
||||
// headers: { 'Content-Type': 'application/json' },
|
||||
// body: JSON.stringify(body),
|
||||
// }))
|
||||
|
||||
const durationMs = Date.now() - startedAt
|
||||
span.setAttribute('http.response.status_code', response.status)
|
||||
// const durationMs = Date.now() - startedAt
|
||||
// span.setAttribute('http.response.status_code', response.status)
|
||||
|
||||
if (!response.ok) {
|
||||
span.setStatus({ code: SpanStatusCode.ERROR, message: `Gateway ${response.status}` })
|
||||
span.end()
|
||||
recordMetrics({ model: requestModel, status: response.status, type: 'tts', durationMs, fluxConsumed: 0 })
|
||||
return new Response(response.body, {
|
||||
status: response.status,
|
||||
headers: buildSafeResponseHeaders(response),
|
||||
})
|
||||
}
|
||||
// if (!response.ok) {
|
||||
// span.setStatus({ code: SpanStatusCode.ERROR, message: `Gateway ${response.status}` })
|
||||
// span.end()
|
||||
// recordMetrics({ model: requestModel, status: response.status, type: 'tts', durationMs, fluxConsumed: 0 })
|
||||
// return new Response(response.body, {
|
||||
// status: response.status,
|
||||
// headers: buildSafeResponseHeaders(response),
|
||||
// })
|
||||
// }
|
||||
|
||||
const fluxPerRequest = await configKV.getOrThrow('FLUX_PER_REQUEST_TTS')
|
||||
await billingService.consumeFluxForLLM({
|
||||
userId: user.id,
|
||||
amount: fluxPerRequest,
|
||||
requestId: nanoid(),
|
||||
description: `tts:${requestModel}`,
|
||||
})
|
||||
// const fluxPerRequest = await configKV.getOrThrow('FLUX_PER_REQUEST_TTS')
|
||||
// await billingService.consumeFluxForLLM({
|
||||
// userId: user.id,
|
||||
// amount: fluxPerRequest,
|
||||
// requestId: nanoid(),
|
||||
// description: `tts:${requestModel}`,
|
||||
// })
|
||||
|
||||
span.setAttribute(AIRI_ATTR_BILLING_FLUX_CONSUMED, fluxPerRequest)
|
||||
span.end()
|
||||
recordMetrics({ model: requestModel, status: response.status, type: 'tts', durationMs, fluxConsumed: fluxPerRequest })
|
||||
// span.setAttribute(AIRI_ATTR_BILLING_FLUX_CONSUMED, fluxPerRequest)
|
||||
// span.end()
|
||||
// recordMetrics({ model: requestModel, status: response.status, type: 'tts', durationMs, fluxConsumed: fluxPerRequest })
|
||||
|
||||
publishRequestLog({
|
||||
userId: user.id,
|
||||
model: requestModel,
|
||||
status: response.status,
|
||||
durationMs,
|
||||
fluxConsumed: fluxPerRequest,
|
||||
})
|
||||
// publishRequestLog({
|
||||
// userId: user.id,
|
||||
// model: requestModel,
|
||||
// status: response.status,
|
||||
// durationMs,
|
||||
// fluxConsumed: fluxPerRequest,
|
||||
// })
|
||||
|
||||
return new Response(response.body, {
|
||||
status: response.status,
|
||||
headers: buildSafeResponseHeaders(response),
|
||||
})
|
||||
}
|
||||
// return new Response(response.body, {
|
||||
// status: response.status,
|
||||
// headers: buildSafeResponseHeaders(response),
|
||||
// })
|
||||
// }
|
||||
|
||||
async function handleTranscription(c: Context<HonoEnv>) {
|
||||
const user = c.get('user')!
|
||||
const flux = await fluxService.getFlux(user.id)
|
||||
if (flux.flux <= 0) {
|
||||
throw createPaymentRequiredError('Insufficient flux')
|
||||
}
|
||||
// async function handleTranscription(c: Context<HonoEnv>) {
|
||||
// const user = c.get('user')!
|
||||
// const flux = await fluxService.getFlux(user.id)
|
||||
// if (flux.flux <= 0) {
|
||||
// throw createPaymentRequiredError('Insufficient flux')
|
||||
// }
|
||||
|
||||
const gatewayBaseUrl = await configKV.getOrThrow('GATEWAY_BASE_URL')
|
||||
const baseUrl = normalizeBaseUrl(gatewayBaseUrl)
|
||||
const serverAttributes = getServerConnectionAttributes(baseUrl)
|
||||
// const gatewayBaseUrl = await configKV.getOrThrow('GATEWAY_BASE_URL')
|
||||
// const baseUrl = normalizeBaseUrl(gatewayBaseUrl)
|
||||
// const serverAttributes = getServerConnectionAttributes(baseUrl)
|
||||
|
||||
const span = tracer.startSpan('llm.gateway.asr', {
|
||||
attributes: {
|
||||
[GEN_AI_ATTR_REQUEST_MODEL]: 'auto',
|
||||
[AIRI_ATTR_GEN_AI_OPERATION_KIND]: 'speech_to_text',
|
||||
...serverAttributes,
|
||||
},
|
||||
})
|
||||
// const span = tracer.startSpan('llm.gateway.asr', {
|
||||
// attributes: {
|
||||
// [GEN_AI_ATTR_REQUEST_MODEL]: 'auto',
|
||||
// [AIRI_ATTR_GEN_AI_OPERATION_KIND]: 'speech_to_text',
|
||||
// ...serverAttributes,
|
||||
// },
|
||||
// })
|
||||
|
||||
const startedAt = Date.now()
|
||||
// const startedAt = Date.now()
|
||||
|
||||
const rawBody = await c.req.arrayBuffer()
|
||||
const contentType = c.req.header('content-type') || 'multipart/form-data'
|
||||
// const rawBody = await c.req.arrayBuffer()
|
||||
// const contentType = c.req.header('content-type') || 'multipart/form-data'
|
||||
|
||||
const response = await context.with(trace.setSpan(context.active(), span), () =>
|
||||
fetch(`${baseUrl}audio/transcriptions`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': contentType },
|
||||
body: rawBody,
|
||||
}))
|
||||
// const response = await context.with(trace.setSpan(context.active(), span), () =>
|
||||
// fetch(`${baseUrl}audio/transcriptions`, {
|
||||
// method: 'POST',
|
||||
// headers: { 'Content-Type': contentType },
|
||||
// body: rawBody,
|
||||
// }))
|
||||
|
||||
const durationMs = Date.now() - startedAt
|
||||
span.setAttribute('http.response.status_code', response.status)
|
||||
// const durationMs = Date.now() - startedAt
|
||||
// span.setAttribute('http.response.status_code', response.status)
|
||||
|
||||
if (!response.ok) {
|
||||
span.setStatus({ code: SpanStatusCode.ERROR, message: `Gateway ${response.status}` })
|
||||
span.end()
|
||||
recordMetrics({ model: 'auto', status: response.status, type: 'asr', durationMs, fluxConsumed: 0 })
|
||||
return new Response(response.body, {
|
||||
status: response.status,
|
||||
headers: buildSafeResponseHeaders(response),
|
||||
})
|
||||
}
|
||||
// if (!response.ok) {
|
||||
// span.setStatus({ code: SpanStatusCode.ERROR, message: `Gateway ${response.status}` })
|
||||
// span.end()
|
||||
// recordMetrics({ model: 'auto', status: response.status, type: 'asr', durationMs, fluxConsumed: 0 })
|
||||
// return new Response(response.body, {
|
||||
// status: response.status,
|
||||
// headers: buildSafeResponseHeaders(response),
|
||||
// })
|
||||
// }
|
||||
|
||||
const fluxPerRequest = await configKV.getOrThrow('FLUX_PER_REQUEST_ASR')
|
||||
await billingService.consumeFluxForLLM({
|
||||
userId: user.id,
|
||||
amount: fluxPerRequest,
|
||||
requestId: nanoid(),
|
||||
description: `asr:auto`,
|
||||
})
|
||||
// const fluxPerRequest = await configKV.getOrThrow('FLUX_PER_REQUEST_ASR')
|
||||
// await billingService.consumeFluxForLLM({
|
||||
// userId: user.id,
|
||||
// amount: fluxPerRequest,
|
||||
// requestId: nanoid(),
|
||||
// description: `asr:auto`,
|
||||
// })
|
||||
|
||||
span.setAttribute(AIRI_ATTR_BILLING_FLUX_CONSUMED, fluxPerRequest)
|
||||
span.end()
|
||||
recordMetrics({ model: 'auto', status: response.status, type: 'asr', durationMs, fluxConsumed: fluxPerRequest })
|
||||
// span.setAttribute(AIRI_ATTR_BILLING_FLUX_CONSUMED, fluxPerRequest)
|
||||
// span.end()
|
||||
// recordMetrics({ model: 'auto', status: response.status, type: 'asr', durationMs, fluxConsumed: fluxPerRequest })
|
||||
|
||||
publishRequestLog({
|
||||
userId: user.id,
|
||||
model: 'auto',
|
||||
status: response.status,
|
||||
durationMs,
|
||||
fluxConsumed: fluxPerRequest,
|
||||
})
|
||||
// publishRequestLog({
|
||||
// userId: user.id,
|
||||
// model: 'auto',
|
||||
// status: response.status,
|
||||
// durationMs,
|
||||
// fluxConsumed: fluxPerRequest,
|
||||
// })
|
||||
|
||||
return new Response(response.body, {
|
||||
status: response.status,
|
||||
headers: buildSafeResponseHeaders(response),
|
||||
})
|
||||
}
|
||||
// return new Response(response.body, {
|
||||
// status: response.status,
|
||||
// headers: buildSafeResponseHeaders(response),
|
||||
// })
|
||||
// }
|
||||
|
||||
const chatGuard = configGuard(configKV, ['FLUX_PER_REQUEST', 'GATEWAY_BASE_URL', 'DEFAULT_CHAT_MODEL'], 'Service is not available yet')
|
||||
const ttsGuard = configGuard(configKV, ['FLUX_PER_REQUEST_TTS', 'GATEWAY_BASE_URL'], 'TTS service is not available yet')
|
||||
const asrGuard = configGuard(configKV, ['FLUX_PER_REQUEST_ASR', 'GATEWAY_BASE_URL'], 'ASR service is not available yet')
|
||||
// const ttsGuard = configGuard(configKV, ['FLUX_PER_REQUEST_TTS', 'GATEWAY_BASE_URL'], 'TTS service is not available yet')
|
||||
// const asrGuard = configGuard(configKV, ['FLUX_PER_REQUEST_ASR', 'GATEWAY_BASE_URL'], 'ASR service is not available yet')
|
||||
|
||||
// 60 requests per minute per user for LLM completions
|
||||
const completionsRateLimit = rateLimiter({ max: 60, windowSec: 60 })
|
||||
@@ -465,6 +464,6 @@ export function createV1CompletionsRoutes(fluxService: FluxService, billingServi
|
||||
.use('*', authGuard)
|
||||
.post('/chat/completions', completionsRateLimit, chatGuard, handleCompletion)
|
||||
.post('/chat/completion', completionsRateLimit, chatGuard, handleCompletion)
|
||||
.post('/audio/speech', ttsGuard, handleTTS)
|
||||
.post('/audio/transcriptions', bodyLimit({ maxSize: 25 * 1024 * 1024 }), asrGuard, handleTranscription)
|
||||
// .post('/audio/speech', ttsGuard, handleTTS)
|
||||
// .post('/audio/transcriptions', bodyLimit({ maxSize: 25 * 1024 * 1024 }), asrGuard, handleTranscription)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user