From cef89547a66df8f9ec955eb290e39888444e10bc Mon Sep 17 00:00:00 2001 From: Docker7530 <121306237+Docker7530@users.noreply.github.com> Date: Tue, 10 Mar 2026 10:20:27 +0800 Subject: [PATCH] 1773109225 --- .obsidian/community-plugins.json | 1 - .../plugins/copy-url-in-preview/data.json | 6 - .obsidian/plugins/copy-url-in-preview/main.js | 9 - .../plugins/copy-url-in-preview/manifest.json | 11 - .../plugins/recent-files-obsidian/data.json | 88 ++++---- .obsidian/workspace.json | 72 ++++--- calendar/diary/2026-03-08.md | 9 + calendar/diary/2026-03-09.md | 14 ++ calendar/diary/2026-03-10.md | 9 + calendar/weeks/2026-W10.md | 1 + .../ai/prompts/Prompt 公司智能体.md | 0 resource/前端/React 工程师.md | 72 ------- .../前端/如何成为一个 React 工程师呢?.md | 192 ++++++++++++++++++ work/移动杭研/AI 项目/IBS 智能体-v3.md | 60 ------ work/移动杭研/AI 项目/IBS 智能体-v4.md | 44 ---- .../AI 项目/IBS 智能体具体落实技术方案.md | 6 +- work/移动杭研/AI 项目/MCP Prompt.md | 24 --- ...bs-ai 项目 AI 对话流程.md => ibs-ai 项目梳理.md} | 0 ...md => 图纸-IBS 智能体-v1-流量查询 demo 对象存储.md} | 0 ...体-v1.md => 图纸-IBS 智能体-v1-流量查询 demo.md} | 0 ...-v5.md => 图纸-IBS 智能体-v2-项目架构 原生 MCP.md} | 0 .../AI 项目/图纸-IBS 智能体-v3-项目架构.md | 54 +++++ 22 files changed, 364 insertions(+), 308 deletions(-) delete mode 100644 .obsidian/plugins/copy-url-in-preview/data.json delete mode 100644 .obsidian/plugins/copy-url-in-preview/main.js delete mode 100644 .obsidian/plugins/copy-url-in-preview/manifest.json create mode 100644 calendar/diary/2026-03-08.md create mode 100644 calendar/diary/2026-03-10.md create mode 100644 calendar/weeks/2026-W10.md rename work/移动杭研/AI 项目/公司智能体.md => resource/ai/prompts/Prompt 公司智能体.md (100%) delete mode 100644 resource/前端/React 工程师.md create mode 100644 resource/前端/如何成为一个 React 工程师呢?.md delete mode 100644 work/移动杭研/AI 项目/IBS 智能体-v3.md delete mode 100644 work/移动杭研/AI 项目/IBS 智能体-v4.md delete mode 100644 work/移动杭研/AI 项目/MCP Prompt.md rename work/移动杭研/AI 项目/{ibs-ai 项目 AI 对话流程.md => ibs-ai 项目梳理.md} (100%) rename work/移动杭研/AI 项目/{IBS 智能体-v2.md => 图纸-IBS 智能体-v1-流量查询 demo 对象存储.md} (100%) rename work/移动杭研/AI 项目/{IBS 智能体-v1.md => 图纸-IBS 智能体-v1-流量查询 demo.md} (100%) rename work/移动杭研/AI 项目/{IBS 智能体-v5.md => 图纸-IBS 智能体-v2-项目架构 原生 MCP.md} (100%) create mode 100644 work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 8b2c7bf..a42302d 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -6,7 +6,6 @@ "recent-files-obsidian", "oz-clear-unused-images", "obsidian-excalidraw-plugin", - "copy-url-in-preview", "templater-obsidian", "obsidian-linter" ] \ No newline at end of file diff --git a/.obsidian/plugins/copy-url-in-preview/data.json b/.obsidian/plugins/copy-url-in-preview/data.json deleted file mode 100644 index 2a677ce..0000000 --- a/.obsidian/plugins/copy-url-in-preview/data.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "middleClickNewTab": false, - "revealInNavigation": true, - "enableDefaultOnCanvas": false, - "pdfMenu": false -} \ No newline at end of file diff --git a/.obsidian/plugins/copy-url-in-preview/main.js b/.obsidian/plugins/copy-url-in-preview/main.js deleted file mode 100644 index 4d2892c..0000000 --- a/.obsidian/plugins/copy-url-in-preview/main.js +++ /dev/null @@ -1,9 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -"use strict";var g=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var W=Object.prototype.hasOwnProperty;var $=(t,i,e)=>i in t?g(t,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[i]=e;var j=(t,i)=>{for(var e in i)g(t,e,{get:i[e],enumerable:!0})},G=(t,i,e,n)=>{if(i&&typeof i=="object"||typeof i=="function")for(let o of _(i))!W.call(t,o)&&o!==e&&g(t,o,{get:()=>i[o],enumerable:!(n=R(i,o))||n.enumerable});return t};var H=t=>G(g({},"__esModule",{value:!0}),t);var d=(t,i,e)=>$(t,typeof i!="symbol"?i+"":i,e);var V={};j(V,{default:()=>w});module.exports=H(V);var p=require("obsidian");var m=require("obsidian");var S={middleClickNewTab:!0,revealInNavigation:!0,enableDefaultOnCanvas:!1},f=class extends m.PluginSettingTab{constructor(e,n){super(e,n);d(this,"plugin");this.plugin=n}display(){let{containerEl:e}=this;e.empty(),e.createEl("h3",{text:"Image Context Menus settings"}),new m.Setting(e).setName("Middle mouse click on image link to open in new tab").addToggle(n=>{n.setValue(this.plugin.settings.middleClickNewTab).onChange(o=>{this.plugin.settings.middleClickNewTab=o,this.plugin.saveSettings()})}),new m.Setting(e).setName("Reveal file in navigation menu item").setDesc("You might want to disable this if you use a plugin for replacing default Obsidian file navigation. This plugin supports File Tree Alternative by displaying a reveal menu item for it if installed.").addToggle(n=>{n.setValue(this.plugin.settings.revealInNavigation).onChange(o=>{this.plugin.settings.revealInNavigation=o,this.plugin.saveSettings()})}),new m.Setting(e).setName("Enable regular context menu on canvas").setDesc(`The regular context menu sometimes duplicates the context menu on the canvas, so it's disabled there by default. -There is a separate context menu for images directly on the canvas, but if that's not enough (for example for images in notes on canvas), you can enable the regular context menu here too.`).addToggle(n=>{n.setValue(this.plugin.settings.enableDefaultOnCanvas).onChange(o=>{this.plugin.settings.enableDefaultOnCanvas=o,this.plugin.saveSettings()})})}};function y(t){return t=new URL(t),t.search="",t.toString()}function b(t,i){let e=new Promise(n=>setTimeout(()=>{n(null)},t));return Promise.race([i,e])}function I(t,i,e,n,o){return t.on(i,e,n,o),()=>{t.off(i,e,n,o)}}var C=require("obsidian");var F=require("obsidian");var T=5e3;async function D(t){try{if(t.type!=="image/svg+xml")return await navigator.clipboard.write([new ClipboardItem({[t.type]:t})]),!0}catch(i){console.warn("Failed copying image with original mimetype, using PNG fallback - ",i)}try{return t=new Blob([t],{type:"image/png"}),await navigator.clipboard.write([new ClipboardItem({[t.type]:t})]),!0}catch(i){console.warn("Failed copying image with PNG mimetype - ",i)}return!1}async function B(t,i){if(t instanceof F.TFile){let o=new Blob([await t.vault.readBinary(t)],{type:`image/${t.extension}`});return i(o)}let e=`https://api.allorigins.win/raw?url=${encodeURIComponent(t)}`,n=[()=>U(t),()=>U(e),()=>b(T,M(t)),()=>b(T,M(e))];for(let o of n){let r=await o();if(r&&await i(r))return!0}return!1}async function U(t){try{return await(await fetch(t,{signal:AbortSignal.timeout(T)})).blob()}catch(i){console.warn("Failed to fetch image - ",i)}return null}async function M(t){return new Promise(i=>{let e=new Image;e.crossOrigin="anonymous",e.onload=()=>{let n=document.createElement("canvas");n.width=e.width,n.height=e.height,n.getContext("2d").drawImage(e,0,0),n.toBlob(o=>{i(o)})},e.onerror=()=>{i(null)},e.src=t})}function h(t){let i=["avif","bmp","gif","jpg","jpeg","png","svg","webp","heic"];return t=t.toLowerCase(),i.some(e=>t.endsWith(`.${e}`))}async function u(t){await B(t,D)?new C.Notice(i18next.t("interface.copied_generic"),1800):new C.Notice(i18next.t("Failed to copy image to clipboard"),1800)}var L=require("obsidian"),O=["file","open","info","system"],x={"copy-url":{section:"info",icon:"link",title:"interface.menu.copy-url"},"copy-to-clipboard":{section:"info",icon:"image-file",title:"interface.label-copy"},"open-in-new-tab":{section:"open",icon:"file-plus",title:"interface.menu.open-in-new-tab"},"open-in-default-app":{section:"system",icon:"arrow-up-right",title:"plugins.open-with-default-app.action-open-file"},"show-in-explorer":{section:"system",icon:"arrow-up-right",title:`plugins.open-with-default-app.action-show-in-folder${L.Platform.isMacOS?"-mac":""}`},"reveal-in-navigation":{section:"system",icon:"folder",title:"plugins.file-explorer.action-reveal-file"},"reveal-in-navigation-tree":{section:"system",icon:"folder",title:"Reveal in File Tree Alternative"},"rename-file":{section:"info",icon:"pencil",title:"interface.menu.rename"}};function l(t,i){return t.setSection(x[i].section).setIcon(x[i].icon).setTitle(i18next.t(x[i].title))}var A=require("obsidian");function P(t,i){let e=(0,A.normalizePath)(t.vault.adapter.basePath);e=e.replace("file://","");let n=i.pathname;n=n.replace("/_capacitor_file_",""),n=n.split("/").filter(r=>r!=="").join("/");let o=decodeURI(n);if(o.startsWith(e)){let r=o.slice(e.length+1);return t.vault.getFileByPath(r)}return null}function v(t,i){t.workspace.getLeaf(!0).openFile(i,{active:!0})}var w=class extends p.Plugin{constructor(){super(...arguments);d(this,"canvasCardMenu");d(this,"settings")}async loadSettings(){this.settings=Object.assign({},S,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}async onload(){await this.loadSettings(),this.addSettingTab(new f(this.app,this)),this.registerDocument(document),this.app.workspace.on("window-open",(e,n)=>{this.registerDocument(n.document)}),this.registerEvent(this.app.workspace.on("file-menu",(e,n,o)=>{o==="canvas-menu"&&n instanceof p.TFile&&h(`.${n.extension}`)&&(e.addItem(r=>l(r,"open-in-new-tab").onClick(()=>{v(this.app,n)})),e.addItem(r=>l(r,"copy-to-clipboard").onClick(()=>{u(n)})))})),this.registerEvent(this.app.workspace.on("canvas:node-menu",(e,n)=>{let o=n.unknownData;if(o.type==="link"){let r=y(o.url);if(!h(r))return;e.addItem(s=>l(s,"copy-to-clipboard").setSection("canvas").onClick(()=>{u(r)}))}})),this.registerEvent(this.app.workspace.on("url-menu",(e,n)=>{n=y(n),h(n)&&e.addItem(o=>l(o,"copy-to-clipboard").onClick(()=>{u(n)}))}))}registerDocument(e){let n=[I(e,"contextmenu","img",this.onImageContextMenu.bind(this),{capture:!0}),I(e,"mouseup","img",this.onImageMouseUp.bind(this))];this.register(()=>{for(let o of n)o()})}onImageContextMenu(e){var k;if(!this.settings.enableDefaultOnCanvas&&((k=this.app.workspace.getActiveFile())==null?void 0:k.extension)==="canvas")return;e.preventDefault();let n=e.target,o=new URL(n.src);if(!["app:","data:","http:","https:"].includes(o.protocol)){new p.Notice(`No handler for ${o.protocol} protocol`);return}let s=p.Menu.forEvent(e),c=P(this.app,o),E=!!n.closest(".markdown-reading-view");s.addSections(Array.from(O)),c&&E?(s.addItem(a=>l(a,"rename-file").onClick(()=>this.app.fileManager.promptForFileRename(c))),s.addItem(a=>l(a,"copy-to-clipboard").onClick(()=>{u(c)})),p.Platform.isMobile&&s.addItem(a=>a.setTitle(c.name).setSection("file").setIsLabel(!0)),s.addItem(a=>l(a,"open-in-new-tab").onClick(()=>{v(this.app,c)})),p.Platform.isDesktop&&(s.addItem(a=>l(a,"open-in-default-app").onClick(()=>{this.app.openWithDefaultApp(c.path)})),s.addItem(a=>l(a,"show-in-explorer").onClick(()=>{this.app.showInFolder(c.path)}))),this.settings.revealInNavigation&&s.addItem(a=>l(a,"reveal-in-navigation").onClick(()=>{var N;(N=this.app.internalPlugins.getEnabledPluginById("file-explorer"))==null||N.revealInFolder(c)})),this.app.plugins.enabledPlugins.has("file-tree-alternative")&&s.addItem(a=>l(a,"reveal-in-navigation-tree").onClick(()=>{self.dispatchEvent(new CustomEvent("fta-reveal-file",{detail:{file:c}}))}))):c||(E&&s.addItem(a=>l(a,"copy-to-clipboard").onClick(()=>{u(n.src)})),s.addItem(a=>l(a,"copy-url").onClick(()=>{navigator.clipboard.writeText(o.href),new p.Notice(i18next.t("interface.copied",{item:"URL"}),1e3)}))),s.showAtMouseEvent(e)}onImageMouseUp(e){let n=e.target;if(e.button===1&&this.settings.middleClickNewTab){let r=P(this.app,new URL(n.src));if(!r)return;v(this.app,r)}}}; - -/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/copy-url-in-preview/manifest.json b/.obsidian/plugins/copy-url-in-preview/manifest.json deleted file mode 100644 index 95296ea..0000000 --- a/.obsidian/plugins/copy-url-in-preview/manifest.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "id": "copy-url-in-preview", - "name": "Image Context Menus", - "version": "1.12.1", - "minAppVersion": "1.12.3", - "description": "Copy to clipboard, Copy URL, Open in default app, Show in system explorer, Reveal file in navigation, Open in new tab, Rename context menus for images.", - "author": "NomarCub", - "authorUrl": "https://github.com/NomarCub", - "fundingUrl": "https://ko-fi.com/nomarcub", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/recent-files-obsidian/data.json b/.obsidian/plugins/recent-files-obsidian/data.json index 5e2ff8e..f99f29f 100644 --- a/.obsidian/plugins/recent-files-obsidian/data.json +++ b/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,5 +1,49 @@ { "recentFiles": [ + { + "basename": "IBS 智能体具体落实技术方案", + "path": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md" + }, + { + "basename": "ibs-ai 项目梳理", + "path": "work/移动杭研/AI 项目/ibs-ai 项目梳理.md" + }, + { + "basename": "图纸-IBS 智能体-v3-项目架构", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md" + }, + { + "basename": "图纸-IBS 智能体-v2-项目架构 原生 MCP", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v2-项目架构 原生 MCP.md" + }, + { + "basename": "图纸-IBS 智能体-v1-流量查询 demo 对象存储", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md" + }, + { + "basename": "图纸-IBS 智能体-v1-流量查询 demo", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md" + }, + { + "basename": "Prompt 公司智能体", + "path": "resource/ai/prompts/Prompt 公司智能体.md" + }, + { + "basename": "20260309173243", + "path": "000-Inbox/20260309173243.md" + }, + { + "basename": "20260309150326", + "path": "000-Inbox/20260309150326.md" + }, + { + "basename": "如何成为一个 React 工程师呢?", + "path": "resource/前端/如何成为一个 React 工程师呢?.md" + }, + { + "basename": "服务器-香港", + "path": "personal/服务器-香港.md" + }, { "basename": "直播源", "path": "personal/电影/直播源.md" @@ -44,18 +88,6 @@ "basename": "ubuntu", "path": "resource/系统/ubuntu.md" }, - { - "basename": "IBS 智能体-v5", - "path": "work/移动杭研/AI 项目/IBS 智能体-v5.md" - }, - { - "basename": "IBS 智能体-v4", - "path": "work/移动杭研/AI 项目/IBS 智能体-v4.md" - }, - { - "basename": "IBS 智能体-v3", - "path": "work/移动杭研/AI 项目/IBS 智能体-v3.md" - }, { "basename": "20260305155494", "path": "000-Inbox/20260305155494.md" @@ -64,18 +96,6 @@ "basename": "开发笔记", "path": "work/移动杭研/开发记录/7.18.0/开发笔记.md" }, - { - "basename": "服务器-香港", - "path": "personal/服务器-香港.md" - }, - { - "basename": "IBS 智能体-v1", - "path": "work/移动杭研/AI 项目/IBS 智能体-v1.md" - }, - { - "basename": "IBS 智能体-v2", - "path": "work/移动杭研/AI 项目/IBS 智能体-v2.md" - }, { "basename": "构建 HUGO 博客的完整指南:从搭建到部署", "path": "resource/系统/构建 HUGO 博客的完整指南:从搭建到部署.md" @@ -92,10 +112,6 @@ "basename": "vim 快捷键与操作手册", "path": "resource/系统/vim 快捷键与操作手册.md" }, - { - "basename": "React 工程师", - "path": "resource/前端/React 工程师.md" - }, { "basename": "VSCode 配置文件", "path": "resource/配置/VSCode 配置文件.md" @@ -179,22 +195,6 @@ { "basename": "结婚相关", "path": "personal/个人/结婚相关.md" - }, - { - "basename": "昌平医院", - "path": "personal/个人/昌平医院.md" - }, - { - "basename": "TG 备忘录", - "path": "personal/TG 备忘录.md" - }, - { - "basename": "路由器", - "path": "personal/路由器.md" - }, - { - "basename": "王欣", - "path": "personal/家人/王欣.md" } ], "omittedPaths": [ diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 163444f..8b0c9cd 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,17 +4,22 @@ "type": "split", "children": [ { - "id": "6b428b85f883f637", + "id": "4b5820367a78b7bd", "type": "tabs", "children": [ { - "id": "5495c7466557ec58", + "id": "4695be4ed62c6a04", "type": "leaf", "state": { - "type": "empty", - "state": {}, + "type": "markdown", + "state": { + "file": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", + "mode": "source", + "source": false, + "backlinks": false + }, "icon": "lucide-file", - "title": "新标签页" + "title": "IBS 智能体具体落实技术方案" } } ] @@ -50,9 +55,9 @@ "state": { "type": "search", "state": { - "query": "file: 常用", + "query": "file:react", "matchingCase": false, - "explainSearch": false, + "explainSearch": true, "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical" @@ -92,7 +97,7 @@ } ], "direction": "horizontal", - "width": 218.5 + "width": 507.5 }, "right": { "id": "ca733f6d5936ae40", @@ -101,7 +106,7 @@ { "id": "1f21045435bfa327", "type": "tabs", - "dimension": 57.88834951456311, + "dimension": 57.8883495145631, "children": [ { "id": "43a2e8e1d9201229", @@ -109,12 +114,13 @@ "state": { "type": "outline", "state": { + "file": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", "followCursor": true, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "大纲" + "title": "IBS 智能体具体落实技术方案 的大纲" } }, { @@ -196,7 +202,7 @@ { "id": "ea8a40d57ef90e62", "type": "tabs", - "dimension": 42.11165048543689, + "dimension": 42.1116504854369, "children": [ { "id": "499dbd491c6fb256", @@ -226,34 +232,34 @@ "obsidian-excalidraw-plugin:New drawing": false } }, - "active": "c8718c0c63702202", + "active": "4695be4ed62c6a04", "lastOpenFiles": [ + "work/移动杭研/AI 项目/ibs-ai 项目梳理.md", + "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", + "work/移动杭研/AI 项目/MCP Prompt.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v2-项目架构 原生 MCP.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md", + "work/移动杭研/AI 项目/IBS 智能体-v4.md", + "work/移动杭研/AI 项目/IBS 智能体-v3-遗弃.md", + "resource/ai/prompts/Prompt 公司智能体.md", + "calendar/diary/2026-03-10.md", + "000-inbox/20260309173243.md", + "000-inbox/20260309150326.md", "calendar/diary/2026-03-09.md", + "calendar/diary/2026-03-08.md", + "calendar/weeks/2026-W10.md", "calendar/diary/2026-03-07.md", "calendar/diary/2026-03-06.md", - "000-inbox/20260307154181.md", - "personal/电影/直播源.md", - "000-inbox/20260307145692.md", - "000-Inbox/20260307145692.md", - "000-Inbox/20260307154181.md", - "000-Inbox/20260307181838.md", - "000-Inbox/20260306180056.md", - "000-inbox/20260306180056.md", - "000-Inbox/20260306180077.md", - "000-inbox/20260306180077.md", - "000-inbox/tg-bot.md", - "000-Inbox/20260306143237.md", - "resource/工具/rime/Rime 快捷键.md", - "resource/组件/Ubuntu 24.04 LTS ELK 8 安装指南.md", - "000-Inbox/20260306145821.md", "calendar/diary/2026-03-05.md", "calendar/diary/2026-03-04.md", - "resource/常用命令.md", - "000-inbox/20260306145821.md", - "000-inbox/20260306143237.md", - "work/移动杭研/项目备忘/环境账号.md", - "excalidraw/Drawing 2026-03-06 08.49.09.excalidraw.md", - "excalidraw/Drawing 2026-03-06 08.42.40.excalidraw.md", + "calendar/diary/2026-03-03.md", + "calendar/diary/2026-03-02.md", + "000-Inbox/20260309173243.md", + "000-Inbox/20260309150326.md", + "resource/前端/如何成为一个 React 工程师呢?.md", + "personal/服务器-香港.md", "resource/工具/rime", "attachment/images-paste/image-20260304153545122.png", "work/移动杭研/开发记录/7.19.0", diff --git a/calendar/diary/2026-03-08.md b/calendar/diary/2026-03-08.md new file mode 100644 index 0000000..9f56397 --- /dev/null +++ b/calendar/diary/2026-03-08.md @@ -0,0 +1,9 @@ +# 任务 + +# 日志 + +# 总结 + +上午起来看了一些关于 F1 的资讯,然后我准备把 OpenClaw 弄一下。 + +中午去王繁星面馆吃面。 diff --git a/calendar/diary/2026-03-09.md b/calendar/diary/2026-03-09.md index c4bb7ae..ca8a4a8 100644 --- a/calendar/diary/2026-03-09.md +++ b/calendar/diary/2026-03-09.md @@ -1,7 +1,21 @@ # 任务 +- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5) - [x] 开发:梳理 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 李春良 4) +- [x] 项目:IBS 智能体具体落实技术方案调研。(李春良 3) # 日志 +feat: 初始化 MCP 服务端项目 + +聊天智能体,用户输入,先进行语义路由,是走知识库进行概念问题解答,还是走 MCP 智能体,可以根据我公司提供的 MCP 服务器进行选择使用,将结果经过 ai 润色后答疑。 + # 总结 + +今天体验了 RAG Flow、Dify、n8n,让我感觉到了自己在智能体方面的能力缺失,如果早体验这个圈子。自己的思维会更上一层。 + +今天实现了 MCP 的自动注册。 + +晚上回家田宝在玩儿水。 + +今天智齿要了命了。这次消肿了一定要去拔了。 diff --git a/calendar/diary/2026-03-10.md b/calendar/diary/2026-03-10.md new file mode 100644 index 0000000..8b80bf2 --- /dev/null +++ b/calendar/diary/2026-03-10.md @@ -0,0 +1,9 @@ +# 任务 + +- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5) +- [ ] 开发:梳理 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 李春良 4) +- [ ] 项目:IBS 智能体具体落实技术方案调研。(李春良 3) + +# 日志 + +# 总结 diff --git a/calendar/weeks/2026-W10.md b/calendar/weeks/2026-W10.md new file mode 100644 index 0000000..ca4b4af --- /dev/null +++ b/calendar/weeks/2026-W10.md @@ -0,0 +1 @@ +需求自测、IBS AI 调研、元宵节、日全食、MCP Demo、第一次参与会议 AI 会议、obsidian、AI 开发规范、幼儿园、F1 开赛、OpenClaw、王繁星 diff --git a/work/移动杭研/AI 项目/公司智能体.md b/resource/ai/prompts/Prompt 公司智能体.md similarity index 100% rename from work/移动杭研/AI 项目/公司智能体.md rename to resource/ai/prompts/Prompt 公司智能体.md diff --git a/resource/前端/React 工程师.md b/resource/前端/React 工程师.md deleted file mode 100644 index 38c83ce..0000000 --- a/resource/前端/React 工程师.md +++ /dev/null @@ -1,72 +0,0 @@ -# 关于 Node - -| Node.js | Java | -| --------------- | ----------- | -| Node.js version | JDK version | -| V8 Engine | JVM | -| npm | Maven | -| N-API | JNI | - -## Node.js 版本 - -[Node.js — Node.js 版本](https://nodejs.org/zh-cn/about/previous-releases) - -# 学习资料 - -https://u19tul1sz9g.feishu.cn/docx/WEWJdSzF5oTnwvxHGGAc0Vojnxe?from=from_copylink - -密码:M6923&65 - -# 第一章 开发环境与核心概念 - -UI = f(State) - -用户界面仅仅是应用程序状态的一个函数 - -初始化环境 - -``` -pnpm create vite@latest basic --template react-ts -``` - -导入方式: - -具名导入: - -``` -import { ... } from 'react' -``` - -默认导入: - -``` -import ... from 'react' -``` - -副作用导入: - -``` -import './index.css' -``` - -# CSS - -顶级作用域 - -``` -:root { -``` - -媒体查询 - -``` -@media (prefers-color-scheme: light) { - -} -``` - -ID 选择器 - -``` -#root -``` diff --git a/resource/前端/如何成为一个 React 工程师呢?.md b/resource/前端/如何成为一个 React 工程师呢?.md new file mode 100644 index 0000000..dfb693b --- /dev/null +++ b/resource/前端/如何成为一个 React 工程师呢?.md @@ -0,0 +1,192 @@ +# 学习资料 + +https://u19tul1sz9g.feishu.cn/docx/WEWJdSzF5oTnwvxHGGAc0Vojnxe?from=from_copylink + +密码:M6923&65 + +# 关于 Node 的理解 + +| Node.js | Java | +| --------------- | ----------- | +| Node.js version | JDK version | +| V8 Engine | JVM | +| Npm | Maven | +| N-API | JNI | + +``` + ┌───────────────┐ + │ JS APP │ + └───────▲───────┘ + │ + ┌───────┴───────┐ + │ NPM │ ← 包管理 & 生态 + └───────▲───────┘ + │ + ┌───────┴───────┐ + │ Node.js │ ← Runtime(API / EventLoop / Libuv) + └───────▲───────┘ + │ + ┌───────┴───────┐ + │ V8 │ ← JS 引擎 + └───────▲───────┘ + │ + 操作系统 +``` + +## Node.js 版本 + +[Node.js](https://nodejs.org/zh-cn/about/previous-releases) 采用固定节奏发布 + LTS 生命周期,每 6 个月发布一个,相当于每年会覆盖一个 LTS。 + +# 第一章 开发环境与核心概念 + +初始化环境 + +```bash +pnpm create vite@latest basic2 --template react-ts +``` + +所谓的优雅公式:`UI = f(State)`,用户界面仅仅是应用程序状态的一个函数。 + +JSX 不是 HTML 而是 JavaScript 的一种特殊语法。我们编写的每一行 JSX 代码最后都会被转换为一个函数:`React.createElement()` + +> 例如: +> `

Hello React

` +> 对应: +> `React.createElement('h1', { className: 'title' }, 'Hello React')` + +可以使用 `{ }` 在 JSX 中嵌入任何 JavaScript 表达式(变量、数学、函数)。 + +关于声明: + +| 关键字 | 作用域 | 重复声明 | 是否可以修改引用 | 推荐场景 | +| ----------- | ---------------- | ---- | -------- | -------------------------- | +| **`const`** | 块级作用域 (Block) | 不允许 | 不允许 | **默认使用**,除非变量需要重新赋值 | +| **`let`** | 块级作用域 (Block) | 不允许 | 允许 | 用于循环变量或需要修改引用的场景 | +| **`var`** | 函数作用域 (Function) | 允许 | 允许 | **严禁使用** (旧时代的产物,存在变量提升问题) | + +一个组件的返回必须有一个**单一的根元素**,如果返回并列的多个元素,可以嵌套一个 `
`,但更好的做法是使用 `Fragment`,语法糖是 `<>`。因 JSX 最终是会被编译为 JavaScript,所以要注意不要产生关键字的冲突。这也是为什么 `class` 在 React 中要写成 `className`,同时时间名要遵循驼峰命名法,例如 `onClick`。 + +**导入方式** + +具名导入: + +``` +import { ... } from 'react' +``` + +默认导入: + +``` +import ... from 'react' +``` + +副作用导入: + +``` +import './index.css' +``` + +React 历史写法: + +这里我还是不是很理解 `(prevState) => ({ count: prevState.count + 1 })` 这个的原理,目前的理解是,他可以拿到自己作用域的 count。 + +```tsx +import React from 'react' + +interface CounterState { + count: number +} + +class ClassCounter extends React.Component { + state = { count: 0 } + handleClick = () => { + // this.setState({ count: this.state.count + 1 }) + this.setState((prevState) => ({ count: prevState.count + 1 })) + } + render() { + return ( +
+

Class Counter

+ +
+ ) + } +} + +export default ClassCounter +``` + +useState + +我理解就是有了一个动态更新值的作用。 + +```tsx +import { useState } from 'react' + +const FunctionalCounter = () => { + const [count, setCount] = useState(0) + const handleClick = () => { + setCount((prevCount) => prevCount + 1) + setCount((prevCount) => prevCount + 1) + } + console.log(count) + return ( +
+

Functional Counter

+ +
+ ) +} + +export default FunctionalCounter + +``` + +# 第二章 组件化开发核心 + +Props 通信 + +```tsx +type Props = { + name: string +} + +const PrintNmae = (name: Props) => { + return ( +
+

Welcome {name.name}

+
+ ) +} + +export default PrintNmae + +``` + +传参 + +```tsx + +``` + +# CSS + +顶级作用域 + +``` +:root { +``` + +媒体查询 + +``` +@media (prefers-color-scheme: light) { + +} +``` + +ID 选择器 + +``` +#root +``` diff --git a/work/移动杭研/AI 项目/IBS 智能体-v3.md b/work/移动杭研/AI 项目/IBS 智能体-v3.md deleted file mode 100644 index b48fdf2..0000000 --- a/work/移动杭研/AI 项目/IBS 智能体-v3.md +++ /dev/null @@ -1,60 +0,0 @@ -``` -flowchart TB - subgraph Layer1["1. 用户与接入层 (Access Layer)"] - UI["Web 中台控制台\n(对话界面 / 插件管理)"] - ChatBot["企微/办公 IM 机器人"] - Card["安全审批卡片\n(Human-in-the-loop)"] - end - subgraph Tools["内置核心能力"] - RAG["RAG 问答引擎"] - CodeInterpreter["数据分析引擎\n(分析CDN优质客户)"] - end - subgraph Layer2["2. 智能体编排中台 (基于 Spring Boot & Spring AI)"] - Router["意图路由引擎 (Semantic Router)"] - Planner["Agent 调度与规划 (ReAct)"] - Tools - end - subgraph Layer3["3. 动态插件生态引擎 (Plugin Market) ⭐️核心创新"] - RegistryDB[("插件注册数据库\n(存储接口URL、参数定义)")] - SchemaConverter["动态 Schema 转换器\n(DB配置 -> LLM Function Calling)"] - Interceptor["高危操作拦截器\n(识别写操作、触发审批)"] - HttpExecutor["通用 HTTP 执行器\n(动态发起 REST 请求)"] - MCPClient["MCP 协议网关\n(未来对接标准 MCP Server)"] - end - subgraph Layer4["4. 基础设施与外部业务线 (Infrastructure & Business)"] - LLM["大语言模型 (LLM)"] - RAGFlow["现有 RAGFlow 知识库"] - IBS["IBS 系统\n(流量查验/工单)"] - CDN["CDN 下发系统\n(一键配置)"] - DNS["DNS 管理系统\n(动态查询)"] - end - UI --> Router - ChatBot --> Router - Router -- 知识库查询 --> RAG - Router -- 业务指令/查询 --> Planner - RAG <-- 检索 --> RAGFlow - Planner <-- "1. 交互与思考" --> LLM - RegistryDB -. "2. 实时加载接口配置" .-> SchemaConverter - SchemaConverter -- "3. 转换并注入可用工具" --> Planner - Planner -- "4. 生成调用指令" --> Interceptor - Interceptor -. "5a. 识别为 CDN 下发\n要求人工确认" .-> Card - Card -. 用户点击“确认” .-> Interceptor - Interceptor -- "5b. 鉴权通过放行" --> HttpExecutor - Interceptor -- 放行至新架构 --> MCPClient - HttpExecutor -- "6. 拼装动态 HTTP 请求" --> IBS - HttpExecutor -- HTTP 请求 --> CDN & DNS - MCPClient -. 未来演进: MCP通信协议 .-> DNS - - Card:::highlight - IBS:::external - CDN:::external - DNS:::external - classDef core fill:#e1f5fe,stroke:#01579b,stroke-width:2px - classDef plugin fill:#fff3e0,stroke:#e65100,stroke-width:2px - classDef external fill:#f1f8e9,stroke:#33681e,stroke-width:1px - classDef highlight fill:#ffebee,stroke:#c62828,stroke-width:2px - style Layer1 fill:#fafafa,stroke:#bdbdbd,stroke-width:1px,stroke-dasharray: 5 5 - style Layer2 fill:#fafafa,stroke:#bdbdbd,stroke-width:1px,stroke-dasharray: 5 5 - style Layer3 fill:#fafafa,stroke:#ffb74d,stroke-width:2px,stroke-dasharray: 5 5 - style Layer4 fill:#fafafa,stroke:#bdbdbd,stroke-width:1px,stroke-dasharray: 5 5 -``` diff --git a/work/移动杭研/AI 项目/IBS 智能体-v4.md b/work/移动杭研/AI 项目/IBS 智能体-v4.md deleted file mode 100644 index 77f4667..0000000 --- a/work/移动杭研/AI 项目/IBS 智能体-v4.md +++ /dev/null @@ -1,44 +0,0 @@ -``` -flowchart TB - subgraph Layer1["1. 用户侧"] - UI["对话框"] - end - subgraph Layer2["2. 智能体编排层"] - Router@{ label: "意图识别与分发
语义路由,小模型更好,选择题)" } - Planner["Agent 规划与调度 (ReAct)"] - LLM["大模型 (LLM)"] - end - subgraph Layer3["3. 工具检索引擎 (Tool-RAG) ⭐️"] - Embedding["Embedding 模型
(文本转向量)"] - VectorDB[("向量数据库
(Milvus / pgvector)
存储插件语义")] - RelationalDB[("关系型数据库
(MySQL)
存储接口物理配置")] - SchemaBuilder["Schema 组装器
(仅组装 Top-K 工具)"] - end - subgraph Layer4["4. 拦截与执行层"] - Interceptor["高危操作拦截器
(审批效果,这个需要和前端沟通方案)"] - HttpExecutor["通用 HTTP 执行器
(动态请求第三方组)"] - IBS["IBS / CDN / DNS 系统"] - end - UI -- "1. 输入: 查一下流量" --> Router - Router -- "2. 业务请求" --> Embedding - Embedding -- "3. 提取语义向量" --> VectorDB - VectorDB -- "4. 返回相似度 Top-3 的插件 ID" --> SchemaBuilder - RelationalDB -. "5. 根据 ID 拉取详细配置URL等" .-> SchemaBuilder - SchemaBuilder -- "6. 动态注入这 3 个工具说明" --> Planner - Planner <-- "7. 仅带 3 个工具进行交互
提取并完善参数" --> LLM - Planner -- "8. 决定调用某工具+参数" --> Interceptor - Interceptor -- "9. 放行/审批" --> HttpExecutor - HttpExecutor -- "10. 动态发起真实请求" --> IBS - Register["管理员注册新插件"] -. "A. 存入运行配置" .-> RelationalDB - Register -. "B. 向量化插件描述" .-> VectorDB - - Router@{ shape: rect} - Embedding:::vector - VectorDB:::vector - RelationalDB:::plugin - SchemaBuilder:::vector - classDef core fill:#e1f5fe,stroke:#01579b,stroke-width:2px - classDef plugin fill:#fff3e0,stroke:#e65100,stroke-width:2px - classDef vector fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px - classDef highlight fill:#ffebee,stroke:#c62828,stroke-width:2px -``` diff --git a/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md b/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md index d93325c..83ce0dd 100644 --- a/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md +++ b/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md @@ -17,7 +17,7 @@ RAGFlow v0.18.0 2025-04-23(知识库) > 完全支持 MCP v0.20.0 > 依赖 MySQL、ES、Redis、MinIO -# 概念 +# 概念理解 bge 向量模型。 @@ -61,7 +61,7 @@ Function Calling / Tool Call / Tool Calling **DB-GPT** 开源的“AI 原生数据应用开发框架”,用大模型来操作数据库和数据系统。 -# 问题 +# 问题备注 鉴权问题:哪个平台能调用哪些工具,哪个平台的哪些用户能调用哪些工具 @@ -77,8 +77,6 @@ AI 平台颁发系统级别 Token 限制你能用的工具。 我想查询 企业A a.com 近 5 天的峰值。 -# 备注 - RAGFlow 版本升级至少 v0.20.0。(注意一下是否可以开启自身当作 MCP 服务的功能。) dify 的整体使用流程流畅很多。 diff --git a/work/移动杭研/AI 项目/MCP Prompt.md b/work/移动杭研/AI 项目/MCP Prompt.md deleted file mode 100644 index 1be33b4..0000000 --- a/work/移动杭研/AI 项目/MCP Prompt.md +++ /dev/null @@ -1,24 +0,0 @@ -给我增加两个我们项目的 demo 工具。为我的查询峰值智能体做测试准备 - -1. 根据企业 ID 获取 企业的所属域名。(入参是企业 ID,响应 10 个域名, a.com, b.com… 固定十个。)但现在企业 ID 只有 企业A ,其他 企业 ID 返回无域名。 -2. 根据企业 ID 和 域名 获取域名近 5 天的峰值带宽。(峰值带宽可以随机 mock)如果用户无域名 ID 输入返回需要输入域名。 - -现在我有一个 ibs-mcp-server : - -queryDomainPeakBandwidth - -根据企业 ID 和域名查询该域名近 5 天的峰值带宽数据(单位:Mbps) - -queryEnterpriseDomains - -根据企业 ID 查询该企业所属的域名列表 - -queryWeather - -查询指定城市在指定日期的天气预报,返回天气状况、温度、湿度和风力信息 - -你能给我生成一个可以导入 ragflow 的 json agent 么?让我可以直接使用。 - -智能体的工作就是可以查训用户的域名,如果用户没有输入域名可以用 queryEnterpriseDomains 给用户提示。 - -生成到根目录。注意学习相关语法。 diff --git a/work/移动杭研/AI 项目/ibs-ai 项目 AI 对话流程.md b/work/移动杭研/AI 项目/ibs-ai 项目梳理.md similarity index 100% rename from work/移动杭研/AI 项目/ibs-ai 项目 AI 对话流程.md rename to work/移动杭研/AI 项目/ibs-ai 项目梳理.md diff --git a/work/移动杭研/AI 项目/IBS 智能体-v2.md b/work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md similarity index 100% rename from work/移动杭研/AI 项目/IBS 智能体-v2.md rename to work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md diff --git a/work/移动杭研/AI 项目/IBS 智能体-v1.md b/work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md similarity index 100% rename from work/移动杭研/AI 项目/IBS 智能体-v1.md rename to work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md diff --git a/work/移动杭研/AI 项目/IBS 智能体-v5.md b/work/移动杭研/AI 项目/图纸-IBS 智能体-v2-项目架构 原生 MCP.md similarity index 100% rename from work/移动杭研/AI 项目/IBS 智能体-v5.md rename to work/移动杭研/AI 项目/图纸-IBS 智能体-v2-项目架构 原生 MCP.md diff --git a/work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md b/work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md new file mode 100644 index 0000000..db5f99c --- /dev/null +++ b/work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md @@ -0,0 +1,54 @@ +``` +--- +config: + layout: elk +--- +flowchart TB + subgraph Layer1["1. 用户侧"] + UI["对话框"] + end + subgraph Layer2["2. 智能体编排层"] + Router["意图识别与分发
(语义路由,小模型判断快)"] + Planner["Agent 规划与调度 (ReAct)"] + LLM["大模型 (LLM)"] + RAGFlow["现有 RAGFlow
(知识库问答)"] + end + subgraph Layer3["3. 工具检索引擎 (Tool-RAG) ⭐️核心枢纽"] + Embedding["Embedding 模型
(文本转向量)"] + VectorDB[("向量数据库
存储插件语义
(按租户隔离)")] + RelationalDB@{ label: "关系型数据库
1. 接口物理配置
2. 角色权限表" } + SchemaBuilder["Schema 组装器
(仅组装 Top-K 工具)"] + end + subgraph Layer4["4. 拦截与执行层"] + Interceptor["高危操作拦截
(前端卡片审批流)"] + HttpExecutor["通用 HTTP 执行器
"] + IBS["IBS / CDN / DNS 系统"] + end + UI -- "1. 用户输入" --> Router + Router -- "2a. 查阅文档" --> RAGFlow + Router -- "2b. 业务请求/查数据" --> Embedding + Embedding -- "3. 提取语义向量" --> VectorDB + VectorDB -- "4. 返回相似度 Top-3 的插件 ID" --> SchemaBuilder + RelationalDB -. "5. 根据 ID 拉取详细配置URL等" .-> SchemaBuilder + SchemaBuilder -- "6. 动态注入这 3 个工具说明" --> Planner + Planner <-- "7. 带 3 个工具进行交互
提取并完善参数" --> LLM + Planner -- "8. 决定调用某工具+参数" --> Interceptor + Interceptor -- "9a. 放行/审批后走普通接口" --> HttpExecutor + HttpExecutor -- "10a. 动态发起 REST 请求" --> IBS + Register["admin 录入新插件"] -. "A. 存入运行配置" .-> RelationalDB + Register -. "B. 向量化插件描述" .-> VectorDB + + Router@{ shape: rect} + RelationalDB@{ shape: cylinder} + Register@{ shape: rect} + RAGFlow:::highlight + Embedding:::vector + VectorDB:::vector + RelationalDB:::plugin + SchemaBuilder:::vector + classDef core fill:#e1f5fe,stroke:#01579b,stroke-width:2px + classDef plugin fill:#fff3e0,stroke:#e65100,stroke-width:2px + classDef vector fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px + classDef highlight fill:#fff9c4,stroke:#fbc02d,stroke-width:2px + classDef external fill:#f3e5f5,stroke:#8e24aa,stroke-width:1px,stroke-dasharray: 5 5 +```