CI / Go Backend (push) Canceled after 0s
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
168 lines
4.6 KiB
Go
168 lines
4.6 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
|
|
"mrcc/internal/config"
|
|
"mrcc/internal/httpserver"
|
|
"mrcc/internal/logger"
|
|
"mrcc/pkg/response"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func main() {
|
|
cfg := config.Load("ai-service", "8087")
|
|
logger.WithService(cfg.Name).Info("starting AI assistant service", "port", cfg.Port)
|
|
|
|
srv := httpserver.New(cfg)
|
|
|
|
// AI 助搭 API 路由
|
|
api := srv.Group("/api/ai")
|
|
{
|
|
// 聊天接口 - 流式返回 (SSE)
|
|
api.POST("/chat", handleChat)
|
|
|
|
// 电路分析 - 分析当前电路并返回诊断报告
|
|
api.POST("/analyze", handleAnalyze)
|
|
|
|
// 电路建议 - 根据需求生成搭建方案
|
|
api.POST("/suggest", handleSuggest)
|
|
|
|
// 操作执行 - AI 规划的操作序列 (客户端确认后调用)
|
|
api.POST("/execute", handleExecute)
|
|
|
|
// 聊天历史
|
|
api.GET("/history", handleHistory)
|
|
|
|
// 用户反馈
|
|
api.POST("/feedback", handleFeedback)
|
|
}
|
|
|
|
log.Printf("ai-service listening on %s (endpoints: /api/ai/*)", cfg.Address())
|
|
if err := srv.Run(cfg.Address()); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
// === 请求/响应结构 ===
|
|
|
|
type ChatRequest struct {
|
|
SessionID string `json:"sessionId"`
|
|
Message string `json:"message"`
|
|
Context GameContext `json:"context"`
|
|
}
|
|
|
|
type GameContext struct {
|
|
Mode string `json:"mode"`
|
|
CanvasWidth int `json:"canvasWidth"`
|
|
CanvasHeight int `json:"canvasHeight"`
|
|
ComponentCount int `json:"componentCount"`
|
|
SelectedComponent string `json:"selectedComponent"`
|
|
LevelID *int `json:"levelId"`
|
|
LevelTitle string `json:"levelTitle"`
|
|
RedstoneCoins int64 `json:"redstoneCoins"`
|
|
}
|
|
|
|
type ChatResponse struct {
|
|
Type string `json:"type"` // text | analysis | action | error
|
|
Content string `json:"content"`
|
|
Actions []AIAction `json:"actions"`
|
|
RequiresConfirmation bool `json:"requiresConfirmation"`
|
|
}
|
|
|
|
type AIAction struct {
|
|
Type string `json:"type"` // place | delete | move | rotate | wire
|
|
Component string `json:"component"` // 元件类型 (place 时)
|
|
X int `json:"x"`
|
|
Y int `json:"y"`
|
|
FromX int `json:"fromX"` // move/wire 时
|
|
FromY int `json:"fromY"` // move/wire 时
|
|
Rotation int `json:"rotation"`
|
|
Description string `json:"description"` // 供用户确认时显示
|
|
}
|
|
|
|
type AnalysisReport struct {
|
|
Summary string `json:"summary"`
|
|
Metrics AnalysisMetrics `json:"metrics"`
|
|
Issues []AnalysisIssue `json:"issues"`
|
|
Optimizations []AnalysisOptimization `json:"optimizations"`
|
|
}
|
|
|
|
type AnalysisMetrics struct {
|
|
ComponentCount int `json:"componentCount"`
|
|
TotalCost int `json:"totalCost"`
|
|
MaxDelay int `json:"maxDelay"`
|
|
SignalPaths int `json:"signalPaths"`
|
|
}
|
|
|
|
type AnalysisIssue struct {
|
|
Severity string `json:"severity"` // error | warning | info
|
|
Type string `json:"type"` // signal_loss | short_circuit | redundant
|
|
LocationX int `json:"locationX"`
|
|
LocationY int `json:"locationY"`
|
|
Description string `json:"description"`
|
|
Suggestion string `json:"suggestion"`
|
|
}
|
|
|
|
type AnalysisOptimization struct {
|
|
Type string `json:"type"`
|
|
Description string `json:"description"`
|
|
EstimatedImprovement string `json:"estimatedImprovement"`
|
|
}
|
|
|
|
// === 处理函数 ===
|
|
|
|
func handleChat(c *gin.Context) {
|
|
var req ChatRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.Error(c, 400, "invalid request: "+err.Error())
|
|
return
|
|
}
|
|
|
|
// TODO: 实现 LLM 调用链
|
|
// 1. 意图识别 (问答 / 助搭 / 分析 / 操作)
|
|
// 2. RAG 检索相关知识
|
|
// 3. 调用 LLM API (GPT-4o / Claude / 国产模型)
|
|
// 4. 解析 LLM 输出,组装响应
|
|
|
|
// 骨架响应
|
|
response.OK(c, ChatResponse{
|
|
Type: "text",
|
|
Content: "AI 助搭服务正在开发中。您的消息已收到:" + req.Message,
|
|
})
|
|
}
|
|
|
|
func handleAnalyze(c *gin.Context) {
|
|
// TODO: 接收电路数据,运行本地电路分析引擎
|
|
response.OK(c, AnalysisReport{
|
|
Summary: "分析功能开发中",
|
|
Metrics: AnalysisMetrics{},
|
|
})
|
|
}
|
|
|
|
func handleSuggest(c *gin.Context) {
|
|
// TODO: 根据用户需求生成电路搭建方案
|
|
response.OK(c, gin.H{
|
|
"plans": []gin.H{},
|
|
})
|
|
}
|
|
|
|
func handleExecute(c *gin.Context) {
|
|
// TODO: 记录 AI 操作日志,用于审计
|
|
response.OK(c, gin.H{"status": "logged"})
|
|
}
|
|
|
|
func handleHistory(c *gin.Context) {
|
|
// TODO: 从 PostgreSQL 查询用户聊天历史
|
|
response.OK(c, gin.H{
|
|
"messages": []gin.H{},
|
|
"total": 0,
|
|
})
|
|
}
|
|
|
|
func handleFeedback(c *gin.Context) {
|
|
// TODO: 记录用户反馈 (赞/踩),用于改进 AI 质量
|
|
response.OK(c, gin.H{"status": "recorded"})
|
|
}
|