This commit is contained in:
hero920103 committed 2026-11-13 20:26:16 +08:00
1 parent b6b528490c
commit 4ab63e77ed
28 files changed
+1858 -695

No files matched your search

+58 -40
View File
@@ -167,7 +167,7 @@ const maxToolRounds = 6
// aiUsage 一次 AI 调用的 token 用量与真实模型
type aiUsage struct {
Model string `json:"model,omitempty"` // 接口实际返回的使用模型(如网关把 auto 解析后的真实模型)
Model string `json:"model,omitempty"` // 接口实际返回的使用模型(如网关把 auto 解析后的真实模型)
PromptTokens int `json:"prompt_tokens"`
CompletionTokens int `json:"completion_tokens"`
TotalTokens int `json:"total_tokens"`
@@ -197,10 +197,10 @@ type usedMcpTool struct {
// aiToolUsage 一次 AI 工具循环调用的元信息:用了什么模型、调用了哪些 MCP 工具
type aiToolUsage struct {
Model string `json:"model"` // 实际使用的模型
Rounds int `json:"rounds"` // 工具循环轮数
Tools []usedMcpTool `json:"tools"` // 实际被调用的 MCP 工具(去重)
ToolCount int `json:"tool_count"` // 工具调用种类数
Model string `json:"model"` // 实际使用的模型
Rounds int `json:"rounds"` // 工具循环轮数
Tools []usedMcpTool `json:"tools"` // 实际被调用的 MCP 工具(去重)
ToolCount int `json:"tool_count"` // 工具调用种类数
}
// sanitizeToolName 工具名规范化为 OpenAI 允许的字符集
@@ -260,8 +260,8 @@ func collectMcpTools(claims *jwtutil.Claims, enabled bool, serverIDs []uint64) (
if err != nil {
// 单个服务连接失败不阻断整体,跳过并记录到摘要(标记不可用)
summaries = append(summaries, mcpToolSummary{
ServerID: srv.ID,
ServerName: srv.Name,
ServerID: srv.ID,
ServerName: srv.Name,
Description: "连接失败:" + err.Error(),
})
continue
@@ -446,8 +446,25 @@ func (c *BackendAiChatController) MessageList() {
c.chatJsonErr(500, 500, "查询失败: "+err.Error())
return
}
providerName := ""
if session.ProviderID > 0 {
provider := models.BackendAiProvider{ID: session.ProviderID}
if models.Orm.Read(&provider) == nil {
providerName = provider.Name
}
}
responseList := make([]map[string]interface{}, 0, len(list))
for _, message := range list {
b, _ := json.Marshal(message)
var item map[string]interface{}
_ = json.Unmarshal(b, &item)
if message.Role == "assistant" && providerName != "" {
item["provider_name"] = providerName
}
responseList = append(responseList, item)
}
c.chatOk(map[string]interface{}{"list": list, "title": session.Title})
c.chatOk(map[string]interface{}{"list": responseList, "title": session.Title})
}
// DeleteMessage DELETE /backend/ai/chat/message/:id
@@ -702,14 +719,14 @@ func (c *BackendAiChatController) Send() {
durationMs := int(time.Since(startTime).Milliseconds())
assistantMsg := models.BackendAiChatMessage{
TenantID: fmt.Sprintf("%d", claims.TenantId),
SessionID: session.ID,
Role: "assistant",
Content: reply,
Tokens: totalUsage.total(),
DurationMs: durationMs,
Model: useModel,
CreateTime: time.Now(),
TenantID: fmt.Sprintf("%d", claims.TenantId),
SessionID: session.ID,
Role: "assistant",
Content: reply,
Tokens: totalUsage.total(),
DurationMs: durationMs,
Model: useModel,
CreateTime: time.Now(),
}
_, _ = models.Orm.Insert(&assistantMsg)
@@ -886,14 +903,14 @@ func (c *BackendAiChatController) SendStream() {
// 保存AI回复
durationMs := int(time.Since(startTime).Milliseconds())
assistantMsg := models.BackendAiChatMessage{
TenantID: fmt.Sprintf("%d", claims.TenantId),
SessionID: session.ID,
Role: "assistant",
Content: fullReply,
Tokens: totalUsage.total(),
DurationMs: durationMs,
Model: useModel,
CreateTime: time.Now(),
TenantID: fmt.Sprintf("%d", claims.TenantId),
SessionID: session.ID,
Role: "assistant",
Content: fullReply,
Tokens: totalUsage.total(),
DurationMs: durationMs,
Model: useModel,
CreateTime: time.Now(),
}
_, _ = models.Orm.Insert(&assistantMsg)
@@ -901,11 +918,12 @@ func (c *BackendAiChatController) SendStream() {
_, _ = models.Orm.Update(&session, "update_time")
writeJSON("done", map[string]interface{}{
"session_id": session.ID,
"message_id": assistantMsg.ID,
"tokens": totalUsage.total(),
"duration_ms": durationMs,
"model": useModel,
"session_id": session.ID,
"message_id": assistantMsg.ID,
"tokens": totalUsage.total(),
"duration_ms": durationMs,
"model": useModel,
"provider_name": provider.Name,
})
}
@@ -1044,10 +1062,10 @@ func callAITools(provider models.BackendAiProvider, model string, systemPrompt s
}
var result struct {
Content []struct {
Type string `json:"type"`
Text string `json:"text"`
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Text string `json:"text"`
ID string `json:"id"`
Name string `json:"name"`
Input map[string]interface{} `json:"input"`
} `json:"content"`
Usage *struct {
@@ -1303,9 +1321,9 @@ func callAnthropicStreamTools(provider models.BackendAiProvider, model string, s
var text strings.Builder
var usage aiUsage
type toolUseAcc struct {
ID string
Name string
Input strings.Builder
ID string
Name string
Input strings.Builder
}
acc := make(map[int]*toolUseAcc)
var order []int
@@ -1326,11 +1344,11 @@ func callAnthropicStreamTools(provider models.BackendAiProvider, model string, s
switch currentEvent {
case "content_block_start":
var block struct {
Index int `json:"index"`
Index int `json:"index"`
ContentBlock struct {
Type string `json:"type"`
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
ID string `json:"id"`
Name string `json:"name"`
} `json:"content_block"`
Usage *struct {
InputTokens int `json:"input_tokens"`