更新
This commit is contained in:
1 parent
b6b528490c
commit
4ab63e77ed
28 files changed
+1858
-695
No files matched your search
@@ -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"`
|
||||
|
||||
Reference in new issue
Block a user