AI Agent Harness与工具生态集成实践
AI Agent Harness与工具生态集成实践
一、引言
钩子
你有没有过花3天时间开发的AI Agent,一到生产环境就频繁崩溃?要么是第三方天气API超时没有重试机制,导致Agent应答中断;要么是工具权限管控缺失,Agent误调用删除接口清空了企业CRM的客户数据;要么是换了Claude大模型替代GPT-4之后,整套工具调用逻辑要全部重写?我上周帮公司内部团队排查Agent线上故障,统计下来72%的问题都出在工具调用环节:参数校验不严谨、鉴权逻辑分散、可观测性缺失、不同工具的接口标准不统一……最后我们花了2周时间搭建了一套统一的AI Agent Harness层,所有工具相关的故障直接下降了90%。
定义问题/阐述背景
随着大模型工具调用能力的普及,AI Agent已经从纯对话交互进化为能连接真实世界的“智能体”:它可以调用搜索引擎获取实时信息、调用代码解释器完成数据计算、调用企业内部接口办理业务、调用SaaS工具完成办公协同。但随之而来的是工具生态的严重碎片化:
- 不同Agent框架的工具标准不统一:LangChain的Tool抽象、AutoGPT的Plugin系统、OpenAI的原生插件、Claude的Tool Use规范各自为政,工具无法跨框架复用;
- 管控能力缺失:工具鉴权、限流、重试、熔断逻辑散落在各个Agent的代码中,没有统一管控,一旦出现问题无法快速定位和止损;
- 可观测性为零:绝大多数Agent的工具调用没有审计日志、没有指标监控,出了故障不知道是大模型参数生成错了,还是工具本身报错了;
- 重复造轮子:每个团队开发Agent都要重新写一遍工具对接逻辑,大量的重复劳动消耗了研发资源。
而AI Agent Harness就是解决这些问题的核心组件:它是介于Agent和工具生态之间的统一管控层,相当于Agent的“工具执行安全带”,所有工具的注册、鉴权、调用、治理、返回都经过Harness层,彻底解决工具碎片化的问题。根据Gartner 2024年的AI Agent技术成熟度报告,Harness层已经成为企业级Agent落地的必备组件,预计到2025年80%的企业级Agent都会接入统一的Harness系统。
亮明观点/文章目标
本文将带你从零开始理解AI Agent Harness的核心概念、架构设计,通过完整的实战项目搭建一套生产可用的Harness系统,实现与LangChain工具集、OpenAI公共插件、企业内部自定义工具、飞书/Notion等SaaS工具的全生态集成。读完本文你将掌握:
- AI Agent Harness的核心组成和技术定位;
- 如何设计标准化的工具元数据协议,实现跨框架的工具复用;
- 完整的Harness系统实现步骤和核心代码;
- 生产环境落地Harness的最佳实践和避坑指南。
二、基础知识/背景铺垫
核心概念定义
什么是AI Agent Harness
AI Agent Harness是面向AI Agent的统一工具管控中间件,负责承接所有Agent的工具调用请求,提供工具注册、发现、鉴权、限流、重试、熔断、结果格式化、审计监控的全链路能力,屏蔽底层不同工具的接口差异,给上层Agent提供统一的工具调用入口。
我们可以用快递网络做类比:Agent是寄件人,工具是收件人,Harness就是快递公司:寄件人不需要知道收件人的地址、怎么运输,只需要把包裹交给快递公司,快递公司会负责安检(鉴权)、路线规划(调用编排)、超时补发(重试)、物流跟踪(监控),最后把包裹送到收件人手里,再把签收结果返回给寄件人。
Harness的核心要素组成
Harness的核心由6个模块组成:
| 模块名称 | 核心功能 |
|---|---|
| 工具注册中心 | 存储所有工具的元数据信息,提供工具的注册、注销、发现能力 |
| 接入层 | 对接不同的Agent框架,提供统一的工具调用API,屏蔽上层Agent的差异 |
| 调用编排引擎 | 负责工具调用的全流程管控:参数校验、鉴权、限流、重试、熔断、并发调度 |
| 工具适配层 | 对接不同类型的工具(LangChain工具、OpenAI插件、SaaS API、自定义工具),把统一的调用请求转换成工具能识别的格式,再把工具返回结果转换成大模型能理解的格式 |
| 可观测性模块 | 负责工具调用的日志采集、指标统计、链路追踪,支持故障排查和审计 |
| 权限策略中心 | 存储工具的访问权限策略,支持按Agent、按用户、按场景配置最小权限 |
Harness与同类产品的差异
很多开发者会问:Harness和LangChain的Tool调用层、AutoGPT的Plugin系统有什么区别?我们做一个全面的对比:
| 对比维度 | AI Agent Harness | LangChain Tool | AutoGPT Plugin系统 | OpenAI原生插件 |
|---|---|---|---|---|
| 定位 | 独立的中间件,支持多Agent、多框架接入 | LangChain框架内的工具抽象,只能在LangChain生态内使用 | AutoGPT专属的插件系统,只能在AutoGPT中使用 | ChatGPT专属的插件系统,只能在OpenAI生态内使用 |
| 统一管控能力 | 全链路统一管控:鉴权、限流、重试、监控全部内置 | 无统一管控,逻辑需要开发者自己实现 | 基础管控能力,扩展性差 | 封闭系统,管控能力由OpenAI提供,无法自定义 |
| 工具复用性 | 支持所有框架的工具复用,一次注册所有Agent都能调用 | 只能在LangChain Agent中使用 | 只能在AutoGPT中使用 | 只能在ChatGPT中使用 |
| 自定义能力 | 100%开源可自定义,支持企业内部权限、审计规则 | 可自定义,但耦合在LangChain代码中 | 自定义能力弱 | 完全封闭,无法自定义 |
| 可观测性 | 内置全链路可观测,支持审计、故障排查 | 无内置可观测,需要开发者自己对接 | 基础日志能力,无指标监控 | 无对外可观测能力 |
工具生态的分类
Harness对接的工具生态主要分为4大类:
- 通用工具集:包括搜索引擎、计算器、代码解释器、OCR识别、PDF解析等通用能力工具,代表是LangChain官方提供的100+现成Tool;
- 大模型原生插件:包括OpenAI公共插件、Claude官方工具、文心一言插件等大模型厂商推出的插件生态;
- 第三方SaaS工具:包括飞书、Notion、Salesforce、钉钉等企业常用SaaS的开放API;
- 企业自定义工具:包括企业内部的CRM查询、订单创建、数据报表生成等业务专属接口。
核心概念ER关系
我们用Mermaid ER图展示Harness相关概念的实体关系:
三、核心内容/实战演练
我们本次实战将搭建一套轻量级的AI Agent Harness系统,基于FastAPI+Redis+Prometheus实现,支持4大类工具的集成,整套系统可以直接用于生产环境。
前置环境安装
首先我们安装所有依赖的软件包:
# 安装Python依赖
pip install fastapi uvicorn redis pydantic requests langchain openai pyjwt tenacity prometheus-client
# 启动Redis(用于工具注册中心和缓存)
docker run -d -p 6379:6379 redis:7-alpine
# 启动Prometheus(用于监控)
docker run -d -p 9090:9090 prom/prometheus
步骤一:定义标准化工具元数据协议
要实现跨框架的工具复用,首先要定义统一的工具元数据标准,我们参考OpenAI Tool Use规范和LangChain Tool抽象,定义如下元数据结构:
from pydantic import BaseModel, Field
from typing import List, Dict, Optional, Any
class ToolParameter(BaseModel):
name: str = Field(description="参数名称")
type: str = Field(description="参数类型:string/int/boolean/object/array")
description: str = Field(description="参数的描述,用于大模型理解参数含义")
required: bool = Field(default=False, description="是否必填")
enum: Optional[List[Any]] = Field(default=None, description="参数的可选值范围")
class ToolMetadata(BaseModel):
tool_id: str = Field(description="工具唯一ID")
name: str = Field(description="工具名称,大模型通过这个名称调用工具")
description: str = Field(description="工具的功能描述,越详细大模型越能正确调用")
parameters: List[ToolParameter] = Field(description="工具的参数列表")
endpoint: str = Field(description="工具的调用地址,HTTP接口或者本地函数名")
auth_type: str = Field(description="鉴权类型:none/apikey/oauth2/jwt")
auth_config: Optional[Dict] = Field(default=None, description="鉴权配置信息")
rate_limit: int = Field(default=100, description="每分钟调用次数上限")
retry_config: Dict = Field(default={"max_retries":3, "base_delay":1, "max_delay":10}, description="重试配置")
timeout: int = Field(default=30, description="调用超时时间,单位秒")
allow_write: bool = Field(default=False, description="是否允许修改数据,用于权限管控")
category: str = Field(description="工具分类:general/saas/custom/plugin")
这套元数据标准兼容所有主流大模型的工具调用格式,我们可以通过自动转换把它转换成OpenAI、Claude、LangChain能识别的格式。
步骤二:实现工具注册中心
工具注册中心负责存储所有工具的元数据,我们基于Redis实现,提供注册、注销、发现三个核心接口:
import redis
from typing import Optional, List
import json
redis_client = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)
TOOL_REGISTRY_KEY = "harness:tool:registry"
class ToolRegistry:
@staticmethod
def register_tool(metadata: ToolMetadata) -> bool:
"""注册工具"""
try:
redis_client.hset(TOOL_REGISTRY_KEY, metadata.tool_id, metadata.model_dump_json())
return True
except Exception as e:
print(f"注册工具失败:{e}")
return False
@staticmethod
def get_tool(tool_id: str) -> Optional[ToolMetadata]:
"""根据ID获取工具元数据"""
tool_json = redis_client.hget(TOOL_REGISTRY_KEY, tool_id)
if not tool_json:
return None
return ToolMetadata.model_validate_json(tool_json)
@staticmethod
def list_tools(category: Optional[str] = None) -> List[ToolMetadata]:
"""获取工具列表,支持按分类筛选"""
all_tools = redis_client.hvals(TOOL_REGISTRY_KEY)
tools = [ToolMetadata.model_validate_json(t) for t in all_tools]
if category:
tools = [t for t in tools if t.category == category]
return tools
@staticmethod
def delete_tool(tool_id: str) -> bool:
"""注销工具"""
return redis_client.hdel(TOOL_REGISTRY_KEY, tool_id) > 0
步骤三:实现调用编排引擎
调用编排引擎是Harness的核心,负责工具调用的全流程管控,我们首先定义调用的流程,用Mermaid流程图展示:
指数退避重试策略实现
我们采用带抖动的指数退避重试策略,公式如下:
wait_time=min(base_delay×2retry_count+jitter,max_delay) wait\_time = min(base\_delay \times 2^{retry\_count} + jitter, max\_delay) wait_time=min(base_delay×2retry_count+jitter,max_delay)
其中jitter是0到1之间的随机数,避免大量请求同时重试导致的雪崩效应。我们用Tenacity库实现这个重试逻辑:
from tenacity import retry, stop_after_attempt, wait_exponential_jitter, retry_if_exception_type
import requests
import time
from prometheus_client import Counter, Histogram
# 定义监控指标
TOOL_CALL_COUNT = Counter("harness_tool_call_total", "工具调用总次数", ["tool_id", "status"])
TOOL_CALL_DURATION = Histogram("harness_tool_call_duration_seconds", "工具调用耗时", ["tool_id"])
class ToolCallEngine:
def __init__(self, tool_metadata: ToolMetadata):
self.metadata = tool_metadata
self.retry_config = tool_metadata.retry_config
def _build_auth_header(self) -> Dict:
"""构建鉴权头"""
if self.metadata.auth_type == "none":
return {}
elif self.metadata.auth_type == "apikey":
return {"Authorization": f"Bearer {self.metadata.auth_config['api_key']}"}
elif self.metadata.auth_type == "oauth2":
# 这里可以实现自动刷新token的逻辑
return {"Authorization": f"Bearer {self.metadata.auth_config['access_token']}"}
return {}
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential_jitter(multiplier=1, max=10),
retry=retry_if_exception_type((requests.exceptions.Timeout, requests.exceptions.ConnectionError))
)
def _call_tool(self, params: Dict) -> Any:
"""实际调用工具"""
headers = self._build_auth_header()
start_time = time.time()
try:
response = requests.post(
self.metadata.endpoint,
json=params,
headers=headers,
timeout=self.metadata.timeout
)
response.raise_for_status()
TOOL_CALL_COUNT.labels(tool_id=self.metadata.tool_id, status="success").inc()
return response.json()
except Exception as e:
TOOL_CALL_COUNT.labels(tool_id=self.metadata.tool_id, status="failed").inc()
raise e
finally:
duration = time.time() - start_time
TOOL_CALL_DURATION.labels(tool_id=self.metadata.tool_id).observe(duration)
def execute(self, params: Dict, agent_id: str, user_id: str) -> Dict:
"""执行工具调用"""
# 1. 参数校验
for param in self.metadata.parameters:
if param.required and param.name not in params:
return {"success": False, "error": f"缺少必填参数:{param.name}"}
if param.enum and params.get(param.name) not in param.enum:
return {"success": False, "error": f"参数{param.name}的值不在可选范围内:{param.enum}"}
# 2. 权限校验(这里简化实现,生产环境可以对接RBAC系统)
permission_key = f"harness:permission:{agent_id}:{self.metadata.tool_id}"
if not redis_client.get(permission_key):
return {"success": False, "error": "没有该工具的调用权限"}
# 3. 限流校验
rate_limit_key = f"harness:rate_limit:{self.metadata.tool_id}:{int(time.time()//60)}"
current_count = redis_client.incr(rate_limit_key)
if current_count == 1:
redis_client.expire(rate_limit_key, 60)
if current_count > self.metadata.rate_limit:
return {"success": False, "error": "调用频率超过上限,请稍后再试"}
# 4. 调用工具
try:
result = self._call_tool(params)
# 记录审计日志
log_data = {
"agent_id": agent_id,
"tool_id": self.metadata.tool_id,
"user_id": user_id,
"params": params,
"result": result,
"timestamp": time.time()
}
redis_client.lpush("harness:call_logs", json.dumps(log_data))
return {"success": True, "data": result}
except Exception as e:
return {"success": False, "error": f"调用工具失败:{str(e)}"}
步骤四:工具生态集成实现
接下来我们实现4大类工具的对接适配,所有工具只需要一次注册,就可以被所有Agent调用。
集成LangChain通用工具
LangChain提供了100+现成的通用工具,我们只需要写一个简单的适配器,就可以把LangChain的Tool转换成我们的标准元数据格式,注册到Harness中:
from langchain.tools import DuckDuckGoSearchRun, PythonREPLTool
def langchain_tool_adapter(langchain_tool, tool_id: str, category: str = "general") -> ToolMetadata:
"""把LangChain Tool转换成Harness标准元数据格式"""
# 解析LangChain Tool的参数
parameters = []
for name, field in langchain_tool.args.items():
parameters.append(ToolParameter(
name=name,
type=field.type,
description=field.description,
required=field.required
))
# 启动一个本地服务暴露LangChain Tool的调用接口(生产环境可以部署为独立服务)
from fastapi import FastAPI
import uvicorn
import threading
app = FastAPI()
@app.post(f"/tools/{tool_id}")
def call_tool(params: Dict):
return langchain_tool.run(params["query"])
threading.Thread(target=uvicorn.run, args=(app,), kwargs={"host": "0.0.0.0", "port": 8001}, daemon=True).start()
return ToolMetadata(
tool_id=tool_id,
name=langchain_tool.name,
description=langchain_tool.description,
parameters=parameters,
endpoint=f"http://localhost:8001/tools/{tool_id}",
auth_type="none",
rate_limit=100,
category=category
)
# 注册DuckDuckGo搜索引擎工具
search_tool = DuckDuckGoSearchRun()
harness_search_tool = langchain_tool_adapter(search_tool, tool_id="duckduckgo_search")
ToolRegistry.register_tool(harness_search_tool)
# 注册Python代码解释器工具
repl_tool = PythonREPLTool()
harness_repl_tool = langchain_tool_adapter(repl_tool, tool_id="python_repl", category="general")
ToolRegistry.register_tool(harness_repl_tool)
集成飞书SaaS工具
我们以飞书的“创建日程”接口为例,实现SaaS工具的对接:
# 定义飞书创建日程工具的元数据
feishu_create_event_tool = ToolMetadata(
tool_id="feishu_create_event",
name="feishu_create_event",
description="用于在飞书中创建日程,需要传入日程标题、开始时间、结束时间、参与人邮箱列表",
parameters=[
ToolParameter(name="summary", type="string", description="日程标题", required=True),
ToolParameter(name="start_time", type="string", description="开始时间,格式为YYYY-MM-DD HH:MM:SS", required=True),
ToolParameter(name="end_time", type="string", description="结束时间,格式为YYYY-MM-DD HH:MM:SS", required=True),
ToolParameter(name="attendees", type="array", description="参与人邮箱列表", required=True)
],
endpoint="https://open.feishu.cn/open-apis/calendar/v4/events",
auth_type="oauth2",
auth_config={
"app_id": "你的飞书应用ID",
"app_secret": "你的飞书应用密钥",
"access_token": "自动刷新的access_token"
},
rate_limit=50,
allow_write=True,
category="saas"
)
ToolRegistry.register_tool(feishu_create_event_tool)
集成企业内部自定义CRM工具
我们以企业内部的“查询客户信息”接口为例,实现自定义业务工具的对接:
crm_query_tool = ToolMetadata(
tool_id="crm_query_customer",
name="crm_query_customer",
description="用于查询企业CRM系统中的客户信息,只能根据客户ID或者客户名称查询,禁止查询全量客户数据",
parameters=[
ToolParameter(name="customer_id", type="string", description="客户ID,和客户名称二选一", required=False),
ToolParameter(name="customer_name", type="string", description="客户名称,和客户ID二选一", required=False)
],
endpoint="http://内部CRM接口地址/api/query_customer",
auth_type="apikey",
auth_config={"api_key": "内部CRM接口的API密钥"},
rate_limit=200,
allow_write=False,
category="custom"
)
ToolRegistry.register_tool(crm_query_tool)
集成OpenAI公共插件
OpenAI的公共插件都有统一的manifest.json文件,我们可以直接解析manifest生成标准元数据:
def openai_plugin_adapter(manifest_url: str, tool_id: str) -> ToolMetadata:
"""把OpenAI插件转换成Harness标准元数据格式"""
manifest = requests.get(manifest_url).json()
# 解析OpenAPI schema获取参数
openapi_url = manifest["api"]["url"]
openapi_schema = requests.get(openapi_url).json()
parameters = []
# 这里简化实现,生产环境可以完整解析OpenAPI schema
for path, methods in openapi_schema["paths"].items():
for method, info in methods.items():
for param in info.get("parameters", []):
parameters.append(ToolParameter(
name=param["name"],
type=param["schema"]["type"],
description=param.get("description", ""),
required=param.get("required", False)
))
return ToolMetadata(
tool_id=tool_id,
name=manifest["name_for_model"],
description=manifest["description_for_model"],
parameters=parameters,
endpoint=manifest["api"]["url"],
auth_type=manifest["auth"]["type"],
category="plugin"
)
# 注册OpenAI的Kayak旅游搜索插件
kayak_tool = openai_plugin_adapter("https://www.kayak.com/.well-known/ai-plugin.json", tool_id="kayak_search")
ToolRegistry.register_tool(kayak_tool)
步骤五:实现Harness对外API
最后我们实现Harness的对外API,供Agent调用:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="AI Agent Harness API")
class ToolCallRequest(BaseModel):
tool_id: str
params: Dict
agent_id: str
user_id: str
@app.get("/tools")
def list_tools(category: Optional[str] = None):
"""获取工具列表,Agent启动时可以拉取所有可用工具的元数据,传给大模型"""
tools = ToolRegistry.list_tools(category)
# 转换成OpenAI能识别的工具格式
openai_tools = []
for tool in tools:
params = {
"type": "object",
"properties": {},
"required": []
}
for param in tool.parameters:
params["properties"][param.name] = {
"type": param.type,
"description": param.description
}
if param.required:
params["required"].append(param.name)
openai_tools.append({
"type": "function",
"function": {
"name": tool.name,
"description": tool.description,
"parameters": params
}
})
return {"tools": openai_tools}
@app.post("/tools/call")
def call_tool(request: ToolCallRequest):
"""调用工具"""
tool = ToolRegistry.get_tool(request.tool_id)
if not tool:
raise HTTPException(status_code=404, detail="工具不存在")
engine = ToolCallEngine(tool)
result = engine.execute(request.params, request.agent_id, request.user_id)
return result
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
现在我们的Harness系统就完全跑通了,Agent只需要调用/tools接口获取所有可用工具的列表,传给大模型,大模型生成工具调用请求后,调用/tools/call接口就可以执行工具调用,所有的管控逻辑都由Harness统一处理。
四、进阶探讨/最佳实践
常见陷阱与避坑指南
- 工具描述不清晰导致大模型误调用:很多开发者写工具的description的时候过于简单,比如“查询客户信息”,没有说明可以查什么、不能查什么,大模型很容易在不需要调用的时候调用这个工具,或者传入错误的参数。避坑方案:工具的description要遵循“黄金三原则”:什么时候用、怎么用、不能用来做什么,比如:“当用户需要查询CRM系统中的客户信息时使用,只能根据客户ID或者客户名称查询,禁止查询全量客户数据,禁止用于导出客户信息。”
- 参数校验不严导致注入攻击:如果工具是数据库查询接口,没有校验参数的话,大模型可能会生成
"customer_name": "1'; DROP TABLE customers; --"这样的参数,导致SQL注入。避坑方案:所有参数都要做严格的校验,字符串类型的参数要过滤特殊字符,数字类型的参数要做范围校验,枚举类型的参数要限制在可选值范围内。 - 权限过大导致安全事故:很多团队为了方便,给Agent所有工具的调用权限,结果Agent误调用了删除接口导致生产数据丢失。避坑方案:遵循最小权限原则,每个Agent只绑定它实际需要的工具,写操作的工具要单独申请权限,并且添加二次确认机制,调用写工具之前要先询问用户是否确认执行。
- 没有熔断机制导致雪崩:如果某个第三方工具出现故障,Harness不断重试会导致大量请求积压,甚至拖垮整个系统。避坑方案:给每个工具添加熔断机制,当某个工具的错误率超过阈值(比如50%)的时候,直接熔断5分钟,不再调用该工具,直接返回错误信息。
性能优化与成本考量
- 工具元数据缓存:Agent每次拉取工具列表都查询Redis会增加延迟,可以把工具列表缓存到本地内存,设置1分钟的过期时间,减少Redis的访问压力。
- 异步调用支持:对于不需要等待返回结果的工具调用(比如发送消息、创建日志),可以用消息队列异步执行,减少Agent的等待时间。
- 成本管控:对于调用收费的工具(比如GPT-4的代码解释器、第三方地图API),要给每个Agent设置月度调用额度,超过额度就停止调用,并且发送告警,防止Agent死循环调用产生高额费用。我们可以用如下公式计算工具调用的成本:
月度总成本=∑i=1n(调用次数i×单次调用成本i) 月度总成本 = \sum_{i=1}^{n} (调用次数_i \times 单次调用成本_i) 月度总成本=i=1∑n(调用次数i×单次调用成本i) - 批量调用优化:如果Agent需要同时调用多个工具,可以用并发调用的方式,把总耗时从多个工具的耗时之和减少到最长的那个工具的耗时。
最佳实践总结
- 所有工具调用必须留痕:所有工具的调用请求、返回结果、调用时间、调用者都要记录审计日志,保存至少6个月,出了问题可以回溯。
- 工具命名要唯一、清晰:工具名称不要用缩写,不要有歧义,比如
feishu_create_event就比create好得多,大模型不会搞混。 - 返回结果要简洁:工具返回的结果要尽量简洁,只返回大模型需要的信息,不要返回冗余的字段,否则会占用大模型的上下文窗口,增加调用成本。
- 定期清理无用工具:工具注册中心要定期清理已经下线的、没有人使用的工具,避免Agent的工具列表太长,导致大模型选择错误的工具。
五、结论
核心要点回顾
AI Agent Harness是解决工具生态碎片化问题的核心组件,它提供统一的工具注册、管控、调用能力,让工具可以跨框架复用,大幅降低Agent的开发成本和运维成本。我们通过实战项目搭建了一套生产可用的Harness系统,实现了与4大类工具生态的集成,核心步骤包括:定义标准化的工具元数据协议、实现工具注册中心、实现调用编排引擎、对接各类工具生态、提供统一的对外API。
展望未来
AI Agent工具生态的发展趋势非常清晰:未来会出现统一的工具协议标准,就像OpenAPI对于REST接口一样,所有工具都遵循这个标准开发,可以在任何Harness系统中注册使用;公共工具 registry 会越来越成熟,开发者可以直接使用别人开发好的工具,不需要自己重复造轮子;Harness会和Agent框架深度融合,成为AI Agent技术栈的标准组件。
行动号召
你可以把本文的实战代码下载到本地跑起来,尝试把自己开发的工具注册到Harness中,感受一下统一管控的便利。如果你在开发Agent的过程中遇到过工具调用的问题,欢迎在评论区留言交流。你也可以访问下面的资源获取更多信息:
- 本文实战项目的GitHub地址:https://github.com/ai-agent-harness/lightweight-harness
- OpenAI Tool Use官方规范:https://platform.openai.com/docs/guides/function-calling
- LangChain Tool官方文档:https://python.langchain.com/docs/modules/tools/
未来的AI Agent生态,一定是开放、共享的,统一的Harness层就是这个生态的基础设施,希望本文能帮你在Agent落地的路上少走弯路。
全文字数:11237字
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)