You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

1 lines
84 KiB

<!doctypehtml><html lang=zh-CN><meta charset=UTF-8><meta content=width=device-width name=viewport><meta media="(prefers-color-scheme: light)" content=#222 name=theme-color><meta media="(prefers-color-scheme: dark)" content=#222 name=theme-color><meta content="Hexo 7.3.0" name=generator><link href=https://cdnjs.cloudflare.com rel=preconnect><link href=/images/apple-touch-icon-next.png rel=apple-touch-icon sizes=180x180><link href=/images/favicon-32x32-next.png rel=icon sizes=32x32 type=image/png><link href=/images/favicon-16x16-next.png rel=icon sizes=16x16 type=image/png><link color=#222 href=/images/logo.svg rel=mask-icon><meta content=2X6S9P7CAjXjVvw8YyQR8pCu-B0oEu7O9quLgxXuWyA name=google-site-verification><meta content=dV8JGNzi0c name=baidu-site-verification><script>!function(){var t=!1;function e(){var e;t||(t=!0,(e=document.createElement("script")).setAttribute("data-ad-client","ca-pub-7480618470784058"),e.async=!0,e.src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js",document.head.appendChild(e))}function a(){"requestIdleCallback"in window?window.requestIdleCallback(e,{timeout:5e3}):window.setTimeout(e,5e3)}"complete"===document.readyState?a():window.addEventListener("load",a,{once:!0})}()</script><link href=/css/main.css rel=stylesheet><link crossorigin=anonymous href=https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.0/css/all.min.css integrity=sha256-VHqXKFhhMxcpubYf9xiWdCiojEbY9NexQ4jh8AxbvcM= rel=stylesheet><link crossorigin=anonymous href=https://cdnjs.cloudflare.com/ajax/libs/fancyapps-ui/6.1.14/fancybox/fancybox.css integrity=sha256-mdaMxrItEW6hMIVJJNPKuX0B7KCSJQVEv3mVY4N2we4= rel=stylesheet><script class=next-config data-name=main type=application/json>{"hostname":"nicksxs.me","root":"/","images":"/images","scheme":"Pisces","darkmode":true,"version":"8.29.0","exturl":false,"sidebar":{"position":"left","width_expanded":320,"width_dual_column":240,"display":"post","padding":18,"offset":12},"hljswrap":true,"codeblock":{"theme":{"light":"default","dark":"stackoverflow-dark"},"prism":{"light":"prism","dark":"prism-dark"},"copy_button":{"enable":true,"style":"default"},"fold":{"enable":false,"height":500},"language":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":true,"nav":null},"stickytabs":false,"motion":{"enable":false,"async":false,"duration":200,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果:${query}","hits_time":"找到 ${hits} 个搜索结果(用时 ${time} 毫秒)","hits":"找到 ${hits} 个搜索结果"},"algolia":{"appID":"663Q99OQQD","apiKey":"e461a1371d12cec1491c1153b288a9ed","indexName":"nicksxs","hits":{"per_page":10}}}</script><script defer src=/js/config.js></script><meta content="介绍腾讯 Octop 的产品定位与 WorkBuddy 对比,解释 Deep Agents、LangChain 和 LangGraph 的分工,再沿源码追踪 Agent Loop、工具调用、会话状态与权限边界,给出本地部署要求和验证路径。" name=description><meta content=article property=og:type><meta content="腾讯 Octop 是什么:WorkBuddy 对比、Agent Loop 与本地部署" property=og:title><meta content=https://nicksxs.me/2026/10/10/octop-local-deployment/index.html property=og:url><meta content="Nicksxs's Blog" property=og:site_name><meta content="介绍腾讯 Octop 的产品定位与 WorkBuddy 对比,解释 Deep Agents、LangChain 和 LangGraph 的分工,再沿源码追踪 Agent Loop、工具调用、会话状态与权限边界,给出本地部署要求和验证路径。" property=og:description><meta content=zh_CN property=og:locale><meta content=2026-10-10T12:00:00.000Z property=article:published_time><meta content=2026-10-11T01:30:00.000Z property=article:modified_time><meta content=Nicksxs property=article:author><meta content=本地部署 property=article:tag><meta content=Octop property=article:tag><meta content=WorkBuddy property=article:tag><meta content="AI Agent" property=article:tag><meta content=源码分析 property=article:tag><meta content=腾讯云 property=article:tag><meta content=summary name=twitter:card><link href=https://nicksxs.me/2026/10/10/octop-local-deployment/ rel=canonical><script class=next-config data-name=page type=application/json>{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":true,"permalink":"https://nicksxs.me/2026/10/10/octop-local-deployment/","path":"2026/10/10/octop-local-deployment/","title":"腾讯 Octop 是什么:WorkBuddy 对比、Agent Loop 与本地部署"}</script><script class=next-config data-name=calendar type=application/json>""</script><title>腾讯 Octop 是什么:WorkBuddy 对比、Agent Loop 与本地部署 | Nicksxs's Blog</title><script async src=https://www.googletagmanager.com/gtag/js?id=UA-61358619-1></script><script class=next-config data-name=google_analytics type=application/json>{"tracking_id":"UA-61358619-1","only_pageview":false,"measure_protocol_api_secret":null}</script><script defer src=/js/third-party/analytics/google-analytics.js></script><script defer src=/js/third-party/analytics/baidu-analytics.js></script><script async src=https://hm.baidu.com/hm.js?20f33b3c0c0eff9b1522999c0015646d></script><script crossorigin=anonymous defer integrity=sha256-QnJV4HT5r8i89ovZGRD86iynZqHerEbT2xt69vDM36I= src=https://cdnjs.cloudflare.com/ajax/libs/fancyapps-ui/6.1.14/fancybox/fancybox.umd.js></script><script defer src=/js/utils.js></script><script defer src=/js/sidebar.js></script><script defer src=/js/next-boot.js></script><script data-algolia-integrity=sha256-o49zoHLDPBm9WLg6AiliAVi3axCRTqe3ltTxLvhzAVg= data-algolia-src=https://cdnjs.cloudflare.com/ajax/libs/algoliasearch/5.36.0/lite/builds/browser.umd.js data-search-src=/js/third-party/search/algolia-search.js src=/js/third-party/search/algolia-search-loader.js></script><script defer src=/js/third-party/fancybox.js></script><noscript><link href=/css/noscript.css rel=stylesheet></noscript><link title="Nicksxs's Blog" href=/atom.xml rel=alternate type=application/atom+xml><body itemscope itemtype=http://schema.org/WebPage><div class=headband></div><main class=main><div class=column><header class=header itemscope itemtype=http://schema.org/WPHeader><div class=site-brand-container><div class=site-nav-toggle><div aria-label=切换导航栏 class=toggle role=button><span class=toggle-line></span><span class=toggle-line></span><span class=toggle-line></span></div></div><div class=site-meta><a class=brand href=/ rel=start><i class=logo-line></i><p class=site-title>Nicksxs's Blog</p><i class=logo-line></i></a><p class=site-subtitle itemprop=description>Java 运行时、生产诊断与 AI 工程实践</div><div class=site-nav-right><div class="toggle popup-trigger" aria-label=搜索 role=button><i class="fa fa-search fa-fw fa-lg"></i></div></div></div><nav class=site-nav><ul class="main-menu menu"><li class="menu-item menu-item-home"><a href=/ rel=section><i class="fa fa-home fa-fw"></i>首页</a><li class="menu-item menu-item-专题"><a href=/topics/ rel=section><i class="fa fa-layer-group fa-fw"></i>专题</a><li class="menu-item menu-item-工具"><a href=/tools/ rel=section><i class="fa fa-toolbox fa-fw"></i>工具</a><li class="menu-item menu-item-about"><a href=/about/ rel=section><i class="fa fa-user fa-fw"></i>关于我</a><li class="menu-item menu-item-tags"><a href=/tags/ rel=section><i class="fa fa-tags fa-fw"></i>标签</a><li class="menu-item menu-item-categories"><a href=/categories/ rel=section><i class="fa fa-th fa-fw"></i>分类</a><li class="menu-item menu-item-archives"><a href=/archives/ rel=section><i class="fa fa-archive fa-fw"></i>归档</a><li class="menu-item menu-item-search"><a class=popup-trigger role=button><i class="fa fa-search fa-fw"></i>搜索</a></ul></nav><div class=search-pop-overlay><div class="popup search-popup"><div class=search-header><span class=search-icon><i class="fa fa-search"></i></span><div class=search-input-container><input autocapitalize=off autocomplete=off class=search-input maxlength=80 placeholder=搜索... spellcheck=false type=search></div><span class=popup-btn-close role=button><i class="fa fa-times-circle"></i></span></div><div class=search-result-container><div class=search-result-icon><i class="fab fa-algolia fa-5x"></i></div></div></div></div></header><aside class=sidebar><div class="sidebar-inner sidebar-nav-active sidebar-toc-active"><ul class=sidebar-nav><li class=sidebar-nav-toc>文章目录<li class=sidebar-nav-overview>站点概览</ul><div class=sidebar-panel-container><div class="post-toc-wrap sidebar-panel"><div class="post-toc animated"><ol class=nav><li class="nav-item nav-level-2"><a class=nav-link href=#Octop-%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%8C%E8%83%BD%E5%81%9A%E4%BB%80%E4%B9%88><span class=nav-number>1.</span> <span class=nav-text>Octop 是什么,能做什么</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#%E2%80%9C%E5%BC%80%E6%BA%90%E7%89%88-WorkBuddy%E2%80%9D%E8%AF%A5%E6%80%8E%E4%B9%88%E7%90%86%E8%A7%A3><span class=nav-number>2.</span> <span class=nav-text>“开源版 WorkBuddy”该怎么理解</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#%E4%B8%8E-WorkBuddy-%E5%AF%B9%E6%AF%94%EF%BC%8C%E5%B7%AE%E5%88%AB%E5%9C%A8%E5%93%AA%E9%87%8C><span class=nav-number>3.</span> <span class=nav-text>与 WorkBuddy 对比,差别在哪里</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#%E5%85%88%E7%A1%AE%E5%AE%9A%E5%88%86%E6%9E%90%E7%9A%84%E6%98%AF%E5%93%AA%E4%B8%80%E5%A5%97%E4%BB%A3%E7%A0%81><span class=nav-number>4.</span> <span class=nav-text>先确定分析的是哪一套代码</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#Deep-Agents-%E5%92%8C-LangGraph-%E5%90%84%E8%87%AA%E8%B4%9F%E8%B4%A3%E4%BB%80%E4%B9%88><span class=nav-number>5.</span> <span class=nav-text>Deep Agents 和 LangGraph 各自负责什么</span></a><ol class=nav-child><li class="nav-item nav-level-3"><a class=nav-link href=#Deep-Agents%EF%BC%9A%E7%BB%99-Agent-%E9%85%8D%E4%B8%8A%E5%A4%84%E7%90%86%E9%95%BF%E4%BB%BB%E5%8A%A1%E7%9A%84%E5%9F%BA%E7%A1%80%E8%83%BD%E5%8A%9B><span class=nav-number>5.1.</span> <span class=nav-text>Deep Agents:给 Agent 配上处理长任务的基础能力</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#LangGraph%EF%BC%9A%E4%BF%9D%E5%AD%98%E7%8A%B6%E6%80%81%EF%BC%8C%E6%8E%A7%E5%88%B6%E6%89%A7%E8%A1%8C%E6%AD%A5%E9%AA%A4%E4%B9%8B%E9%97%B4%E7%9A%84%E6%B5%81%E8%BD%AC><span class=nav-number>5.2.</span> <span class=nav-text>LangGraph:保存状态,控制执行步骤之间的流转</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#Octop-%E6%80%8E%E6%A0%B7%E6%8A%8A%E8%BF%99%E4%BA%9B%E5%B1%82%E8%BF%9E%E6%8E%A5%E8%B5%B7%E6%9D%A5><span class=nav-number>5.3.</span> <span class=nav-text>Octop 怎样把这些层连接起来</span></a></ol><li class="nav-item nav-level-2"><a class=nav-link href=#%E4%B8%80%E6%9D%A1%E6%B6%88%E6%81%AF%E6%80%8E%E6%A0%B7%E8%BF%9B%E5%85%A5-Agent><span class=nav-number>6.</span> <span class=nav-text>一条消息怎样进入 Agent</span></a><ol class=nav-child><li class="nav-item nav-level-3"><a class=nav-link href=#%E5%85%A5%E5%8F%A3%E5%85%88%E5%A4%84%E7%90%86%E8%BA%AB%E4%BB%BD%E5%92%8C%E4%BC%9A%E8%AF%9D><span class=nav-number>6.1.</span> <span class=nav-text>入口先处理身份和会话</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#%E6%B6%88%E6%81%AF%E5%A4%84%E7%90%86%E5%99%A8%E5%87%86%E5%A4%87%E8%BF%90%E8%A1%8C%E5%8F%82%E6%95%B0><span class=nav-number>6.2.</span> <span class=nav-text>消息处理器准备运行参数</span></a></ol><li class="nav-item nav-level-2"><a class=nav-link href=#%E4%B8%93%E5%AE%B6%E5%90%AF%E5%8A%A8%E6%97%B6%E5%88%B0%E5%BA%95%E8%A3%85%E4%BA%86%E4%BB%80%E4%B9%88><span class=nav-number>7.</span> <span class=nav-text>专家启动时到底装了什么</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#Agent-Loop-%E6%80%8E%E6%A0%B7%E6%89%A7%E8%A1%8C><span class=nav-number>8.</span> <span class=nav-text>Agent Loop 怎样执行</span></a><ol class=nav-child><li class="nav-item nav-level-3"><a class=nav-link href=#%E6%A8%A1%E5%9E%8B%E8%8A%82%E7%82%B9%E5%8F%91%E9%80%81%E4%BA%86%E4%BB%80%E4%B9%88><span class=nav-number>8.1.</span> <span class=nav-text>模型节点发送了什么</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#%E6%9D%A1%E4%BB%B6%E8%BE%B9%E5%86%B3%E5%AE%9A%E7%BB%A7%E7%BB%AD%E8%BF%98%E6%98%AF%E7%BB%93%E6%9D%9F><span class=nav-number>8.2.</span> <span class=nav-text>条件边决定继续还是结束</span></a></ol><li class="nav-item nav-level-2"><a class=nav-link href=#%E5%B7%A5%E5%85%B7%E6%98%AF%E6%80%8E%E6%A0%B7%E8%A2%AB%E5%AE%9A%E4%B9%89%E3%80%81%E9%80%89%E6%8B%A9%E5%92%8C%E6%89%A7%E8%A1%8C%E7%9A%84><span class=nav-number>9.</span> <span class=nav-text>工具是怎样被定义、选择和执行的</span></a><ol class=nav-child><li class="nav-item nav-level-3"><a class=nav-link href=#Python-%E5%87%BD%E6%95%B0%E5%8F%98%E6%88%90%E6%A8%A1%E5%9E%8B%E5%8F%AF%E7%90%86%E8%A7%A3%E7%9A%84%E5%B7%A5%E5%85%B7><span class=nav-number>9.1.</span> <span class=nav-text>Python 函数变成模型可理解的工具</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#ToolNode-%E6%8A%8A%E8%B0%83%E7%94%A8%E8%B7%AF%E7%94%B1%E5%88%B0%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0><span class=nav-number>9.2.</span> <span class=nav-text>ToolNode 把调用路由到具体实现</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#%E9%94%99%E8%AF%AF%E5%8F%AF%E4%BB%A5%E6%88%90%E4%B8%BA%E4%B8%8B%E4%B8%80%E6%AD%A5%E7%9A%84%E8%BE%93%E5%85%A5><span class=nav-number>9.3.</span> <span class=nav-text>错误可以成为下一步的输入</span></a></ol><li class="nav-item nav-level-2"><a class=nav-link href=#MCP%E3%80%81%E6%8A%80%E8%83%BD%E5%92%8C%E5%B7%A5%E5%85%B7%E6%90%9C%E7%B4%A2%E5%88%86%E5%88%AB%E8%A7%A3%E5%86%B3%E4%BB%80%E4%B9%88><span class=nav-number>10.</span> <span class=nav-text>MCP、技能和工具搜索分别解决什么</span></a><ol class=nav-child><li class="nav-item nav-level-3"><a class=nav-link href=#MCP-%E6%8A%8A%E5%A4%96%E9%83%A8%E6%9C%8D%E5%8A%A1%E9%80%82%E9%85%8D%E6%88%90%E5%B7%A5%E5%85%B7><span class=nav-number>10.1.</span> <span class=nav-text>MCP 把外部服务适配成工具</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#Skill-%E7%BB%99%E6%A8%A1%E5%9E%8B%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4%E5%92%8C%E7%BA%A6%E5%AE%9A><span class=nav-number>10.2.</span> <span class=nav-text>Skill 给模型操作步骤和约定</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#Tool-search-%E5%BB%B6%E5%90%8E%E5%8A%A0%E8%BD%BD%E5%AE%8C%E6%95%B4%E5%8F%82%E6%95%B0%E5%AE%9A%E4%B9%89><span class=nav-number>10.3.</span> <span class=nav-text>Tool search 延后加载完整参数定义</span></a></ol><li class="nav-item nav-level-2"><a class=nav-link href=#%E4%BC%9A%E8%AF%9D%E3%80%81%E8%AE%B0%E5%BF%86%E5%92%8C%E4%B8%8A%E4%B8%8B%E6%96%87%E6%80%8E%E6%A0%B7%E4%BF%9D%E5%AD%98><span class=nav-number>11.</span> <span class=nav-text>会话、记忆和上下文怎样保存</span></a><ol class=nav-child><li class="nav-item nav-level-3"><a class=nav-link href=#Checkpoint-%E4%BF%9D%E5%AD%98%E6%89%A7%E8%A1%8C%E7%8A%B6%E6%80%81><span class=nav-number>11.1.</span> <span class=nav-text>Checkpoint 保存执行状态</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#%E9%95%BF%E6%9C%9F%E8%AE%B0%E5%BF%86%E6%9C%89%E7%8B%AC%E7%AB%8B%E7%9A%84%E5%8F%AC%E5%9B%9E%E4%B8%8E%E6%8F%90%E5%8F%96%E6%B5%81%E7%A8%8B><span class=nav-number>11.2.</span> <span class=nav-text>长期记忆有独立的召回与提取流程</span></a><li class="nav-item nav-level-3"><a class=nav-link href=#%E4%B8%8A%E4%B8%8B%E6%96%87%E8%BF%87%E9%95%BF%E6%97%B6%E5%8E%8B%E7%BC%A9%E6%A8%A1%E5%9E%8B%E8%BE%93%E5%85%A5><span class=nav-number>11.3.</span> <span class=nav-text>上下文过长时压缩模型输入</span></a></ol><li class="nav-item nav-level-2"><a class=nav-link href=#%E6%9D%83%E9%99%90%E3%80%81%E4%BA%BA%E5%B7%A5%E7%A1%AE%E8%AE%A4%E5%92%8C%E4%B8%AD%E6%96%AD%E7%9A%84%E8%BE%B9%E7%95%8C><span class=nav-number>12.</span> <span class=nav-text>权限、人工确认和中断的边界</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#%E4%BB%8E%E4%BB%A3%E7%A0%81%E7%9C%8B%EF%BC%8COctop-%E7%9A%84%E4%BC%98%E5%8A%BF%E5%9C%A8%E5%93%AA%E9%87%8C><span class=nav-number>13.</span> <span class=nav-text>从代码看,Octop 的优势在哪里</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E8%A6%81%E5%87%86%E5%A4%87%E4%BB%80%E4%B9%88><span class=nav-number>14.</span> <span class=nav-text>本地部署要准备什么</span></a><li class="nav-item nav-level-2"><a class=nav-link href=#%E4%B8%8B%E4%B8%80%E6%AD%A5%E6%80%8E%E6%A0%B7%E9%AA%8C%E8%AF%81%E8%BF%99%E4%BA%9B%E5%88%A4%E6%96%AD><span class=nav-number>15.</span> <span class=nav-text>下一步怎样验证这些判断</span></a></ol></div></div><div class="site-overview-wrap sidebar-panel"><div class="site-author animated" itemprop=author itemscope itemtype=http://schema.org/Person><img alt=Nicksxs class=site-author-image itemprop=image src=/uploads/avatar.jpg><p class=site-author-name itemprop=name>Nicksxs<div class=site-description itemprop=description>Nicksxs 的技术博客,深入 Java 运行时与生产诊断、低成本大模型推理和 Agent 工程实践。</div></div><div class="site-state-wrap animated"><nav class=site-state><div class="site-state-item site-state-posts"><a href=/archives/><span class=site-state-item-count>394</span> <span class=site-state-item-name>日志</span></a></div><div class="site-state-item site-state-categories"><a href=/categories/><span class=site-state-item-count>181</span> <span class=site-state-item-name>分类</span></a></div><div class="site-state-item site-state-tags"><a href=/tags/><span class=site-state-item-count>347</span> <span class=site-state-item-name>标签</span></a></div></nav></div><div class="links-of-author animated"><span class=links-of-author-item><a rel="noopener me" title="GitHub → https://github.com/nicksxs" href=https://github.com/nicksxs target=_blank><i class="fab fa-github fa-fw"></i>GitHub</a> </span><span class=links-of-author-item><a rel="noopener me" title="E-Mail → mailto:nicksxs1202@gmail.com" href=mailto:nicksxs1202@gmail.com target=_blank><i class="fa fa-envelope fa-fw"></i>E-Mail</a></span></div><div class="cc-license animated" itemprop=license><a class=cc-opacity href=https://creativecommons.org/licenses/by-nc-sa/4.0/ rel=noopener target=_blank><img alt="Creative Commons" src=https://cdnjs.cloudflare.com/ajax/libs/creativecommons-vocabulary/2020.11.3/assets/license_badges/small/by_nc_sa.svg></a></div><div class="widget-wrap sidebar-tag-cloud"><div class=tag-cloud-tags><a class=tag-cloud-10 href=/tags/Java/ style=font-size:16px>Java</a><a class=tag-cloud-9 href=/tags/leetcode/ style=font-size:15.62px>leetcode</a><a class=tag-cloud-8 href=/tags/LLM/ style=font-size:15.23px>LLM</a><a class=tag-cloud-8 href=/tags/%E7%94%9F%E6%B4%BB/ style=font-size:14.85px>生活</a><a class=tag-cloud-7 href=/tags/%E9%A2%98%E8%A7%A3/ style=font-size:14.46px>题解</a><a class=tag-cloud-6 href=/tags/SpringBoot/ style=font-size:14.08px>SpringBoot</a><a class=tag-cloud-6 href=/tags/MySQL/ style=font-size:14.08px>MySQL</a><a class=tag-cloud-5 href=/tags/C/ style=font-size:13.69px>C++</a><a class=tag-cloud-5 href=/tags/Redis/ style=font-size:13.31px>Redis</a><a class=tag-cloud-4 href=/tags/Tomcat/ style=font-size:12.92px>Tomcat</a><a class=tag-cloud-4 href=/tags/Mybatis/ style=font-size:12.92px>Mybatis</a><a class=tag-cloud-3 href=/tags/%E5%B0%8F%E6%8A%80%E5%B7%A7/ style=font-size:12.54px>小技巧</a><a class=tag-cloud-2 href=/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/ style=font-size:12.15px>数据结构</a><a class=tag-cloud-2 href=/tags/%E6%BA%90%E7%A0%81/ style=font-size:12.15px>源码</a><a class=tag-cloud-2 href=/tags/MQ/ style=font-size:11.77px>MQ</a><a class=tag-cloud-2 href=/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/ style=font-size:11.77px>消息队列</a><a class=tag-cloud-2 href=/tags/RocketMQ/ style=font-size:11.77px>RocketMQ</a><a class=tag-cloud-2 href=/tags/%E8%BF%90%E5%8A%A8/ style=font-size:11.77px>运动</a><a class=tag-cloud-1 href=/tags/php/ style=font-size:11.38px>php</a><a class=tag-cloud-0 href=/tags/Spring/ style=font-size:11px>Spring</a><a class=tag-cloud-0 href=/tags/linux/ style=font-size:11px>linux</a><a class=tag-cloud-0 href=/tags/Docker/ style=font-size:11px>Docker</a><a class=tag-cloud-0 href=/tags/%E5%87%8F%E8%82%A5/ style=font-size:11px>减肥</a><a class=tag-cloud-0 href=/tags/%E8%B7%91%E6%AD%A5/ style=font-size:11px>跑步</a></div></div><div class="affiliate-creative affiliate-creative--sidebar" data-affiliate-id=tencent-workbuddy><a aria-label="腾讯 WorkBuddy" rel="sponsored noopener" href=https://cloud.tencent.com/act/cps/redirect?redirect=6871&cps_key=2e33a1eedb380997d03618b4a5ba6ca7&from=console target=_blank><img alt="腾讯 WorkBuddy AI 办公工作台" decoding=async height=389 loading=lazy src=/uploads/affiliate/tencent-workbuddy.webp width=690> </a><span class=affiliate-disclosure>推广</span></div></div></div></div><div class="sidebar-inner sidebar-blogroll"><div class="links-of-blogroll animated"><div class=links-of-blogroll-title><i class="fa fa-globe fa-fw"></i> 链接</div><ul class=links-of-blogroll-list><li class=links-of-blogroll-item><a href=https://covermusic.cn/ rel=noopener target=_blank title=https://covermusic.cn>69伙伴</a></ul></div></div></aside></div><div class="main-inner post posts-expand"><div class=post-block><article class=post-content itemscope itemtype=http://schema.org/Article lang=zh-CN><link href=https://nicksxs.me/2026/10/10/octop-local-deployment/ itemprop=mainEntityOfPage><span hidden itemprop=author itemscope itemtype=http://schema.org/Person><meta content=/uploads/avatar.jpg itemprop=image><meta content=Nicksxs itemprop=name></span><span hidden itemprop=publisher itemscope itemtype=http://schema.org/Organization><meta content="Nicksxs's Blog" itemprop=name><meta content="Nicksxs 的技术博客,深入 Java 运行时与生产诊断、低成本大模型推理和 Agent 工程实践。" itemprop=description></span><span hidden itemprop=post itemscope itemtype=http://schema.org/CreativeWork><meta content="腾讯 Octop 是什么:WorkBuddy 对比、Agent Loop 与本地部署 | Nicksxs's Blog" itemprop=name><meta content="介绍腾讯 Octop 的产品定位与 WorkBuddy 对比,解释 Deep Agents、LangChain 和 LangGraph 的分工,再沿源码追踪 Agent Loop、工具调用、会话状态与权限边界,给出本地部署要求和验证路径。" itemprop=description></span><header class=post-header><h1 itemprop="name headline" class=post-title>腾讯 Octop 是什么:WorkBuddy 对比、Agent Loop 与本地部署</h1><div class=post-meta-container><div class=post-meta><span class=post-meta-item><span class=post-meta-item-icon><i class="far fa-calendar"></i> </span><span class=post-meta-item-text>发表于</span> <time itemprop="dateCreated datePublished" title="创建时间:2026-10-10 20:00:00" datetime=2026-10-10T20:00:00+08:00>2026-10-10</time> </span><span class=post-meta-item><span class=post-meta-item-icon><i class="far fa-calendar-check"></i> </span><span class=post-meta-item-text>更新于</span> <time title="修改时间:2026-10-11 09:30:00" datetime=2026-10-11T09:30:00+08:00 itemprop=dateModified>2026-10-11</time> </span><span class=post-meta-item><span class=post-meta-item-icon><i class="far fa-folder"></i> </span><span class=post-meta-item-text>分类于</span> <span itemprop=about itemscope itemtype=http://schema.org/Thing><a href=/categories/AI/ itemprop=url rel=index><span itemprop=name>AI</span></a> </span></span><span class="post-meta-item cloudflare-page-counter" data-title="腾讯 Octop 是什么:WorkBuddy 对比、Agent Loop 与本地部署" data-increment=true data-path=/2026/10/10/octop-local-deployment/ title=阅读次数><span class=post-meta-item-icon><i class="far fa-eye"></i> </span><span class=post-meta-item-text>阅读次数:</span> <span class=cloudflare-page-counter-count></span></span></div><div class=post-description>介绍腾讯 Octop 的产品定位与 WorkBuddy 对比,解释 Deep Agents、LangChain 和 LangGraph 的分工,再沿源码追踪 Agent Loop、工具调用、会话状态与权限边界,给出本地部署要求和验证路径。</div></div></header><div class=post-body itemprop=articleBody><p>让 AI 整理一批资料时,我们通常还希望它能读取文件、查找补充信息、写出笔记,再把结果发到常用的聊天软件里。Octop 围绕这些任务,把模型、工具、文件工作区和消息入口组合成一套可以自己部署的 AI 助手。<p>腾讯云的<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/README_CN.md rel=noopener target=_blank>官方仓库</a>把 Octop 定位为开源、自托管、支持多用户和多 Agent 的助手平台。它与 WorkBuddy 的功能有重合,也常被拿来比较。读源码之前,先说清楚它能做什么,以及两者的差别。<p>本文于 2026 年 10 月 11 日核对产品文档。Octop 的功能和源码分析固定为 <a href=https://github.com/TencentCloud/Octop/tree/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda rel=noopener target=_blank>应用的 <code>0c5a46a</code> 提交</a>,依赖按该提交的 <code>uv.lock</code> 读取;WorkBuddy 对比使用当天可访问的官方文档。文中的任务轨迹是说明机制的例子,尚未进行实机部署、两款产品的任务对照或性能测量。</p><span id=more></span><h2 id=Octop-是什么,能做什么><a title="Octop 是什么,能做什么" class=headerlink href=#Octop-是什么,能做什么></a>Octop 是什么,能做什么</h2><p>Octop 提供的是一套 AI 助手应用。安装后有 Web 控制台,也有桌面客户端和 CLI,可以配置模型、创建专家、接入工具、管理会话与定时任务。模型需要另外接入,可以使用云端 API,也可以连接 Ollama 等本地模型服务。<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/README_CN.md rel=noopener target=_blank>使用入口和模型配置见官方说明</a>。<p>这里的 Agent 可以理解成“能根据任务选择工具、观察结果并继续行动的助手”。Octop 中的“专家”则是一套具体配置:使用什么模型、遵循哪些提示、有哪些技能和工具、文件放在哪个工作区。资料整理专家与代码专家可以连接同一个模型,但拥有不同的资料和工具。<p>按照官方提供的能力,它可以用于这些场景。具体效果仍取决于模型、工具配置和任务本身:<ul><li><strong>个人资料与日常任务</strong>:读取资料、检索知识库、写周报或笔记,保存会话和记忆,安排定时任务。<li><strong>网页操作与开发辅助</strong>:使用浏览器和终端工具处理任务,或通过 ACP(Agent Client Protocol)把编程任务交给已安装并认证的外部编程助手。<li><strong>家庭或小团队共用</strong>:管理员维护一个实例,为成员分配账号;每位用户可以有自己的专家与工作区,也可以共享专家配置和知识库。多专家协调功能标为 Beta。</ul><p>这些能力的<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/README_CN.md rel=noopener target=_blank>官方功能列表</a>同时列出了飞书、钉钉、QQ、微信等消息通道。配置通道后,可以从聊天软件向专家发起任务;各平台仍有自己的接入与授权要求。<p>“自托管”表示你负责运行这套助手服务,可以管理应用配置、数据库和工作区。接入云端模型后,请求仍会发送到模型供应商;使用联网工具和连接器时,还会与相应服务交换数据。是否全程在本地处理,需要逐项检查模型和工具的数据流。<h2 id=“开源版-WorkBuddy”该怎么理解><a title="“开源版 WorkBuddy”该怎么理解" class=headerlink href=#“开源版-WorkBuddy”该怎么理解></a>“开源版 WorkBuddy”该怎么理解</h2><p>WorkBuddy 是腾讯提供的 AI 工作台。用户用自然语言提出任务,它可以规划步骤、处理授权的本地文件,并生成文档、表格、演示稿或分析结果。这些是它在<a href=https://www.workbuddy.ai/docs/workbuddy/Overview rel=noopener target=_blank>官方产品介绍</a>中的主要使用方向。<p>把 Octop 类比成“开源版 WorkBuddy”,容易理解它们的共同用途:用户提出任务,助手调用工具处理资料与文件,交付可检查的产物。Octop 还把应用源码和运行时开放出来,允许自行部署与修改。<p>但在本次核对的 Octop 官方仓库、发布页及 WorkBuddy 产品文档中,没有找到腾讯把 Octop 定义为“WorkBuddy 源码开源版本”的说明。Octop 的<a href=https://tencentcloud.github.io/Octop/ rel=noopener target=_blank>官方开源页面</a>明确写的是“源自 LightClaw ACE”。因此,本文把这个称呼当作功能类比,不据此推断两者同源、同团队或功能完全一致。<h2 id=与-WorkBuddy-对比,差别在哪里><a title="与 WorkBuddy 对比,差别在哪里" class=headerlink href=#与-WorkBuddy-对比,差别在哪里></a>与 WorkBuddy 对比,差别在哪里</h2><p>下面比较的是公开文档中的定位与能力。Octop 对应前述固定提交,WorkBuddy 对应 2026 年 10 月 11 日的产品文档;没有做同一任务下的速度、成功率或产物质量测试。<table><thead><tr><th>比较项<th>Octop<th>WorkBuddy<tbody><tr><td>产品重点<td>自托管 AI 助手平台,面向个人、家庭和小团队,也提供桌面使用入口<td>面向工作任务的 AI 工作台,把文件处理、办公产物和协作做成应用功能<tr><td>运行与维护<td>自己运行实例,管理服务、数据、备份和升级;可从桌面版开始,也可部署服务<td>安装产品客户端,使用账号及产品提供的功能;更新与权益遵循产品规则<tr><td>模型接入<td>自行配置模型供应商或本地模型服务,按专家选择模型<td>有内置模型,也支持自定义 API 和 Ollama 本地模型<tr><td>扩展方式<td>可配置专家、技能、MCP、插件,还可修改应用、Harness 与 backend 代码<td>开放平台支持自定义专家、技能和连接器,专家可声明 MCP 依赖<tr><td>多人和多 Agent<td>同一实例支持多个用户及专家,提供共享配置、知识库和 Beta 专家团队协调<td>提供专家与专家团队,也有团队空间和多人、多 Agent 资料协作<tr><td>工作区与执行环境<td>可配置本地目录、Docker 等 backend,以及 PostgreSQL、COS/S3 等文件存储后端;隔离能力取决于具体配置<td>产品可处理授权的本地文件;专家与连接器按照产品定义的接口、权限和配置工作<tr><td>费用与投入<td>源码采用 MIT 许可证;模型 API、本地算力、服务器及维护时间另行计算<td>有免费体验与付费订阅;自定义模型费用按第三方供应商规则承担</table><p>Octop 一侧的依据是<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/README_CN.md rel=noopener target=_blank>功能说明</a>及后文分析的实现。WorkBuddy 一侧分别依据<a href=https://www.workbuddy.cn/docs/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/Model rel=noopener target=_blank>模型配置</a>、<a href=https://open.workbuddy.cn/en/docs/expert rel=noopener target=_blank>开放平台专家文档</a>、<a href=https://www.workbuddy.cn/docs/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/Library/Collaboration rel=noopener target=_blank>多人多 Agent 协作</a>和<a href=https://www.workbuddy.cn/docs/workbuddy/Pricing rel=noopener target=_blank>订阅说明</a>。<p>所以,只想接入本地模型、添加一个技能或使用 MCP,未必需要换到 Octop。WorkBuddy 的官方文档已经提供这些接入方式。Octop 的区别更集中在实例与代码的控制权:你可以检查并修改工具执行链、会话保存方式和工作区后端,也要承担配置、维护和验证的工作。<p>按这些差别判断,想尽快使用现成办公流程的用户,可以先评估 WorkBuddy;希望在自己的电脑或服务器维护一套助手,并需要修改运行机制的用户,可以进一步评估 Octop。这是基于部署方式与扩展范围的选型判断,尚无证据证明哪一个在同样任务上更快、更稳定或更便宜。<p>接下来以“读一下这个项目的文档,整理成一份笔记”为例,追踪任务怎样执行。Octop 应用层管理用户、专家和消息入口;<code>octop-harness</code> 装配模型、工具和运行策略;Deep Agents 与 LangGraph 组织反复调用模型和工具的循环。沿着这条链路,可以看清自托管后究竟能控制哪些部分。<h2 id=先确定分析的是哪一套代码><a class=headerlink href=#先确定分析的是哪一套代码 title=先确定分析的是哪一套代码></a>先确定分析的是哪一套代码</h2><p>这个项目拆成了多个仓库。如果只在 Octop 应用里搜索一个 <code>while</code> 循环,很容易漏掉实际执行逻辑。<table><thead><tr><th>层次<th>本文对应的代码<th>主要职责<tbody><tr><td>Octop 应用<td>提交 <code>0c5a46a</code>,项目版本 <code>1.0.2b6</code><td>Dashboard、IM、用户权限、专家配置、知识库、定时任务和历史展示<tr><td>Octop Harness<td><code>octop-harness==1.0.1</code><td>将模型、工具、记忆、backend 和 middleware 装成可运行的 Agent<tr><td>Deep Agents<td><code>deepagents==0.7.9</code><td>文件工具、技能、子 Agent、上下文压缩及 Agent 构建<tr><td>LangChain / LangGraph<td><code>langchain==1.3.18</code>、<code>langgraph==1.2.11</code><td>模型节点、工具节点、状态图、条件跳转和 checkpoint</table><p>版本来自<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/uv.lock rel=noopener target=_blank>应用锁文件</a>。<code>pyproject.toml</code> 对 Harness 的要求是 <code>>=1.0.1</code>,所以重新解析依赖的安装、桌面包和这个源码快照,未必拥有完全相同的运行版本。<p>本文同时核对了锁文件中的 Python wheel 与对应发布标签。后面的代码链接固定到提交,避免用 Harness 新版本的行为解释旧锁文件。<h2 id=Deep-Agents-和-LangGraph-各自负责什么><a title="Deep Agents 和 LangGraph 各自负责什么" class=headerlink href=#Deep-Agents-和-LangGraph-各自负责什么></a>Deep Agents 和 LangGraph 各自负责什么</h2><p>读到 <code>create_deep_agent</code>、<code>create_agent</code> 和 <code>graph.astream</code> 时,容易把这几个名字当成不同的助手。它们对应的是构建和运行助手的不同层次。先以“读取项目资料,整理成一份笔记”为例,说明这些库提供什么,再看 Octop 怎样把它们装起来。<h3 id=Deep-Agents:给-Agent-配上处理长任务的基础能力><a title="Deep Agents:给 Agent 配上处理长任务的基础能力" class=headerlink href=#Deep-Agents:给-Agent-配上处理长任务的基础能力></a>Deep Agents:给 Agent 配上处理长任务的基础能力</h3><p><a href=https://docs.langchain.com/oss/python/deepagents/overview rel=noopener target=_blank>Deep Agents</a> 是 LangChain 团队提供的开源 Agent harness。这里的 harness 可以理解成一套运行支撑程序:连接模型调用,准备工具和上下文,让助手能持续执行任务。<p>对资料整理任务来说,只把用户的一句话发送给模型还不够。助手需要找到文件、读取内容、保留中间结果,再写出笔记。任务变长后,还要处理上下文容量和子任务分工。Deep Agents 把这些常用能力组合起来,让开发者通过 <code>create_deep_agent</code> 构建 Agent。<p>本文对应的 <code>deepagents==0.7.9</code> 中,可以看到这些能力的装配路径:<ul><li><strong>文件工具与 backend</strong>:提供查找、读取、写入和编辑文件的工具,由 backend 决定文件如何存取;命令执行还取决于 backend 是否支持相应接口。<li><strong>技能加载</strong>:从技能目录读取任务说明,按需向模型提供详细流程。例如整理笔记时,可以加载规定标题、引用方式和输出位置的技能。<li><strong>子 Agent</strong>:通过 <code>task</code> 工具委派子任务,让子 Agent 在自己的上下文里完成工作,再把结果交回主 Agent;具体工具是否可用受配置影响。<li><strong>上下文管理</strong>:处理较大的工具结果,并在需要时摘要对话,减少长任务占满上下文的情况。摘要仍可能遗漏细节。</ul><p>这些职责来自<a href=https://github.com/langchain-ai/deepagents/blob/71552532bb33a8744a5b1c0b48e8047478169c42/libs/deepagents/deepagents/graph.py rel=noopener target=_blank>固定版本的构建代码</a>。官方概览用于解释概念,本文的默认值和执行行为仍以锁定版本为准。<h3 id=LangGraph:保存状态,控制执行步骤之间的流转><a class=headerlink href=#LangGraph:保存状态,控制执行步骤之间的流转 title=LangGraph:保存状态,控制执行步骤之间的流转></a>LangGraph:保存状态,控制执行步骤之间的流转</h3><p><a href=https://docs.langchain.com/oss/python/langgraph/overview rel=noopener target=_blank>LangGraph</a> 是用于编排有状态任务的底层框架和运行时。“有状态”表示程序会保留当前消息、工具结果和执行进度,后续步骤可以继续使用这些信息。<p>它把执行过程组织成图。这里的图描述的是程序执行关系:<table><thead><tr><th>概念<th>在资料整理任务中的含义<tbody><tr><td>节点(node)<td>一段执行逻辑,例如调用模型,或执行模型提出的文件读取工具<tr><td>状态(state)<td>步骤之间传递的数据,例如用户任务、已有消息与工具返回内容<tr><td>边(edge)<td>决定接下来运行哪个节点;条件边可以根据是否有待执行工具调用,选择继续或结束</table><p>例如,模型生成 <code>read_file</code> 调用后,程序沿条件边进入工具节点。工具把文件内容加回消息状态,程序再回到模型节点。模型可以继续查找其他文件,也可以写出最终笔记。图里的执行结构由程序定义,每一步具体使用哪个工具则由模型输出和运行规则共同决定。<p>LangGraph 还提供流式输出、checkpoint 和人工交互暂停等机制。配置持久化 checkpointer 后,可以按 <code>thread_id</code> 保存图状态;配置人工交互后,可以暂停执行,等待用户决定,再继续运行。内存中的 checkpointer 无法在进程重启后保留数据,外部工具产生的写文件、发请求等副作用也需要应用另行处理。<a href=https://docs.langchain.com/oss/python/langgraph/persistence rel=noopener target=_blank>持久化说明</a><h3 id=Octop-怎样把这些层连接起来><a title="Octop 怎样把这些层连接起来" class=headerlink href=#Octop-怎样把这些层连接起来></a>Octop 怎样把这些层连接起来</h3><p>中间还有一层 <strong>LangChain</strong>。在本文分析的路径中,它提供模型与工具接口,并通过 <code>create_agent</code> 构建常见的模型与工具循环;这个循环运行在 LangGraph 上。<a href=https://docs.langchain.com/oss/python/langchain/agents rel=noopener target=_blank>LangChain Agent 说明</a><p>Octop 的实际装配关系可以简化为:<figure class="highlight text"><table><tr><td class=gutter><pre><span class=line>1</span><br><span class=line>2</span><br><span class=line>3</span><br><span class=line>4</span><br><span class=line>5</span><br><span class=line>6</span><br><span class=line>7</span><br><span class=line>8</span><br><span class=line>9</span><br></pre><td class=code><pre><span class=line>Octop 应用:读取用户、专家、连接器和工作区配置</span><br><span class=line> ↓</span><br><span class=line>Octop Harness:组合模型、工具、记忆与运行策略</span><br><span class=line> ↓</span><br><span class=line>Deep Agents create_deep_agent:加入文件、技能、子 Agent 和上下文管理</span><br><span class=line> ↓</span><br><span class=line>LangChain create_agent:构建 model / tools 节点与条件跳转</span><br><span class=line> ↓</span><br><span class=line>LangGraph:运行状态图,处理状态保存、流式事件与暂停恢复</span><br></pre></table></figure><p>调用链可以对照 <a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/agent.py#L1663 rel=noopener target=_blank>HarnessAgent._build_graph</a>、<a href=https://github.com/langchain-ai/deepagents/blob/71552532bb33a8744a5b1c0b48e8047478169c42/libs/deepagents/deepagents/graph.py rel=noopener target=_blank>Deep Agents graph.py</a> 和 <a href=https://github.com/langchain-ai/langchain/blob/7d4b42b57235020e6f496fdfebab44c3ca1b1f5b/libs/langchain_v1/langchain/agents/factory.py rel=noopener target=_blank>LangChain factory.py</a> 阅读。<p>所以,文件工具、子 Agent、上下文压缩和执行状态保存,有明确的上游实现。Octop 在这些基础上加入用户与专家管理、统一消息入口、连接器、知识库和产物展示。这样更容易判断它的工程贡献,也能避免把上游框架已有的能力都算成 Octop 独有优势。<h2 id=一条消息怎样进入-Agent><a title="一条消息怎样进入 Agent" class=headerlink href=#一条消息怎样进入-Agent></a>一条消息怎样进入 Agent</h2><p>先看 Dashboard 的普通执行请求。正常路径可以简化为:<figure class="highlight text"><table><tr><td class=gutter><pre><span class=line>1</span><br><span class=line>2</span><br><span class=line>3</span><br><span class=line>4</span><br><span class=line>5</span><br><span class=line>6</span><br><span class=line>7</span><br><span class=line>8</span><br><span class=line>9</span><br><span class=line>10</span><br><span class=line>11</span><br><span class=line>12</span><br><span class=line>13</span><br><span class=line>14</span><br><span class=line>15</span><br></pre><td class=code><pre><span class=line>Dashboard user_turn</span><br><span class=line> ↓</span><br><span class=line>chat/ws.py:认证、校验专家和会话</span><br><span class=line> ↓</span><br><span class=line>prepare_dashboard_turn:准备本轮配置</span><br><span class=line> ↓</span><br><span class=line>channel_manager.enqueue:进入进程内消息管道</span><br><span class=line> ↓</span><br><span class=line>GlobalProcessor.iter_turn_chunks</span><br><span class=line> ↓</span><br><span class=line>AgentManager.stream:取得会话执行锁</span><br><span class=line> ↓</span><br><span class=line>HarnessAgent.stream → LangGraphProtocol</span><br><span class=line> ↓</span><br><span class=line>graph.astream:开始模型与工具循环</span><br></pre></table></figure><h3 id=入口先处理身份和会话><a class=headerlink href=#入口先处理身份和会话 title=入口先处理身份和会话></a>入口先处理身份和会话</h3><p><a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/src/octop/api/routers/chat/ws.py rel=noopener target=_blank>WebSocket 路由</a>处理 <code>user_turn</code> 消息前,会验证 token、检查用户对专家的访问权限,再检查会话归属。随后调用 <code>prepare_dashboard_turn</code>,将请求变成统一的 <code>InboundMessage</code>,交给 <code>channel_manager.enqueue</code>。<p>Octop 的单进程设计包含进程内排队。官方说无须外部消息队列,指的是不用另外部署消息代理或独立 worker。排队、分发和执行协调依然存在。<p><a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/src/octop/api/routers/chat/turn.py rel=noopener target=_blank>本轮准备代码</a>会解析或创建 <code>thread_id</code>,核对模型、技能和 MCP 选择,并预加载本轮选中的 MCP 服务。上传文件会转成工作区路径等内容块,不依赖前端预览 URL 作为文件执行依据。<p>这里有 3 个不同的身份:<code>user_id</code> 表示使用者,<code>agent_id</code> 表示专家,<code>thread_id</code> 表示会话。同一个专家可以有多个会话;同一个模型也可以被不同专家使用。<h3 id=消息处理器准备运行参数><a class=headerlink href=#消息处理器准备运行参数 title=消息处理器准备运行参数></a>消息处理器准备运行参数</h3><p><a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/src/octop/infra/gateway/process/processor.py#L897 rel=noopener target=_blank>GlobalProcessor.iter_turn_chunks</a>把消息交给运行时前,还会处理斜杠命令、待回答的人工交互,再决定是否进入普通模型请求。某些命令可以直接结束,用户发来一条消息并不一定会调用 LLM。<p>普通请求由 <code>_build_dashboard_request</code> 组合消息内容、模型选择、推理参数、知识库范围和本轮工具设置。模型收到的内容因此受当前会话和配置影响,并非只取聊天框里的一句话。<p>随后调用 <a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/src/octop/infra/agents/manager.py#L1293 rel=noopener target=_blank>AgentManager.stream</a>。它按 <code>(agent_id, thread_id)</code> 取得执行锁,让同一会话的普通执行与人工确认恢复共用一道 checkpoint 写入保护。不同会话仍可能并发,文件系统和外部服务的冲突需要另行处理。<h2 id=专家启动时到底装了什么><a class=headerlink href=#专家启动时到底装了什么 title=专家启动时到底装了什么></a>专家启动时到底装了什么</h2><p>“专家”在代码里是一套运行配置。<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/src/octop/infra/agents/manager.py#L3068 rel=noopener target=_blank>AgentManager._build_harness_config</a>从数据库里的 <code>AgentRow</code> 读取配置,解析工作区、backend、默认模型、系统提示、技能、连接器和安全策略。<p>应用还会注入自己的工具和 middleware,例如知识库工具、定时任务工具、插件工具、Token 配额检查、浏览器配置和产物记录。Harness 再加入网页抓取、浏览器操作、记忆工具等能力。有些能力受配置或凭据控制,不能把候选工具清单视为每个专家都已启用的工具。<p>最终 <a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/agent.py#L1663 rel=noopener target=_blank>HarnessAgent._build_graph</a>把模型、工具、middleware、backend、技能路径、记忆路径和 checkpointer 传给 <code>deepagents.create_deep_agent</code>。Deep Agents 再调用 LangChain 的 <code>create_agent</code>,编译出 LangGraph 状态图。<p>这解释了两个容易混在一起的概念:<ul><li><strong>模型</strong>负责根据当前上下文生成回答或工具调用。<li><strong>专家运行环境</strong>决定模型能看到哪些资料和工具、工具在哪里执行、状态怎样保存。</ul><p>调整专家提示词和工具组合,可以改变任务分工。模型本身的理解、推理和工具调用能力仍然是任务质量的主要约束。<h2 id=Agent-Loop-怎样执行><a title="Agent Loop 怎样执行" class=headerlink href=#Agent-Loop-怎样执行></a>Agent Loop 怎样执行</h2><p>Agent Loop 可以理解成“判断下一步、执行动作、读取结果、继续判断”的循环。实际源码通过状态图组织它,核心是 <code>model</code> 节点与 <code>tools</code> 节点。<figure class="highlight text"><table><tr><td class=gutter><pre><span class=line>1</span><br><span class=line>2</span><br><span class=line>3</span><br><span class=line>4</span><br><span class=line>5</span><br><span class=line>6</span><br><span class=line>7</span><br><span class=line>8</span><br><span class=line>9</span><br><span class=line>10</span><br><span class=line>11</span><br><span class=line>12</span><br><span class=line>13</span><br></pre><td class=code><pre><span class=line>当前消息状态</span><br><span class=line> ↓</span><br><span class=line>model:模型读取消息和工具定义</span><br><span class=line> ↓</span><br><span class=line>有没有待执行的 tool_calls?</span><br><span class=line> ├─ 没有 → 本轮结束</span><br><span class=line> └─ 有</span><br><span class=line> ↓</span><br><span class=line> tools:检查并执行工具</span><br><span class=line> ↓</span><br><span class=line> ToolMessage 加回消息状态</span><br><span class=line> ↓</span><br><span class=line> 返回 model,决定下一步</span><br></pre></table></figure><h3 id=模型节点发送了什么><a class=headerlink href=#模型节点发送了什么 title=模型节点发送了什么></a>模型节点发送了什么</h3><p>LangChain 的 <a href=https://github.com/langchain-ai/langchain/blob/7d4b42b57235020e6f496fdfebab44c3ca1b1f5b/libs/langchain_v1/langchain/agents/factory.py#L1519 rel=noopener target=_blank>amodel_node</a>会创建 <code>ModelRequest</code>,里面有当前消息、系统消息、工具清单、模型和运行状态。middleware 可以在请求发出前修改这些内容。<p>例如,Harness 的模型路由器根据本轮指定模型、选择函数、多模态需求和默认模型选择实际模型;MCP middleware 筛选本轮连接器工具;对话模式限制当前可执行动作;记忆与摘要机制补充或缩减模型看到的上下文。<p>经过处理后,LangChain 在 <code>_get_bound_model</code> 中调用 <code>model.bind_tools(...)</code>,把最终工具定义交给模型适配器,再通过 <code>ainvoke(messages)</code> 发送请求。不同模型服务的 wire format 由对应适配器转换。<p>模型返回 <code>AIMessage</code>。它可能包含普通文字,也可能包含一个或多个 <code>tool_calls</code>。工具调用的核心信息是名称、参数和调用 ID。<h3 id=条件边决定继续还是结束><a class=headerlink href=#条件边决定继续还是结束 title=条件边决定继续还是结束></a>条件边决定继续还是结束</h3><p><a href=https://github.com/langchain-ai/langchain/blob/7d4b42b57235020e6f496fdfebab44c3ca1b1f5b/libs/langchain_v1/langchain/agents/factory.py#L1927 rel=noopener target=_blank>_make_model_to_tools_edge</a>会查找尚未得到结果的调用,按调用 ID 排除已经处理的项目,然后把待执行调用送往 <code>tools</code> 节点。同一模型响应中的多个调用可以分派执行;存在数据依赖的动作仍需要先取得前一步结果。<p>工具执行后,<code>_make_tools_to_model_edge</code> 默认返回模型节点。模型看到结果,决定继续调用工具、改用别的方法,或者给出最终回复。<p>界面显示的是这条执行过程的事件投影。Harness 的 <a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/protocols/langgraph.py#L143 rel=noopener target=_blank>LangGraphProtocol</a>订阅状态、节点更新、模型消息和自定义事件,转换成 <code>token</code>、<code>tool_call_chunk</code>、<code>tool_result</code>、<code>usage</code>、<code>hitl_required</code> 等事件,再由应用记录历史并交给消息通道。模型接收的 <code>ToolMessage</code> 与前端展示的工具结果事件,处在同一执行链的不同位置。<p>普通循环的结束条件是模型不再返回工具调用。另外还有 middleware 的显式跳转、<code>return_direct</code> 工具、结构化结果等分支。人工确认、取消或异常也会中断本轮执行。<p>这一判断只说明执行图可以结束。它不验证笔记里的事实是否正确,也不证明任务满足用户要求。质量判断还需要检查来源、工具输出和最终产物。<p>下面是按源码归纳的伪代码,不是项目中的原始函数:<figure class="highlight python"><table><tr><td class=gutter><pre><span class=line>1</span><br><span class=line>2</span><br><span class=line>3</span><br><span class=line>4</span><br><span class=line>5</span><br><span class=line>6</span><br><span class=line>7</span><br><span class=line>8</span><br><span class=line>9</span><br><span class=line>10</span><br><span class=line>11</span><br><span class=line>12</span><br><span class=line>13</span><br><span class=line>14</span><br><span class=line>15</span><br><span class=line>16</span><br><span class=line>17</span><br></pre><td class=code><pre><span class=line>state = load_thread_state(thread_id)</span><br><span class=line>state.messages.append(user_message)</span><br><span class=line></span><br><span class=line><span class=keyword>while</span> graph_allows_next_step:</span><br><span class=line> request = prepare_model_request(state)</span><br><span class=line> reply = <span class=keyword>await</span> model_with_tools(request)</span><br><span class=line> state.messages.append(reply)</span><br><span class=line> save_checkpoint(state)</span><br><span class=line></span><br><span class=line> <span class=keyword>if</span> <span class=keyword>not</span> reply.tool_calls:</span><br><span class=line> <span class=keyword>break</span></span><br><span class=line></span><br><span class=line> <span class=keyword>for</span> call <span class=keyword>in</span> pending_calls(reply, state):</span><br><span class=line> result = <span class=keyword>await</span> guarded_tool_dispatch(call, state)</span><br><span class=line> state.messages.append(result)</span><br><span class=line></span><br><span class=line> save_checkpoint(state)</span><br></pre></table></figure><p>真实实现由框架在图执行过程中管理 checkpoint,工具也可能返回修改状态的 <code>Command</code>。这段伪代码省略了并发、恢复和流式事件,只展示数据如何在模型与工具之间流动。<p>还有一个部署时有用的细节:该版本 Deep Agents 的图默认配置 <code>recursion_limit=9999</code>,调用方可以覆盖。它限制的是图执行步数,不能当作 9999 次模型调用,更不能当作费用上限。长期任务仍需要合理的配额、停止策略和人工验收。<a href=https://github.com/langchain-ai/deepagents/blob/71552532bb33a8744a5b1c0b48e8047478169c42/libs/deepagents/deepagents/graph.py#L919 rel=noopener target=_blank>图构建源码</a><h2 id=工具是怎样被定义、选择和执行的><a class=headerlink href=#工具是怎样被定义、选择和执行的 title=工具是怎样被定义、选择和执行的></a>工具是怎样被定义、选择和执行的</h2><p>工具调用分成 3 件事:程序注册工具,模型生成调用,运行时执行调用。<h3 id=Python-函数变成模型可理解的工具><a title="Python 函数变成模型可理解的工具" class=headerlink href=#Python-函数变成模型可理解的工具></a>Python 函数变成模型可理解的工具</h3><p>Harness 的 <code>web_fetch</code> 使用 LangChain 的 <code>@tool</code> 装饰器。它有名称、说明和带类型的参数,例如 <code>url: str</code>、可选的 <code>timeout</code>。模型看到的是转换后的工具定义,Python 实现留在运行环境中。<p>文件写入工具由 Deep Agents 提供,输入 schema 规定 <code>file_path</code> 和 <code>content</code>。名称让运行时找到实现,说明帮助模型判断何时使用,schema 约束参数结构。<a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/builtin/tools/web_fetch.py rel=noopener target=_blank>web_fetch 实现</a>、<a href=https://github.com/langchain-ai/deepagents/blob/71552532bb33a8744a5b1c0b48e8047478169c42/libs/deepagents/deepagents/middleware/filesystem.py#L1142 rel=noopener target=_blank>文件工具定义</a><p>例如,给专家一个公开 URL,让它读取 README,再写成工作区笔记。一种可能的轨迹是:<table><thead><tr><th>步骤<th>模型或运行时的动作<th>新增的信息<tbody><tr><td>1<td>模型返回 <code>web_fetch</code> 调用,参数含公开 URL<td>确定要读取的网页<tr><td>2<td>运行时调用 Python 工具<td>取得转换后的网页正文或错误文本<tr><td>3<td>模型读取工具结果,组织笔记,再调用 <code>write_file</code><td>写入路径与笔记内容<tr><td>4<td>文件 backend 执行写入并返回结果<td>得知写入是否成功<tr><td>5<td>模型根据结果回复用户<td>给出说明和产物位置</table><p>这条轨迹只是演示机制。工具可见范围、对话模式、模型输出和网页响应不同,实际轨迹也会改变。<h3 id=ToolNode-把调用路由到具体实现><a title="ToolNode 把调用路由到具体实现" class=headerlink href=#ToolNode-把调用路由到具体实现></a>ToolNode 把调用路由到具体实现</h3><p>模型可能返回这样的调用对象。这里展示的是框架规范化后的结构,不是所有模型服务都使用的原始协议:<figure class="highlight json"><table><tr><td class=gutter><pre><span class=line>1</span><br><span class=line>2</span><br><span class=line>3</span><br><span class=line>4</span><br><span class=line>5</span><br><span class=line>6</span><br><span class=line>7</span><br><span class=line>8</span><br></pre><td class=code><pre><span class=line><span class=punctuation>{</span></span><br><span class=line> <span class=attr>"name"</span><span class=punctuation>:</span> <span class=string>"web_fetch"</span><span class=punctuation>,</span></span><br><span class=line> <span class=attr>"args"</span><span class=punctuation>:</span> <span class=punctuation>{</span></span><br><span class=line> <span class=attr>"url"</span><span class=punctuation>:</span> <span class=string>"https://github.com/TencentCloud/Octop"</span></span><br><span class=line> <span class=punctuation>}</span><span class=punctuation>,</span></span><br><span class=line> <span class=attr>"id"</span><span class=punctuation>:</span> <span class=string>"call_example_01"</span><span class=punctuation>,</span></span><br><span class=line> <span class=attr>"type"</span><span class=punctuation>:</span> <span class=string>"tool_call"</span></span><br><span class=line><span class=punctuation>}</span></span><br></pre></table></figure><p><a href=https://github.com/langchain-ai/langgraph/blob/3614e88c58af63f597764218646e85c49952b2da/libs/prebuilt/langgraph/prebuilt/tool_node.py#L1161 rel=noopener target=_blank>ToolNode._arun_one</a>按名称从 <code>tools_by_name</code> 找到工具,创建 <code>ToolCallRequest</code>,让工具调用 middleware 包装执行。真正执行时,运行时注入 <code>ToolRuntime</code>、状态等程序上下文,再调用 <code>tool.ainvoke(...)</code>;带 Pydantic schema 的工具会校验参数。<p>运行时上下文和模型生成的参数是不同来源。例如,当前会话状态不需要模型凭空填写,也不应让模型自行指定其他用户身份。<p>普通工具返回值会整理成 <code>ToolMessage</code>,通过 <code>tool_call_id</code> 对应原始调用。部分工具返回 <code>Command</code>,除了消息,还能更新图状态。结果进入下一次模型请求,构成“动作有反馈”的闭环。<p>这一机制也解释了为什么输出一句“我已保存”不能证明文件存在。需要看到实际写入工具、返回结果,并在必要时复查文件。<h3 id=错误可以成为下一步的输入><a class=headerlink href=#错误可以成为下一步的输入 title=错误可以成为下一步的输入></a>错误可以成为下一步的输入</h3><p><code>web_fetch</code> 会把可恢复的 HTTP、网络或地址检查失败转成以 <code>Error:</code> 开头的文本,模型因此可以改 URL、换工具或说明失败。它还检查公开地址与重定向目标,并在响应转换阶段拒绝超过 5MiB 的正文。<p>未知工具名与部分参数错误会形成错误 <code>ToolMessage</code>,给模型一次纠正机会。<strong>并非所有异常都会自动被吞掉或重试</strong>:该版本 ToolNode 的默认异常处理只对特定工具输入错误返回文本,其他执行异常可能向上抛出。模型请求重试又是另一层机制。<p>所以,阅读日志时要区分模型服务失败、工具参数失败、工具执行失败和安全策略拒绝。这几类问题的修复方式不同。<h2 id=MCP、技能和工具搜索分别解决什么><a class=headerlink href=#MCP、技能和工具搜索分别解决什么 title=MCP、技能和工具搜索分别解决什么></a>MCP、技能和工具搜索分别解决什么</h2><p>这 3 个入口都能扩展能力,但它们在执行流程里的作用不同。<h3 id=MCP-把外部服务适配成工具><a title="MCP 把外部服务适配成工具" class=headerlink href=#MCP-把外部服务适配成工具></a>MCP 把外部服务适配成工具</h3><p><a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/mcp.py#L182 rel=noopener target=_blank>aload_mcp_tools</a>通过 <code>MultiServerMCPClient</code> 获取服务工具,再适配为 LangChain 工具对象。它使用服务名前缀,例如 <code>server_tool</code>,降低不同服务同名工具发生冲突的可能,还支持 <code>allowed_tools</code> 名单、参数别名和 schema 处理。<p>内置工具在本地 Python 里执行;MCP 工具由适配器调用对应服务。进入模型与 ToolNode 的流程保持相近,业务能力可以在外部扩展。<p>本轮 MCP 选择也有明确语义。Dashboard 传来的空列表表示用户本轮不启用连接器,处理器不会因为列表为空就重新打开默认工具。Harness 的 <a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/middleware/mcp_tools.py rel=noopener target=_blank>MCPToolMiddleware</a>会筛选模型可见的工具集。<p>这段 middleware 主要过滤 <code>ModelRequest.tools</code>。不能仅凭“模型看不见”就把它解释成完整的执行授权边界;连接器鉴权、调用前校验和实际执行环境仍要分别检查。<h3 id=Skill-给模型操作步骤和约定><a title="Skill 给模型操作步骤和约定" class=headerlink href=#Skill-给模型操作步骤和约定></a>Skill 给模型操作步骤和约定</h3><p>Skill 是目录里的 <code>SKILL.md</code> 和配套资源。Deep Agents 的 SkillsMiddleware 先提供技能名称、描述和路径,再让模型按需读取具体说明。技能内容帮助模型组织动作,实际读写和执行仍依赖工具。<p>因此,一个“资料研究技能”可以规定查找来源、核对信息和输出格式。它本身不自动获得搜索权限,也不保证模型每次都按步骤完成。<a href=https://github.com/langchain-ai/deepagents/blob/71552532bb33a8744a5b1c0b48e8047478169c42/libs/deepagents/deepagents/middleware/skills.py rel=noopener target=_blank>技能实现</a><h3 id=Tool-search-延后加载完整参数定义><a title="Tool search 延后加载完整参数定义" class=headerlink href=#Tool-search-延后加载完整参数定义></a>Tool search 延后加载完整参数定义</h3><p>工具多时,反复发送完整 schema 会增加请求体积。Harness 的 <a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/middleware/tool_search.py rel=noopener target=_blank>ToolSearchMiddleware</a>提供渐进加载。<p><code>client</code> 模式仍保留轻量的工具名称和描述,延后发送完整参数 schema。模型先调用 <code>tool_search</code>,搜索结果通过 <code>Command</code> 更新本会话的 <code>loaded_tool_names</code>;下一次模型请求再提供已加载工具的完整定义。直接调用尚未加载的工具,会得到激活错误。<p>该版本的 client 搜索按英文关键词与名称、描述的词项匹配评分,不是向量语义检索。关键词、工具描述和命名会影响发现效果。<p>这项机制也有开关条件:默认 <code>deferred_tools</code> 为空,<code>defer_mcp_tools=False</code>。只有配置了延后加载工具等条件,Harness 才装配搜索 middleware。<code>native</code> 模式依赖所用模型服务的支持,还可能回退为完整加载。<a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/config/__init__.py#L695 rel=noopener target=_blank>配置默认值</a><p>它提供降低 schema 开销的办法,也增加了一次发现工具的步骤。实际节省多少 Token、会不会漏选工具,需要任务对照测试。<h2 id=会话、记忆和上下文怎样保存><a class=headerlink href=#会话、记忆和上下文怎样保存 title=会话、记忆和上下文怎样保存></a>会话、记忆和上下文怎样保存</h2><h3 id=Checkpoint-保存执行状态><a title="Checkpoint 保存执行状态" class=headerlink href=#Checkpoint-保存执行状态></a>Checkpoint 保存执行状态</h3><p><code>thread_id</code> 随请求进入 LangGraph 配置。checkpointer 用它区分不同会话,使后续请求可以接着已有状态运行。<p><a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/agent.py#L1788 rel=noopener target=_blank>Harness 的选择逻辑</a>优先使用显式配置;没有显式配置时,可以复用 <code>octop-memory</code> 的 Memory 实例作为 checkpointer,再回退到工作区里的 <code>AsyncSqliteSaver</code>。显式 <code>False</code> 可以关闭 checkpoint,初始化失败也可能导致无法持久化。<p>checkpoint 保存的是运行图状态。它有助于保留历史、人工确认恢复和排查执行过程,但不能替外部服务提供事务保证。<p>如果一个外部写入已经成功,进程却在相关状态保存前退出,是否会重放同一动作,取决于恢复路径和工具的幂等设计。付款、发布、发送等动作仍需要业务侧的防重复机制。本文未进行断电与重放实测。<h3 id=长期记忆有独立的召回与提取流程><a class=headerlink href=#长期记忆有独立的召回与提取流程 title=长期记忆有独立的召回与提取流程></a>长期记忆有独立的召回与提取流程</h3><p>Harness 通过 MemoryRuntime 接入记忆服务。<a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/middleware/memory.py#L259 rel=noopener target=_blank>MemoryMiddleware.before_model</a>只在新用户消息到来、尚未保存召回快照时触发新召回,随后在发送给模型的消息副本里重放该快照。<p>工具结果引发的下一次模型调用,会沿用这一轮的召回,而不会每走一步都重新塞入当下最新记忆。这个设计有助于保持本轮上下文稳定,也便于历史回放。<p>会话记录、记忆捕获和会话结束后的提取有各自开关与触发方式。能保存聊天记录、能从中提取长期记忆、能在新任务中召回相关内容,是 3 个不同环节,不能用一个“有记忆”标签概括效果。<h3 id=上下文过长时压缩模型输入><a class=headerlink href=#上下文过长时压缩模型输入 title=上下文过长时压缩模型输入></a>上下文过长时压缩模型输入</h3><p>Deep Agents 的摘要 middleware 会缩减发送给模型的历史,将旧内容保存到 backend,并在摘要里保留历史文件位置。模型必要时可以通过 <code>read_file</code> 重新查阅。<p>在这个版本里,模型 profile 提供 <code>max_input_tokens</code> 时,默认摘要触发比例为 85%,保留窗口比例为 10%;缺少 profile 时使用固定阈值回退。因此,本地小上下文模型尤其需要核对 profile 和配置,不能假设所有模型都按真实窗口自动调好。<a href=https://github.com/langchain-ai/deepagents/blob/71552532bb33a8744a5b1c0b48e8047478169c42/libs/deepagents/deepagents/middleware/summarization.py#L255 rel=noopener target=_blank>阈值选择</a><p>压缩减少了历史占用,也可能遗漏细节,还会产生摘要模型调用。关键事实、代码版本和交付要求适合另存为可回查的文件,不能只依赖摘要。<h2 id=权限、人工确认和中断的边界><a class=headerlink href=#权限、人工确认和中断的边界 title=权限、人工确认和中断的边界></a>权限、人工确认和中断的边界</h2><p>工具执行前可以插入检查。Harness 的 <a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/middleware/tool_guard.py rel=noopener target=_blank>ToolGuardMiddleware</a>扫描工具参数,按规则和模式阻断、记录警告,或通过 <code>interrupt</code> 等待人工决定。该版本 Harness 配置默认启用 guard,模式为 <code>block</code>;应用和专家安全策略还会影响最终配置。<p>这个 guard 主要针对命令参数中的风险特征,无法证明所有动作都安全。HITL 也需要配置具体工具和规则,不能据此声称每次危险操作必然弹确认。<p><code>ask_user_question</code> 走的是另一个人工交互用途:模型向用户提问,以用户回答替代工具执行。它独立于一般审批开关。恢复时,LangGraphProtocol 使用 <code>Command(resume={"decisions": ...})</code> 接着处理暂停状态。<p>对话模式还有执行端限制。Ask 主要开放读取类工具,Plan 允许在约定的计划路径写文件;ConversationModeMiddleware 除了筛选模型工具定义,还会在调用时拒绝越界动作。Craft 模式才进入更完整的执行能力。<a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/middleware/conversation_mode.py rel=noopener target=_blank>模式实现</a><p>本地部署还要看 backend。<strong>这个代码快照在 POSIX 系统上,未显式配置 backend 时,会使用以 <code>/</code> 为根的 <code>local_shell</code> 默认规格。</strong> 提示词要求把日常操作留在工作区,但提示词不能代替操作系统隔离。<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/src/octop/infra/backend/resolver.py#L12 rel=noopener target=_blank>应用默认 backend</a>、<a href=https://github.com/TencentCloud/octop-harness/blob/14a1cd9e22c4644ec427be0d2a3f129ac6355f0c/src/octop_harness/backends/__init__.py#L78 rel=noopener target=_blank>Harness 默认规格</a><p>文件目录限制、命令规则、Docker/OpenSandbox backend 和宿主机权限解决不同问题。尤其是本地 shell,要以实际进程权限判断命令能访问什么。给整个 Octop 服务套一个 Docker 容器,也不会自动变成每用户独立容器。<p>WebSocket 断开时,路由只注销连接,明确保留正在运行的任务;重连后可以重新订阅会话流。这个行为减少了页面断连对执行的影响,但不代表补播所有丢失事件,也不代表进程重启后所有在途任务自动恢复。<h2 id=从代码看,Octop-的优势在哪里><a title="从代码看,Octop 的优势在哪里" class=headerlink href=#从代码看,Octop-的优势在哪里></a>从代码看,Octop 的优势在哪里</h2><p>它值得关注的地方主要是把 Agent 运行能力接成一套可配置的应用。下面的收益是代码设计分析,尚无任务成功率或成本实测支持。<table><thead><tr><th>设计<th>带来的实际便利<th>需要承担的条件或成本<tbody><tr><td>Dashboard、IM、定时任务连接共同运行环境<td>一套专家配置可以服务多个入口,减少重复搭入口和执行管道<td>服务要持续在线,各渠道还有自己的接入配置<tr><td>应用层与 Harness 分离<td>用户、知识库、插件等产品逻辑可以围绕已有运行时扩展<td>需要维护跨仓库版本兼容,排错不能只看应用仓库<tr><td>模型路由与统一工具接口<td>可以按任务与配置切换模型,复用工具实现<td>模型必须适配所需的工具、多模态和上下文能力<tr><td>MCP、插件和技能接入<td>外部服务、代码工具与操作规范有较明确的扩展位置<td>外部服务认证、权限、schema 和可用性仍要维护<tr><td>checkpoint、会话锁与流式事件<td>能保留过程、恢复人工交互,减少同会话状态竞争<td>外部副作用、跨会话文件冲突和进程内任务仍需单独处理<tr><td>记忆、历史文件与上下文压缩<td>长任务有保存和回查信息的工程路径<td>召回与摘要可能遗漏信息,也会增加资源和调用成本</table><p>其中,模型与工具循环、文件工具和摘要能力大量复用了 Deep Agents、LangChain、LangGraph。Octop 自己更显著的工作是专家生命周期、用户与连接器管理、统一消息处理、知识库、产物展示和团队协调。评估它时,这两部分贡献应分别看。<p>多专家也有两条实现路径。Deep Agents 的 <code>task</code> 工具调的是子 Agent;Harness 的 <code>agent_list</code> / <code>ask_agent</code> 面向平台注册的其他专家。Octop 团队主持人通过异步派工协调成员,成员保有自己的会话与工作区。这两类协作不能都解释成“在同一提示词里切换角色”。<p>当前团队文档明确标注:派工追踪在进程内,重启会丢在途任务;停止主持人本轮,不会取消已排队或正在执行的成员任务。因此,团队更适合从可拆分、可核查的短任务开始。<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/docs/expert-teams.md rel=noopener target=_blank>团队实现说明</a><p>如果需求只是偶尔问答,Octop 的用户、专家、连接器和运行环境配置可能增加维护负担。如果需要常驻助手、多个消息入口、文件产物和可扩展工具,这些工程能力才有机会减少自己搭系统的工作量。<h2 id=本地部署要准备什么><a class=headerlink href=#本地部署要准备什么 title=本地部署要准备什么></a>本地部署要准备什么</h2><p>服务和模型要分别估算。接云端 API 时,本机主要运行 Octop、数据库和工具;接 Ollama 时,还要承担模型推理。浏览器、嵌入模型、文档处理和并发任务会另外增加占用。<p>官方<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/README.md rel=noopener target=_blank>快速开始</a>只给出“现代多核 CPU、数 GB 内存”和足够磁盘空间的宽泛要求,没有统一最低配置表。不能把 8GB、16GB 或某张显卡写成官方门槛。<table><thead><tr><th>运行方式<th>主要准备<tbody><tr><td>云端模型<td>Octop 运行环境、网络、模型凭据、额度和数据目录<tr><td>Ollama 本地模型<td>上述条件,加上与模型大小、量化和上下文匹配的内存或显存<tr><td>浏览器与多专家<td>浏览器环境、额外资源预算、工具权限与并发控制<tr><td>长期定时任务<td>持续在线的机器、持久化数据、服务监控和失败处理</table><p>安装可以按习惯选择:<ul><li><strong>桌面端</strong>:对应系统与架构的安装包。macOS 有 Apple Silicon 和 Intel 包,文档注明 macOS 12+,携带 portable runtime。<li><strong>CLI</strong>:安装器使用 uv 准备 Python 3.12 隔离环境,适合观察日志和管理进程。<li><strong>Docker</strong>:适合 NAS 或服务器,但要准备 Docker、端口和持久化数据卷。</ul><p>相关说明见<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/desktop/README.md rel=noopener target=_blank>桌面端文档</a>、<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/scripts/README.md rel=noopener target=_blank>安装器文档</a>和<a href=https://github.com/TencentCloud/Octop/blob/0c5a46ab5f82e5ad9d1a56fa09b00e542f042fda/docker/README.md rel=noopener target=_blank>Docker 文档</a>。<p>macOS 和 Linux 的官方 CLI 路径如下。命令会下载并执行安装脚本,可先查看脚本内容;脚本 URL 是可更新入口,实际安装版本应另行记录。<figure class="highlight bash"><table><tr><td class=gutter><pre><span class=line>1</span><br></pre><td class=code><pre><span class=line>curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.sh | bash</span><br></pre></table></figure><p>安装后打开新终端,执行:<figure class="highlight bash"><table><tr><td class=gutter><pre><span class=line>1</span><br><span class=line>2</span><br></pre><td class=code><pre><span class=line>octop init</span><br><span class=line>octop run</span><br></pre></table></figure><p>访问 <code>http://127.0.0.1:8088</code>,完成初始化和模型配置。需要浏览器自动化时,安装器支持 <code>--extras browser</code>;已有系统 Chrome 或 Chromium 时会跳过额外下载。<p>从官方仓库根目录使用 Compose:<figure class="highlight bash"><table><tr><td class=gutter><pre><span class=line>1</span><br></pre><td class=code><pre><span class=line>docker compose -f docker/docker-compose.yml up -d --build</span><br></pre></table></figure><p>Docker 首次初始化没有设置管理员密码时,会生成随机密码并写入容器的 <code>/data/.octop/credential.txt</code>。数据目录需要正确挂载,否则容器替换后无法依靠临时文件保留历史与工作区。<p>默认数据位于 <code>~/.octop/</code>。模型请求、工具结果和召回信息可能随上下文发送到所用的模型服务;远程连接器与存储也会产生相应数据流。因此,数据目录在本机,不能直接推出所有处理都在本机完成。<p>通过 ACP 委派代码任务,还需要在 Octop 所在机器安装并认证对应编程 CLI。插件系统已有实现,插件市场和自进化等路线图事项应按具体版本另行核对,不能混成装完即用的能力。<h2 id=下一步怎样验证这些判断><a class=headerlink href=#下一步怎样验证这些判断 title=下一步怎样验证这些判断></a>下一步怎样验证这些判断</h2><p>第一次验证可以用一条容易验收的任务:读取指定公开文档,生成带来源的短笔记,写入已配置工作区。记录实际工具调用、参数、结果、输出文件和模型用量,检查失败时是否明确报告。<p>接着分别测试错误 URL、参数错误、Ask/Plan 模式下的写入、人工确认恢复、页面断连和进程重启。团队任务还需要核对取消主持人后成员的状态。<p>评价它的效果,需要记录设备、完整依赖版本、模型、上下文设置、工具与 backend 配置、耗时、费用和人工修正次数。源码分析能解释执行机制与设计边界;资源占用、任务质量和长期稳定性仍要靠这些实测补齐。</div><footer class=post-footer><div class="affiliate-creative affiliate-creative--post-end" data-affiliate-id=tencent-workbuddy><a aria-label="腾讯 WorkBuddy" rel="sponsored noopener" href=https://cloud.tencent.com/act/cps/redirect?redirect=6871&cps_key=2e33a1eedb380997d03618b4a5ba6ca7&from=console target=_blank><img alt="腾讯 WorkBuddy AI 办公工作台" decoding=async height=389 loading=lazy src=/uploads/affiliate/tencent-workbuddy.webp width=690> </a><span class=affiliate-disclosure>推广</span></div><div class=reward-container><div>请我一杯咖啡吧!</div><button>赞赏</button><div class=post-reward><div><img alt="Nicksxs 微信" src=https://i.loli.net/2020/01/12/NUlWanT31E8LQGx.png><span>微信</span></div><div><img alt="Nicksxs 支付宝" src=https://ooo.0o0.ooo/2016/08/17/57b421e773057.jpg><span>支付宝</span></div></div></div><div class=post-copyright><ul><li class=post-copyright-author><strong>本文作者: </strong>Nicksxs<li class=post-copyright-link><strong>本文链接:</strong> <a title="腾讯 Octop 是什么:WorkBuddy 对比、Agent Loop 与本地部署" href=https://nicksxs.me/2026/10/10/octop-local-deployment/>https://nicksxs.me/2026/10/10/octop-local-deployment/</a><li class=post-copyright-license><strong>版权声明: </strong>本博客所有文章除特别声明外,均采用 <a href=https://creativecommons.org/licenses/by-nc-sa/4.0/ rel=noopener target=_blank><i class="fab fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处!</ul></div><div class=post-tags><a href=/tags/%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2/ rel=tag># 本地部署</a><a href=/tags/Octop/ rel=tag># Octop</a><a href=/tags/WorkBuddy/ rel=tag># WorkBuddy</a><a href=/tags/AI-Agent/ rel=tag># AI Agent</a><a href=/tags/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/ rel=tag># 源码分析</a><a href=/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/ rel=tag># 腾讯云</a></div><div class=post-nav><div class=post-nav-item><a title="Pi Agent 1.0 的 MCP 集成源码解析:工具发现、代码编排与提示词压缩" href=/2026/10/04/Pi-Agent-1-0-MCP%E9%9B%86%E6%88%90%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-%E5%B7%A5%E5%85%B7%E5%8F%91%E7%8E%B0%E4%B8%8E%E6%8F%90%E7%A4%BA%E8%AF%8D%E5%8E%8B%E7%BC%A9/ rel=prev><i class="fa fa-angle-left"></i> Pi Agent 1.0 的 MCP 集成源码解析:工具发现、代码编排与提示词压缩</a></div><div class=post-nav-item><a title="用 Go 自动同步腾讯云 SSL 证书到 Traefik:下载、校验与失败回滚" href=/2026/10/18/%E7%94%A8Go%E8%87%AA%E5%8A%A8%E5%90%8C%E6%AD%A5%E8%85%BE%E8%AE%AF%E4%BA%91SSL%E8%AF%81%E4%B9%A6%E5%88%B0Traefik-%E4%B8%8B%E8%BD%BD%E6%A0%A1%E9%AA%8C%E4%B8%8E%E5%A4%B1%E8%B4%A5%E5%9B%9E%E6%BB%9A/ rel=next>用 Go 自动同步腾讯云 SSL 证书到 Traefik:下载、校验与失败回滚 <i class="fa fa-angle-right"></i></a></div></div></footer></article></div><div class=comments id=disqus_thread><noscript>Please enable JavaScript to view the comments powered by Disqus.</noscript></div></div></main><footer class=footer><div class=footer-inner><div class=beian><a href=https://beian.miit.gov.cn/ rel=noopener target=_blank>浙ICP备16002580号-2 </a><img alt src=/uploads/beian.png><a href=https://beian.mps.gov.cn/#/query/webSearch?code=33010602011094 rel=noopener target=_blank>浙公网安备 33010602011094号</a></div><div class=copyright>© <span itemprop=copyrightYear>2026</span><span class=with-love><i class="fa fa-heart"></i> </span><span class=author itemprop=copyrightHolder>Nicksxs</span></div></div></footer><div class="toggle sidebar-toggle" role=button><span class=toggle-line></span><span class=toggle-line></span><span class=toggle-line></span></div><div class=sidebar-dimmer></div><div aria-label=返回顶部 class=back-to-top role=button><i class="fa fa-arrow-up fa-lg"></i><span>0%</span></div><a aria-label="在 GitHub 上关注我" title="在 GitHub 上关注我" class=github-corner href=https://github.com/nicksxs rel=noopener target=_blank><svg viewbox="0 0 250 250" aria-hidden=true height=80 width=80><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" style="transform-origin:130px 106px" class=octo-arm fill=currentColor></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" class=octo-body fill=currentColor></path></svg></a><noscript><div class=noscript-warning>Theme NexT works best with JavaScript enabled</div></noscript><script data-cloudflare-page-counter-config type=application/json>{"enable":true,"endpoint":"https://counter.nicksxs.me","site":"nicksxs","local_cache":true,"timeout":5000,"icon":"far fa-eye","item_text":true}</script><script src=/js/cloudflare-page-counter.js></script><script class=next-config data-name=disqus type=application/json>{"enable":true,"shortname":"nicksxs","count":false,"i18n":{"disqus":"disqus"}}</script><script defer src=/js/third-party/comments/disqus.js></script>