feat: 新增语音转文字(ASR)功能

- 后端:新增 /api/audio/transcribe 接口,调用 Ollama whisper 进行语音识别
- 前端:新增 AudioTranscribePage.vue 页面,支持 MP3/WAV/M4A/OGG/FLAC 等格式
- 注册路由、工具卡片、智能助手欢迎语更新

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
eaiadmin
2026-09-14 00:53:36 +08:00
co-authored by Claude Code
parent 752c7837ef
commit 0455f064ac
299 changed files with 1588 additions and 432 deletions
@@ -0,0 +1,37 @@
package web
import "net/http"
// AppError 业务错误(对齐 Python core/errors.py 的错误码与状态码)
type AppError struct {
StatusCode int
Code string
Message string
}
func (e *AppError) Error() string { return e.Message }
func NewBadRequest(msg string) *AppError {
return &AppError{http.StatusBadRequest, "bad_request", msg}
}
func NewAuthError(msg string) *AppError {
return &AppError{http.StatusUnauthorized, "unauthorized", msg}
}
func NewForbiddenError(msg string) *AppError {
return &AppError{http.StatusForbidden, "forbidden", msg}
}
func NewNotFoundError(msg string) *AppError {
return &AppError{http.StatusNotFound, "not_found", msg}
}
func NewConflictError(msg string) *AppError {
return &AppError{http.StatusConflict, "conflict", msg}
}
func NewLLMNotConfigured(msg string) *AppError {
return &AppError{http.StatusNotImplemented, "llm_not_configured", msg}
}
func NewLLMError(msg string) *AppError {
return &AppError{http.StatusBadGateway, "llm_request_failed", msg}
}
func NewPointsExhausted(msg string) *AppError {
return &AppError{http.StatusPaymentRequired, "ai_points_exhausted", msg}
}
@@ -0,0 +1,17 @@
package web
import (
"net/http"
"github.com/gin-gonic/gin"
)
// OK 成功响应信封 {"data": ..., "error": null, "message": "success"}
func OK(c *gin.Context, data any) {
c.JSON(http.StatusOK, gin.H{"data": data, "error": nil, "message": "success"})
}
// Fail 错误响应信封 {"data": null, "error": ..., "message": ...}
func Fail(c *gin.Context, e *AppError) {
c.JSON(e.StatusCode, gin.H{"data": nil, "error": e.Code, "message": e.Message})
}