Merge remote-tracking branch 'origin/master'

# Conflicts:
#	07-Other/AI/AI Agent/WY/Website/Netease AITA AssetMaker.md
This commit is contained in:
2026-04-19 11:56:15 +08:00
25 changed files with 592 additions and 46 deletions

View File

@@ -4,21 +4,20 @@
"title": "Greet user in Chinese", "title": "Greet user in Chinese",
"titleGenerationStatus": "success", "titleGenerationStatus": "success",
"createdAt": 1776071385957, "createdAt": 1776071385957,
"updatedAt": 1776179962356, "updatedAt": 1776323430776,
"lastResponseAt": 1776179962356, "lastResponseAt": 1776323388014,
"sessionId": "c432006f-72f1-4f80-9625-7cb62e468878", "sessionId": "c432006f-72f1-4f80-9625-7cb62e468878",
"providerState": { "providerState": {
"providerSessionId": "c432006f-72f1-4f80-9625-7cb62e468878" "providerSessionId": "c432006f-72f1-4f80-9625-7cb62e468878"
}, },
"currentNote": "07-Other/AI/Obsidian/Obsidian CLI.md",
"usage": { "usage": {
"model": "opus[1m]", "model": "opus[1m]",
"inputTokens": 1, "inputTokens": 1,
"cacheCreationInputTokens": 1084, "cacheCreationInputTokens": 196,
"cacheReadInputTokens": 41428, "cacheReadInputTokens": 46736,
"contextWindow": 1000000, "contextWindow": 1000000,
"contextTokens": 42513, "contextTokens": 46933,
"percentage": 4, "percentage": 5,
"contextWindowIsAuthoritative": true "contextWindowIsAuthoritative": true
} }
} }

View File

@@ -0,0 +1,23 @@
{
"id": "conv-1776323459705-5pi4d1m2c",
"providerId": "claude",
"title": "Add NOS bucket info to Artlib S3 list",
"titleGenerationStatus": "success",
"createdAt": 1776323459705,
"updatedAt": 1776323556815,
"lastResponseAt": 1776323548529,
"sessionId": "5d6a917b-dae7-414e-9708-db14c72e050e",
"providerState": {
"providerSessionId": "5d6a917b-dae7-414e-9708-db14c72e050e"
},
"usage": {
"model": "opus[1m]",
"inputTokens": 1,
"cacheCreationInputTokens": 438,
"cacheReadInputTokens": 28313,
"contextWindow": 1000000,
"contextTokens": 28752,
"percentage": 3,
"contextWindowIsAuthoritative": true
}
}

View File

@@ -0,0 +1,23 @@
{
"id": "conv-1776407147334-cxjkybum1",
"providerId": "claude",
"title": "Organize weekly summary files into yearly folders",
"titleGenerationStatus": "success",
"createdAt": 1776407147335,
"updatedAt": 1776407189487,
"lastResponseAt": 1776407189487,
"sessionId": "5d03d783-5042-4214-b0a9-0eb9d1208b35",
"providerState": {
"providerSessionId": "5d03d783-5042-4214-b0a9-0eb9d1208b35"
},
"usage": {
"model": "opus[1m]",
"inputTokens": 1,
"cacheCreationInputTokens": 452,
"cacheReadInputTokens": 29934,
"contextWindow": 1000000,
"contextTokens": 30387,
"percentage": 3,
"contextWindowIsAuthoritative": true
}
}

View File

@@ -2,10 +2,10 @@
"tabManagerState": { "tabManagerState": {
"openTabs": [ "openTabs": [
{ {
"tabId": "tab-1776071369651-6oz9pqs", "tabId": "tab-1776323554594-sqmcnmq",
"conversationId": "conv-1776071385957-rol42oxg8" "conversationId": "conv-1776407147334-cxjkybum1"
} }
], ],
"activeTabId": "tab-1776071369651-6oz9pqs" "activeTabId": "tab-1776323554594-sqmcnmq"
} }
} }

View File

@@ -1 +1 @@
{"Agent":{"Agent":{"internalLink":{"count":2,"lastUpdated":1773554273209}}},"要解决这个问题,得对记忆进行合理规划与维护:":{"要解决这个问题,得对记忆进行合理规划与维护:":{"currentFile":{"count":1,"lastUpdated":1774938677236}}},"Openclaw-workspace":{"Openclaw-workspace":{"currentFile":{"count":1,"lastUpdated":1774938879095}}},"workflow":{"workflow":{"currentFile":{"count":1,"lastUpdated":1775020352083}}},"\\AI\\Skill\\MatrixAITA-POPODocs-Skill、D":{"\\AI\\Skill\\MatrixAITA-POPODocs-Skill、D":{"currentFile":{"count":1,"lastUpdated":1776242568663}}},"推荐加在仓库内已有的标准元数据文件中,例如:":{"推荐加在仓库内已有的标准元数据文件中,例如:":{"currentFile":{"count":1,"lastUpdated":1776242909075}}},"推荐加在仓库内已有的标准元数据文件中,":{"推荐加在仓库内已有的标准元数据文件中,":{"currentFile":{"count":1,"lastUpdated":1776242914868}}}} {"Agent":{"Agent":{"internalLink":{"count":2,"lastUpdated":1773554273209}}},"要解决这个问题,得对记忆进行合理规划与维护:":{"要解决这个问题,得对记忆进行合理规划与维护:":{"currentFile":{"count":1,"lastUpdated":1774938677236}}},"Openclaw-workspace":{"Openclaw-workspace":{"currentFile":{"count":1,"lastUpdated":1774938879095}}},"workflow":{"workflow":{"currentFile":{"count":1,"lastUpdated":1775020352083}}},"\\AI\\Skill\\MatrixAITA-POPODocs-Skill、D":{"\\AI\\Skill\\MatrixAITA-POPODocs-Skill、D":{"currentFile":{"count":1,"lastUpdated":1776242568663}}},"推荐加在仓库内已有的标准元数据文件中,例如:":{"推荐加在仓库内已有的标准元数据文件中,例如:":{"currentFile":{"count":1,"lastUpdated":1776242909075}}},"推荐加在仓库内已有的标准元数据文件中,":{"推荐加在仓库内已有的标准元数据文件中,":{"currentFile":{"count":1,"lastUpdated":1776242914868}}},"Screenshots":{"Screenshots":{"currentFile":{"count":1,"lastUpdated":1776309732196}}},"WorkSpace":{"WorkSpace":{"currentFile":{"count":1,"lastUpdated":1776315471938}}},"VPS账号 以及PS4 DNS":{"VPS账号 以及PS4 DNS":{"internalLink":{"count":1,"lastUpdated":1776322449307}}},"G37、G37":{"G37、G37":{"currentFile":{"count":1,"lastUpdated":1776416826672}}}}

View File

@@ -0,0 +1,40 @@
一、 项目H78老乡技术支持与优化
- 性能优化与问题修复
- 美术效果分析 :与主美 释正崇(胡峰) 分析了项目存在的GUI设计、贴图压缩及PC与移动端渲染效果不统一等问题。
- LOD优化执行 为动态物体、主角及NPC制作并添加了LOD批量关闭了天空球模型的阴影投射将石墙法线贴图分辨率从2048降至256。
- 引擎Bug处理 定位并修复了多个Bug单如1595, 1597, 1599确认部分为引擎Bug。
- 渲染问题排查 :分析了树木阴影闪烁、粒子特效闪烁、贴图颜色差异等问题,并与引擎组( 扬舲(顾江涛) 、 程侃 )沟通定位。
- 项目管理与沟通
- 与 释正崇(胡峰) 沟通项目困境,共同制定 UE美术验证方案 ,计划对标竞品(如星布谷地)以证明团队能力。
- 将策划( 芝心(莫芷馨) )和主美的修改需求同步给地编 伍洛昕 。
二、 项目U5蛋仔大世界打包支持
- Android打包
- 资产与技术支持
- 指出了当日上传的模型资产存在数据损坏(模型数据为空)的问题。
三、 AIDemo
- 远程协助外派特效同学 唐国涛 解决UE插件安装与工程打开问题。
四、 项目G37炼丹炉后端开发与规划
- AI管理平台后端开发
- 架构规划 制定了包含8个阶段Phase 1-8的后端重构与开发SPEC总计约3000行。 进行进行开发。
- 协作开发 :与后端开发 阿迪亚 对接,进行代码审查、架构建议及分工梳理。为前端开发 沈林海 提供支持并解决OIDC登录配置问题。
- 项目管理 :向 阿迪亚 同步SPEC并规划工作范围需每日19:30前私信同步进度。
五、Artlib 与 启动器开发
- 启动器与资产库Artlib规划与开发
- 与 lime(李蒙恩) 协作规划启动器与资产库的集成开发。
- 目前已经完成启动器的基础开发。
- gitlab CI/CD流程实现自动打包启动器以及部署artlib。
- vps 爬虫与资产爬虫部署,并运行。
- 基础设施申请
- 申请并获得了服务器IP10.145.96.68及贵安S3存储桶 matrixaita-artlib 容量4096GB
- 获取了S3云存储密钥并申请修改OIDC的id token加密算法HS256 -> RS256
六、 AI技能与工具开发/支持
- POPO-Docs-Skill维护与推广
- 发布了Skill更新日志v4.13~4.16),新增文件上传、多维表格操作增强等功能。
- 部署了AI自动修复Issue功能并推荐给一部音频组等同事使用。
- 为 Lyra(黄家丽) 解决了Skill闪退问题为 王景威 开发了图片上传功能,为陈凤贤、虞凯、梁伟健、温逸凡解决问题。
- AI技术支持
- 为 释正崇(胡峰) 配置/修复了本地AI助手 赫尔墨斯

View File

@@ -93,4 +93,28 @@ claude_main_fix:
- **自动回帖流** - **自动回帖流**
- 脚本捕获了 Claude Code 的输出并存入 `repair_summary.txt` - 脚本捕获了 Claude Code 的输出并存入 `repair_summary.txt`
- 使用 `curl` 调用 GitLab 的 `/notes` API。`$CI_API_V4_URL``$CI_PROJECT_ID` 是 GitLab CI 内置的变量,无需手动配置。 - 使用 `curl` 调用 GitLab 的 `/notes` API。`$CI_API_V4_URL``$CI_PROJECT_ID` 是 GitLab CI 内置的变量,无需手动配置。
- **上下文读取**:为了让修复更准确,你可以在指令中加入 `Check CLAUDE.md for project guidelines`,确保 AI 遵循你在项目中定义的规范。 - **上下文读取**:为了让修复更准确,你可以在指令中加入 `Check CLAUDE.md for project guidelines`,确保 AI 遵循你在项目中定义的规范。
# POPO 云文档 Skill 更新日志4.15 ~ 4.16
**新功能**
1. 文件上传与下载
- 现在可以直接通过 Skill 上传文件PDF、Excel、图片等到个人空间或团队空间
- 也可以下载个人空间和团队空间中的文件,获取下载链接
- 上传前会自动检查剩余容量,避免空间不足
2. 登录状态自动检测
- 启动登录浏览器后Skill 会自动检测你是否已经登录成功
- 已登录则直接开始工作,不再需要手动告诉 AI "我登录了"
- 未登录时才会提示你去登录,体验更流畅
3. 多维表格操作增强
- 新增查看数据表列表、读取数据表完整内容、创建新数据表的能力
- 之前只能写入数据,现在可以先查看再操作
4. 灵犀表格完整快照
- 新增完整工作簿快照功能,可以一次获取所有页签的数据,包含行高、列宽等格式信息
**问题修复**
1. 导出功能修复
- 修复了文档导出(导出为 PDF 等格式)时可能失败的问题
2. 凭证管理优化
- Cookie 和 API 密钥现在统一存储在本地数据库中,更安全可靠
- 登录采集速度提升(等待时间从 5 秒缩短到 2.5 秒)

View File

@@ -188,19 +188,60 @@
>以上作废 >以上作废
# # 提示词 # 提示词
请你说中文,并使用中文编写文档。 请你说中文,并使用中文编写文档。
## 功能 ## 需求
1. 开发要求
1. 简单的账户登录机制, 并且提供OpenID登录方式 1. 在保证相关接口不变的情况下,重构./backend 中的服务端
2. 根据需求迭代./frontend 中的前端。
1. .\frontend\src\features\workflow-editor 是WorkFlow节点面板不需要进行任何修复这个是其他人开发的但需要分析好接口主要有WorkFlow序列化/反序列化、所有节点序列化/反序列化、同步信息等。
2. 鉴权
1. 简单账号密码登录预留OIDC登录相关接口。
2. 登录页面,需要截图参考。
3. 工作区(WorkSpace) WorkFlow 序列化 & 同步。
1. WorkSpace
1. 每个用户可能拥有多个WorkSpace每个Workspace拥有多个WorkFlow。
2. WorkFlow
1. WorkFlow 流水线线号码、名称、工作流状态(原话设定、三视图、模型生成……)、创建人、参与人员
2. 节点相关信息
1. 节点公共信息Position、折叠等。
2. 节点特有信息。
3. 同事导出了一份分析报告./docs/web/workflow-node-panel-guide.md你可以参考一下。
4. 资产库
1. 相关资产的对象存储。各种图片、模型。
2. 可以针对通过标签 过滤显示不同类型的资产。
3. 可以根据文件名、WorkSpace、WorkFlow名进行检索。
4. 在资产库点击项可以进行资产预览,模型、图片。
5. 任务排队系统
1. 根据节点使用AI API的情况AIGW、管理员设置的第三方AI API、用户设置自己的AI API将任务分配对对应的任务池。
2. 构建一个Worker Pool每个WorkFlow使用一个主worker进行管理。
1. WorkFlow执行相关
1. 哪些节点是可以并行执行的?哪些节点是串行执行的?
2. WorkFlow的执行状态原话设定、三视图、模型生成、模型拆分、模型组装等这些状态可以在管理员后台进行添加与定制。
3. 分配SubWorker来执行节点定义的操作。执行完之后将相关信息返回给主Worker并将信息写入数据库资产写对象存储服务并将资产信息写入数据库中。
2. 每个节点的执行状态。(待命、执行中、执行成功、执行失败)
3. 管理员后台可以看到各个类型任务的排队情况。
6. AI API & 计费系统
1. 接入各种外部供应商API提供各种模型、URL管理员与用户只需要提供API Key或者API Token就可以完成配置。
2. Netease AIGW 参考 后续章节 AIGW文档。
3. 在用户设置页面添加AI API、Netease AIGW设置页面、以及 剩余积分 / 总共积分。
4. 实现可配置的计费系统。
1. 用户使用管理员配置的AI API就需要计算费用。
2. 在管理员的管理后台可以设置AI API的积分方式。
3. 第三方 AI服务商的API根据他们的文档信息设置计算方法。
4. AIGW相关费用计算参考 Netease AIGW 文档。
7. 部署方式与信息
1. VPS SSH的方式信息之后再填写。
2. 采用Docker Compose以容器的方式部署。
3. 对象存储采用采用公司的S3对象存储服务具体信息之后填写。
4. 数据库先采用VPS Docker部署的 之后会迁移到公司提供的云数据库服务。
## 技术选型 ## 技术选型
我打算使用: 前端技术:沿用现有技术框架。
前端技术TypeScript、Vue 3、Vite前端组件请使用Element Plus使用pnpm install element-plus 进行安装。
后端技术nodejs、Fastify、Mongoose、fastify-jwt 后端技术nodejs、Fastify、Mongoose、fastify-jwt
数据库MongoDB 数据库MongoDB帮我确定是否有必要干掉SQL服务器
工具函数Axios、VueUse、pnpm 工具函数Axios、pnpm
文档管理Obsidian Cli 工程文档管理Obsidian Cli
## 文档目录结构 ## 文档目录结构
- docs - docs
@@ -209,29 +250,12 @@
- Web前端相关文档。 - Web前端相关文档。
- Server后端相关文档。 - Server后端相关文档。
# 其他
# 需求 ## Netease OIDC信息
1. 在保证相关接口不变的情况下,重构./backend 中的服务端。 | | |
2. 根据需求迭代./frontend 中的前端。 | ------------- | ---------------------------------------------------------------- |
| client id | 4884b03e951711f0ad370242ac120002 |
| client secret | f2862b8c5ab24085ab0883d119b631604884b354951711f0ad370242ac120002 |
3. 鉴权
1. 简单账号密码登录预留OIDC登录相关接口。
2. 登录页面,需要截图参考。
4. WorkSpace WorkFlow 序列化 & 同步。
1. 多个WorkFlow信息与显示前端页面
2. WorkFlow 流水线线号码、名称、工作流状态(原话设定、三视图、模型生成……)、创建人、参与人员
3. 节点相关信息
1. commonPosition、折叠、节点任务进度。
2. 具体信息。
4. 相关资产的对象存储。各种图片、模型。
5. WorkFLow任务派发、排队、执行系统。
6. AI API计费系统
1. API供应商、AIGW接入。
2. 计费公式。
7. 管理后台。
## OIDC 参考代码 ## OIDC 参考代码
```python ```python
#coding:UTF-8 #coding:UTF-8
@@ -445,4 +469,127 @@ if __name__ == "__main__":
PYTHON_OIDC_DEMO.secret_key = "this is a random secret" PYTHON_OIDC_DEMO.secret_key = "this is a random secret"
PYTHON_OIDC_DEMO.debug = True PYTHON_OIDC_DEMO.debug = True
PYTHON_OIDC_DEMO.run(host=host, port=port) PYTHON_OIDC_DEMO.run(host=host, port=port)
``` ```
# AI模型
流程常用的AI模型
VLM-Gemini+WD14反推2D-liblib+nanobananapro3D-Tripo P1UV-HunyuanCDN-Filepickerseedream4.5/5.0 和 Tripo / Meshy / Hunyuan/ Rodin / HItem3D
## 其他AI API 提供商
你通过google搜索以及其他搜索SKill帮我收集信息。
- 字节 火山引擎、seedream、seeddance
- 腾讯 混元
- Google Gemini
- Chatgpt
- Tripo
- 阿里千问
## AIGW文档
- https://aigw.doc.nie.netease.com/
请打开浏览器进行阅读1.5~1.9章节,该网站需要登录,我会帮你登录,登录完会和你说我已经登录了。
支持的模型参考:
- https://docs.popo.netease.com/team/pc/hnnkwy_g/pageDetail/1e40f09ebff54d7b8377459b5e18e7b0?popo_locale=zh&appVersion=4.32.0&deviceType=0&popolocale=zh-CN&popo_hidenativebar=1&popo_noindicator=1&xyz=1747036937996&tab=0&disposable_login_token=1&xyz=1776331056585
将相关信息放到./docs/AIProvider 下,并且编写文档。
## 部署
将服务部署到VPS上使用Docker Compose进行部署。部署前先检查docker 容器情况,保证不会影响到其他服务。
ssh -p 32200 -i C:\Users\loujiajie\.ssh\netease_loujiajie_id_rsa loujiajie@10.145.96.67
S3 对象服务信息
- NOS 桶信息
- 名称matrixaita
- 项目artct
- 成本项目artct
- 区域GA
- Endpointgzdev
- 桶用户p-artct-matrixaita
- 域名(内网):`nos-gzdev.163nos.com`
相关资产放到 AssetMaker/ 目录后面
---
# 临时需求
1. 添加账号:
1. 账号G37
2. 密码G37
2. 添加账号单点登录功能其他电脑登录后会让当前电脑登录直接失效并且退回登录页面。给G37 单点登录。
新建远程开发模式,服务器为
IP:10.219.36.57
用户名netease
密码123
使用SSH来部署前后端之后继续开发目前怀疑VPS的容器网络纯在问题使用本地另一台机器作为开发服务器进行测试
---
# Blender节点需求
- 文档:https://docs.popo.netease.com/team/pc/ysai/pageDetail/4a88b0e6d806462589e01a13f3f90cff?appVersion=4.41.0&deviceType=0&popolocale=zh-CN&popo_hidenativebar=1&popo_noindicator=1&disposable_login_token=1
- Blender 4.4.2
1. 部署Blender
1. Ubuntu/Linux系统使用Docker来部署Blender 4.4.3 https://hub.docker.com/layers/linuxserver/blender/4.4.3/images/sha256-887027bed43b2488875591edc031545cd17f6bdf31e511a902c497f77bba09af
2. Windows系统下载与安装Blender 4.4.2 https://download.blender.org/release/Blender4.4/blender-4.4.2-windows-x64.zip
2. 安装 uvpackmaster安装方法参考 uvpackmaster 安装文档
1. Engine位于./blender/UVPackmaster 4 v4.0.2/
1. linuxuvpm-engine-pro-4.0.2-linux-x86_64.run
2. windowsuvpm-engine-pro-4.0.2-windows-x64.exe
2. Blender插件./blender/UVPackmaster 4 v4.0.2/uvpackmaster4-addon-4.0.2.zip
3. 安装插件,位于./blender
1. asset_organize_addon.zip
2. batch_uv_pack_addon.zip
3. explode_bake_addon.zip
## uvpackmaster 安装文档
### Linux[](https://uvpackmaster.com/doc4/blender/latest/10-uvpackmaster-setup/#linux "Linux")
Follow the steps:
1. If you are upgrading from an older UVPackmaster version, go to Blender preferences and uninstall the previous version of the UVPackmaster add-on. **After uninstalling, it is strongly recommended to restart Blender once, otherwise an error may occur when installing a new add-on version.**
2. Download the latest version of the UVPackmaster add-on for Blender from the marketplace where you purchased the packer (the add-on file name starts with uvpackmaster4-addon) and has zip extension.
3. Install the add-on using [the standard procedure for Blender add-ons](https://docs.blender.org/manual/en/latest/editors/preferences/addons.html).
4. Purchase a license for the 4 engine at Gumroad or Blender Market (visit the [Get UVPackmaster](https://uvpackmaster.com/for-blender/get-uvpackmaster/) page for details). Note that the engine is required to use the add-on packing features in Blender. After purchasing, download the UVPackmaster installer script from the marketplace. The name of the script follows a pattern: uvpm-engine-pro-{VERSION}-linux-x86_64.run. Make sure you use the correct engine version  **there must be a match between the add-on version and the engine version**. Also make sure your browser wont open the engine installer script on its own when you click at it in the marketplace library. **Do not save the script opened in such a way**. Instead, press the right mouse button on the engine script in the marketplace library and choose Save the link as.
5. After downloading, run the installer script in the terminal. First you need to add the execute permission to it:
```Cmd
chmod u+x uvpm-engine-pro-{VERSION}-linux-x86_64.run
```
6. Then run the script:
```Cmd
./uvpm-engine-pro-{VERSION}-linux-x86_64.run
```
7. The default extract location used by the script is /opt/uvpackmaster/engine4, but you can change it if you like using a command line argument. Changing the path is not recommended though, because the UVPackmaster addon will be able to automatically detect the engine, if it is extracted into the default path - no additional setup steps will be required. Note you will need root privilege to extract the engine into the default location on most Linux distributions. In order to run the installer script with root privilege, execute it using sudo:
```Cmd
sudo ./uvpm-engine-pro-{VERSION}-linux-x86_64.run
```
8. The engine installer script will display the EULA - you need to accept it in order to continue installation. On some Linux distributions there is a bug causing the license agreement question not to be printed after the end of the EULA is reached. If you dont see the question at the end of the EULA, simply press the Q button - after the button is pressed the question should be displayed normally.
9. Run Blender (or restart if you had it opened). Go to the N panel of the UV editor you will find the UVPackmaster4 tab there. If you extracted the engine into the default path, at the top of the tab you should see a label reporting that the UVPackmaster engine was automatically detected by the add-on. You can immediately start using UVPackmaster features in Blender - the setup is done. If you changed the engine path, then proceed to the additional steps below.
10. In Blender go to: Edit Menu  Preferences  Add-ons → find the UVPackmaster4 addon on the list of all addons. Expand the UVPackmaster4 addon entry - you will see a UI with the addon global preferences. In the UI press the Set Engine Path button - a file browser window will appear. In the file browser navigate to the location where you extracted the engine and localize a file named release-{VERSION}.uvpmi  select the file in the browser. **Caution**: do not go into any subfolder of the extracted engine folder you have to select the uvpmi file which is located in the main folder of the engine. After the uvpmi file is selected in the browser, you should notice a status message saying that the engine was initialized.
11. Save the Blender preferences to make the engine path permanent: click on the 3-bar icon in the bottom-left corner of the Blender preferences window and press Save Preferences. You can start using UVPackmaster features in Blender - the setup is done.
## 节点参考
参考代码目录.\blender\ldl-maker-api-master相关Blender节点为
| | | |
| -------------------- | --- | -------------------------------------- |
| **Blender Bake** | | `backend/scripts/start_bake_server.py` |
| **Blender UV Pack** | | `start_uv_pack_server.py` |
| **Blender Organize** | | `start_organize_server.py` |
---
TODO:
# 保底与开发方案
- [ ] 单点登录实现
- [ ] Project、WorkSpace、Workflow持久化。
- [x] 使用楼嘉杰入职电脑部署服务来规避开发机房VPS的网络问题数据库服务都部署到入职电脑上。
- [ ] 楼嘉杰根据沈林海编写的节点代码实现持久化。
- [ ] Blender
- [ ] 使用Freddy电脑部署钊铭Blender的服务本地可以SSH连接方便AI进行调试。
- [ ] 楼嘉杰通过UU让钊铭进行远程部署。
实现一个单点登录功能,任何一个实体、网页登录之后都会让相同用户其他端的掉线,并且跳转到登录页面。

View File

@@ -0,0 +1,290 @@
# IP
- TA.Netease.com
- SSH10.145.96.67:32200
- ssh -p 32200 -i C:\Users\loujiajie\.ssh\netease_loujiajie_id_rsa loujiajie@10.145.96.67
- Artlib
- SSH10.145.96.68:32200
- ssh -p 32200 -i C:\Users\loujiajie\.ssh\netease_loujiajie_id_rsa loujiajie@10.145.96.68
- Artlib S3
- NOS 桶信息
- 名称matrixaita
- 项目artct
- 成本项目artct
- 区域GA
- Endpointgzdev
- 桶用户p-artct-matrixaita
- 域名(内网):`nos-gzdev.163nos.com`
- Access Key57SCV9Q4MPLXQ3JCL5K9
- Secret Key4dzMcakyxW2vEhCGjEfiXHtDgxZUiy57D9NqKOOm
VPS_SSH_KEY
## 文档
- S3:https://sa.nie.netease.com/console/webconsole/idc/
# 垃圾电脑服务
我现在想在局域网里的另一台Ubuntu电脑上部署Unreal Horde服务存储 缓存以及管理各个worker、节点信息本机性能强劲作为worker进行具体工作。
- 电脑ip10.219.36.57
- 用户名netease
- 密码123
官方文档UE5.5
- https://dev.epicgames.com/documentation/zh-cn/unreal-engine/horde-in-unreal-engine?application_version=5.5
- Horde README.md https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Programs/Horde/README.md
- [**Deploying Horde**](https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Programs/Horde/Docs/Deployment.md)
- - 有关 Horde 的架构和组件的信息,以及部署它们的最佳实践。
**受众:** IT、系统管理员、打算修改 Horde 的程序员。
- [**Configuring and Operating Horde**](https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Programs/Horde/Docs/Config.md)
- - 描述如何设置和管理 Horde。
**受众:**构建/开发运营团队、管理员。
- [**Horde Internals**](https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Programs/Horde/Docs/Internals.md)
- - 描述如何构建和修改 Horde 及其架构。
**受众:**希望扩展 Horde 的开发人员。
- 视频
- [Horde and Unreal Build Accelerator: Operating at Epic Scale](https://youtu.be/ZUlwqNbYWBQ?si=DgFvrvepK67v-iTi)
## 下载地址
- 官方下载地址
- 服务端:https://github.com/EpicGames/UnrealEngine/releases/download/5.5.0-release/UnrealHordeServer.msi
# 大致步骤
1. 使用docker部署服务。
2. 服务器配置。
1. 默认端口Http 13340、Http 2 13342。
1. 默认情况下Horde配置为使用端口5000通过未加密的HTTP提供数据。在默认情况下代理通过端口5002使用未加密的HTTP/2上的gRPC与Horde服务器通信。这些设置在服务器启动时显示在控制台上。
2. [相关配置](https://dev.epicgames.com/documentation/zh-cn/unreal-engine/horde-orientation-for-unreal-engine?application_version=5.5)
- [服务器配置](https://dev.epicgames.com/documentation/zh-cn/unreal-engine/horde-settings-for-unreal-engine?application_version=5.5#%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E7%BD%AE)将配置该服务器与其他服务器的通信,定义静态参数等。它由与该服务器一同部署的 `Server.json` 文件驱动。
- [完整配置参数清单](https://dev.epicgames.com/documentation/zh-cn/unreal-engine/horde-settings-for-unreal-engine?application_version=5.5#%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E7%BD%AE)
- [全局配置](https://dev.epicgames.com/documentation/zh-cn/unreal-engine/horde-schema-for-unreal-engine?application_version=5.5#globals)在部署后控制所有面向用户的元素,该配置存于名为 `Globals.json` 的文件中。设置好部署参数后,大多数配置都在此处完成。
3. [验证相关配置](https://dev.epicgames.com/documentation/zh-cn/unreal-engine/horde-authentication-tutorial-for-unreal-engine?application_version=5.5)
1. [[#OIDC身份验证]]
3. 代理机配置。详见 http://10.219.103.35:13340/docs/Landing.md
1. 配置文件位置:安装目录\Agent\Defaults\agent.json
2.
# 部署笔记
## 部署流程
- [Horde服务器](https://dev.epicgames.com/documentation/zh-cn/unreal-engine/horde-server-for-unreal-engine?application_version=5.5)
# Perforce服务器
ssl:inner02-commit.perforce.nie.netease.com:1667
# OIDC
## Netease OIDC信息
| | |
| ------------- | ---------------------------------------------------------------- |
| client id | 4884b03e951711f0ad370242ac120002 |
| client secret | f2862b8c5ab24085ab0883d119b631604884b354951711f0ad370242ac120002 |
## OIDC 参考代码
```python
#coding:UTF-8
"""
Requirements:
1. Flask >= 0.10.1
2. requests
3. jwkest >= 1.1.7
Usage:
python oidc_code_demo.py -H {listen_address} -p {listen_port}
Help:
python oidc_code_demo.py -h
"""
import os
import uuid
from hashlib import md5
import datetime
from urllib import urlencode
import json
import requests
from flask import Flask, request, jsonify, session, redirect
from jwkest.jwk import SYMKey
from jwkest.jws import JWS
from jwkest.jwk import load_jwks_from_url
from jwkest.jws import NoSuitableSigningKeys
__revision__ = "0.01"
__author__ = "chenxs@corp.netease.com"
OIDC_CLIENT_ID = ""
OIDC_CLIENT_SECRET = ""
OIDC_PROVIDER = "https://login.netease.com/connect"
OIDC_AUTHORIZATION_SERVER = "https://login.netease.com/connect/authorize"
OIDC_TOKEN_ENDPOINT = "https://login.netease.com/connect/token"
OIDC_USERINFO_ENDPOINT = "https://login.netease.com/connect/userinfo"
OIDC_SCOPE = "openid nickname email fullname dep title empno"
OIDC_REDIRECT_URI = "https://127.0.0.1:5000/finish"
OIDC_JWKS_URI = "https://login.netease.com/connect/jwks"
OIDC_ALG = "HS256"
PYTHON_OIDC_DEMO = Flask(__name__)
@PYTHON_OIDC_DEMO.route("/", methods=['GET'])
def index():
"""index"""
if 'username' in session:
body = (
u"</br><h2>OpenID Connect 鐧诲綍鎴愬姛銆<E5A79B></h2></br>"
u"鎮ㄧ殑鐢ㄦ埛鍚嶆槸锛<EFBFBD>%s</br>"
u"鎮ㄧ殑鍏ㄥ悕鏄細%s</br>"
u"鎮ㄧ殑閭鏄細%s</br>"
u"鎮ㄧ殑鑱屼綅鏄細%s</br>"
u"鎮ㄧ殑閮ㄩ棬鏄細%s</br>"
u"鎮ㄧ殑宸ュ彿鏄細%s</br>") % (
session['username'], session.get('fullname', ''),
session.get('email', ''), session.get('title', ''),
session.get('dep', ''), session.get('empno', ''))
body += u"<a href='/login'>鎴虫垜閲嶆柊鐧诲綍</a>"
return body
else:
return u"<a href='/login'>鎴虫垜鐧诲綍</a>"
@PYTHON_OIDC_DEMO.route("/login", methods=['GET'])
def login():
"""AuthN Request"""
session.clear()
now = datetime.datetime.now().strftime("%s")
session['uid'] = uuid.uuid4().hex
session['state'] = session['uid']
session['nonce'] = md5(session['uid'] + now).hexdigest()
authn_request_params = {
'response_type': 'code',
'client_id': OIDC_CLIENT_ID,
'state': session['state'],
'nonce': session['nonce'],
'scope': OIDC_SCOPE,
'redirect_uri': OIDC_REDIRECT_URI,
#'prompt': 'login',
'display': 'touch',
}
redirect_url = "?".join([
OIDC_AUTHORIZATION_SERVER, urlencode(authn_request_params)])
return redirect(redirect_url)
def token_request(code):
"""2. Token Request"""
params = {
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': OIDC_REDIRECT_URI,
'client_id': OIDC_CLIENT_ID,
'client_secret': OIDC_CLIENT_SECRET,
}
_resp = requests.post(OIDC_TOKEN_ENDPOINT, data=params)
return json.loads(_resp.text)
def id_token_verify(id_token, nonce=None):
"""3. id token verify"""
now = int(datetime.datetime.now().strftime("%s"))
if OIDC_ALG == "HS256":
signed_keys = [SYMKey(key=OIDC_CLIENT_SECRET)]
else:
signed_keys = load_jwks_from_url(OIDC_JWKS_URI)
try:
plain_id_token = JWS().verify_compact(id_token, signed_keys)
except NoSuitableSigningKeys:
# logger the id_token please
return {'error': 'can not verify the id token'}
print "idtoken: %s" % plain_id_token
if nonce:
if (not plain_id_token.has_key('nonce')) or (
plain_id_token['nonce'] != nonce):
return {'error': 'id token nonce not correct'}
if plain_id_token['iss'] != OIDC_PROVIDER:
return {'error': 'id token iss not correct'}
if plain_id_token['aud'] != OIDC_CLIENT_ID:
return {'error': 'id token aud not correct'}
if now >= int(plain_id_token['exp']):
return {'error': 'id token expired'}
return {'id_token': plain_id_token}
@PYTHON_OIDC_DEMO.route("/finish", methods=['GET'])
def finish():
"""
1. AuthN Response
2. Token Request
3. id token verify
4. userinfo request
5. login user
"""
# 1. AuthN Response
try:
code = request.args.get('code')
if session['state']:
state = request.args.get('state')
if state != session['state']:
return u"闈炴硶璇锋眰"
except ValueError:
return u"闈炴硶璇锋眰"
# 2. Token Request
token = token_request(code)
print "token: %s" % token
if token.has_key('error'):
return u"鍑洪敊浜嗭細%s" % str(token)
# 3. id token verify
id_token_verified = id_token_verify(token['id_token'])
if id_token_verified.has_key('error'):
return id_token_verified['error']
else:
id_token = id_token_verified['id_token']
print "id_token: %s" % id_token
# 4. userinfo request
_req_session = requests.Session()
_req_session.headers.update({
"Authorization": "Bearer %s" % token['access_token']})
userinfo_req = _req_session.get(OIDC_USERINFO_ENDPOINT)
userinfo = json.loads(userinfo_req.text)
# login the user
session['username'] = userinfo['nickname']
session['email'] = userinfo['email']
session['title'] = userinfo.get('title', '')
session['empno'] = userinfo.get('empno', '')
session['dep'] = userinfo.get('dep', '')
session['fullname'] = userinfo.get('fullname', '')
return redirect("/")
if __name__ == "__main__":
import sys
import argparse
parser = argparse.ArgumentParser(
usage='%(prog)s [options]', version='%(prog)s ' + str(__revision__))
parser.add_argument(
'-H', '--host', dest='host', type=str,
help="Specify listening adress, default is 127.0.0.1")
parser.add_argument(
'-p', '--port', dest='port', type=int,
help="Specify listening port, default is 5000")
parser.add_argument(
'-c', '--client_id', dest='client_id', type=str,
help="oidc client_id is required.")
parser.add_argument(
'-s', '--client_secret', dest='client_secret', type=str,
help="oidc client_secret is required.")
args = parser.parse_args()
host = args.host or '127.0.0.1'
port = args.port or 5000
OIDC_REDIRECT_URI = "http://%s:%s/finish" % (host, port)
OIDC_CLIENT_ID = args.client_id
OIDC_CLIENT_SECRET = args.client_secret
if not OIDC_CLIENT_ID or not OIDC_CLIENT_SECRET:
parser.print_help()
parser.exit()
PYTHON_OIDC_DEMO.secret_key = "this is a random secret"
PYTHON_OIDC_DEMO.debug = True
PYTHON_OIDC_DEMO.run(host=host, port=port)
```

View File

@@ -90,4 +90,4 @@ graphify . /path/to/external/ue_source --output ./unified_graph
- **Search Rule:** If a class prefix is 'U', 'A', or 'F' and not found in the current project, use the `search_ue_engine_graph` tool via MCP. - **Search Rule:** If a class prefix is 'U', 'A', or 'F' and not found in the current project, use the `search_ue_engine_graph` tool via MCP.
``` ```
这样可将外部目录转变为**只读远程知识库**——既保证响应速度,又扩展知识边界。 这样可将外部目录转变为**只读远程知识库**——既保证响应速度,又扩展知识边界。