chore: 工作台产品化进行中的改动
把工作区里其余在制品一并入库,主要是工作台产品化的推进:
后端:新增 capability_definition / project / my_app_center / office_skill
接口与 action_definition / skill_definition / project / user_app_center
模型,config 加路由健康上报。
前端:新增 frontend/src/skills(Office 技能与 workbuddy 复刻)、
项目管理、应用中心、能力目录页,以及配套 api / store / config;
聊天侧新增 SpecialistChip / SpecialistPanel / SkillStrip / AppChatRail
等组件。
清理:移除旧 views/tools 下的单页工具(已并入工作台)、_frozen 冻结组件、
cmd/inspect_oa_debug 调试入口,以及两份调试笔记。
其它:文档与启动脚本同步。
(这批改动与上一提交的 SY23 工作并行进行,此前已在同一工作区内交织。)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,16 +1,6 @@
|
||||
package ai
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"eai_agentplatform/backend/internal/config"
|
||||
)
|
||||
// 知识检索相关的数据传输类型(由 internal/api 使用)。
|
||||
|
||||
type KnowledgeClassifyResult struct {
|
||||
Intent string `json:"intent"`
|
||||
@@ -41,109 +31,3 @@ type KnowledgeIndexItem struct {
|
||||
KnowledgeSpaceKey string `json:"knowledge_space_key"`
|
||||
KnowledgeSpaceName string `json:"knowledge_space_name"`
|
||||
}
|
||||
|
||||
func KnowledgeServiceEnabled(cfg *config.Config) bool {
|
||||
return cfg != nil && strings.TrimSpace(cfg.KnowledgeServiceURL) != ""
|
||||
}
|
||||
|
||||
func KnowledgeClassify(cfg *config.Config, query string) (*KnowledgeClassifyResult, error) {
|
||||
var resp struct {
|
||||
Data KnowledgeClassifyResult `json:"data"`
|
||||
}
|
||||
if err := postKnowledgeService(cfg, "/classify", map[string]any{
|
||||
"query": query,
|
||||
}, &resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &resp.Data, nil
|
||||
}
|
||||
|
||||
func KnowledgeSearch(cfg *config.Config, query, spaceKey string, topK int) ([]KnowledgeSearchItem, error) {
|
||||
var resp struct {
|
||||
Data struct {
|
||||
Items []KnowledgeSearchItem `json:"items"`
|
||||
} `json:"data"`
|
||||
}
|
||||
if err := postKnowledgeService(cfg, "/search", map[string]any{
|
||||
"query": query,
|
||||
"space_key": spaceKey,
|
||||
"top_k": topK,
|
||||
}, &resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return resp.Data.Items, nil
|
||||
}
|
||||
|
||||
func KnowledgeRebuildIndex(cfg *config.Config, items []KnowledgeIndexItem) error {
|
||||
var resp map[string]any
|
||||
return postKnowledgeService(cfg, "/index/rebuild", map[string]any{
|
||||
"index_dir": cfg.KnowledgeIndexDir,
|
||||
"items": items,
|
||||
}, &resp)
|
||||
}
|
||||
|
||||
func postKnowledgeService(cfg *config.Config, path string, payload any, out any) error {
|
||||
if !KnowledgeServiceEnabled(cfg) {
|
||||
return fmt.Errorf("knowledge service disabled")
|
||||
}
|
||||
b, err := json.Marshal(payload)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
url := strings.TrimRight(cfg.KnowledgeServiceURL, "/") + path
|
||||
req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(b))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
// #region debug-point D:knowledge-service-request
|
||||
if payload, err := json.Marshal(map[string]any{
|
||||
"sessionId": "knowledge-chat-401",
|
||||
"runId": "pre-fix",
|
||||
"hypothesisId": "D",
|
||||
"location": "backend-go/internal/ai/knowledge_service_client.go:postKnowledgeService:request",
|
||||
"msg": "[DEBUG] knowledge service request",
|
||||
"data": map[string]any{
|
||||
"url": url,
|
||||
"path": path,
|
||||
},
|
||||
"ts": time.Now().UnixMilli(),
|
||||
}); err == nil {
|
||||
go http.Post("http://127.0.0.1:7777/event", "application/json", strings.NewReader(string(payload)))
|
||||
}
|
||||
// #endregion
|
||||
client := &http.Client{Timeout: 60 * time.Second}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
if resp.StatusCode >= 300 {
|
||||
// #region debug-point D:knowledge-service-non200
|
||||
if payload, err := json.Marshal(map[string]any{
|
||||
"sessionId": "knowledge-chat-401",
|
||||
"runId": "pre-fix",
|
||||
"hypothesisId": "D",
|
||||
"location": "backend-go/internal/ai/knowledge_service_client.go:postKnowledgeService:non200",
|
||||
"msg": "[DEBUG] knowledge service non-200",
|
||||
"data": map[string]any{
|
||||
"url": url,
|
||||
"status": resp.StatusCode,
|
||||
"bodyPreview": truncate(string(body), 240),
|
||||
},
|
||||
"ts": time.Now().UnixMilli(),
|
||||
}); err == nil {
|
||||
go http.Post("http://127.0.0.1:7777/event", "application/json", strings.NewReader(string(payload)))
|
||||
}
|
||||
// #endregion
|
||||
return fmt.Errorf("knowledge service %d: %s", resp.StatusCode, truncate(string(body), 200))
|
||||
}
|
||||
if out == nil || len(body) == 0 {
|
||||
return nil
|
||||
}
|
||||
if err := json.Unmarshal(body, out); err != nil {
|
||||
return fmt.Errorf("knowledge service parse failed: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@ func Retrieve(cfg *config.Config, query string, topK int) []string {
|
||||
topK = 5
|
||||
}
|
||||
var vectorResults []string
|
||||
if route, err := config.GetRoute("embed_gen"); err == nil {
|
||||
if v, err := vectorRetrieve(route, query, topK); err == nil {
|
||||
if aiRoute, err := config.GetRoute("embed_gen"); err == nil {
|
||||
if v, err := vectorRetrieve(aiRoute, query, topK); err == nil {
|
||||
vectorResults = v
|
||||
}
|
||||
}
|
||||
@@ -40,13 +40,13 @@ func Retrieve(cfg *config.Config, query string, topK int) []string {
|
||||
}
|
||||
|
||||
// vectorRetrieve 向量检索:query + 所有 chunk 一次批量 embedding,brute-force 余弦 topK
|
||||
func vectorRetrieve(route *config.RouteConfig, query string, topK int) ([]string, error) {
|
||||
func vectorRetrieve(aiRoute *config.RouteConfig, query string, topK int) ([]string, error) {
|
||||
var chunks []model.KnowledgeChunk
|
||||
store.DB.Order("id ASC").Find(&chunks)
|
||||
if len(chunks) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
client := NewClient(route)
|
||||
client := NewClient(aiRoute)
|
||||
inputs := make([]string, 0, len(chunks)+1)
|
||||
inputs = append(inputs, query)
|
||||
for _, ch := range chunks {
|
||||
|
||||
Reference in New Issue
Block a user