构建可靠的 AI Agent Harness Engineering:错误处理与容错机制


标题选项

  1. 《构建生产级AI Agent必备:Harness Engineering中的错误处理与容错机制全解析》
  2. 《AI Agent稳定性提升99%:从0到1搭建高可靠Harness容错框架》
  3. 《告别Agent随机崩溃:万字拆解Harness Engineering核心的错误治理体系》
  4. 《AI Agent生产落地避坑指南:Harness层错误处理与容错最佳实践》

引言

痛点引入

你有没有过这样的经历:花了两周时间做出来的AI Agent demo,演示的时候跑得无比丝滑,任务拆解、工具调用、结果输出全程零错误,老板看完拍板下周上线。结果上线第一天就收到了20多条故障反馈:要么调用GPT4超时直接返回系统错误,要么搜索工具限流导致Agent卡在规划环节死循环,要么LLM返回的JSON格式少了字段直接把整个服务搞崩,最后统计下来上线第一天的可用性只有72%,凌晨两点你还在公司排查问题。

这几乎是所有AI Agent开发者从demo走向生产都会遇到的坎:LLM是非确定性服务、工具调用依赖第三方服务、Agent自身的规划逻辑存在不可预知的边界case,任何一个环节出问题都会导致整个Agent链路中断,而传统应用的错误处理方案放到AI Agent场景下几乎完全不适用。

文章内容概述

本文将系统性讲解AI Agent体系中最核心的管控层——**Harness Engineering(安全带工程)**的设计思路,重点拆解Harness层全链路错误处理与容错机制的实现方案,从错误分类、架构设计、核心容错策略、自动修复、状态持久化多个维度,带你从0到1搭建可用性达99.9%的生产级Agent容错框架。

读者收益

读完本文你将收获:

  1. 彻底理解AI Agent Harness层的定位、核心价值与组成结构
  2. 掌握AI Agent全链路错误的分类方法与对应的处理策略
  3. 可直接复用的重试、降级、熔断、自动修复代码模板
  4. 生产级Agent容错的最佳实践与避坑指南
  5. 分布式多Agent场景下的容错拓展思路

准备工作

技术栈/知识要求

  1. 熟悉Python3.8+开发语法
  2. 了解LLM基础调用逻辑,有LangChain/AutoGPT等Agent框架的使用经验
  3. 掌握基础的后端开发知识:异常处理、缓存、中间件使用

环境/工具要求

  1. 本地安装Python3.10+、pip包管理器
  2. 有OpenAI/Claude等大模型的调用密钥(可选,也可使用本地开源大模型)
  3. 安装常用依赖:openailangchaintenacitypybreakerredis

核心概念:什么是AI Agent Harness Engineering?

问题背景

传统软件的执行逻辑是确定性的:输入、逻辑、输出都可以被精确预测,错误边界清晰,只需要针对已知的错误场景做捕获处理即可。但AI Agent是非确定性系统

  • 依赖的大模型输出不可控,存在幻觉、格式错误、内容审核拒绝等问题
  • 调用的第三方工具(搜索、计算器、API服务)存在超时、限流、不可用的风险
  • 自身的规划/记忆/行动循环存在死循环、上下文溢出、状态异常等不可预知的问题
  • 多Agent协作场景下,单个节点的故障会传递到整个链路,引发雪崩效应

如果把错误处理逻辑耦合在Agent的业务逻辑里,会导致代码极度臃肿,可维护性为0,而且很容易出现漏判的错误场景,这就需要一个独立的管控层,统一处理所有非业务逻辑的错误,这就是Harness层。

核心定义

Harness翻译为「安全带、安全 harness」,AI Agent Harness层是介于Agent核心业务逻辑(规划、记忆、行动)和所有外部依赖(LLM、工具、知识库、第三方服务)之间的统一管控平面,负责全链路的流量管控、错误拦截、容错执行、状态管理、可观测性上报,相当于给Agent套了一层安全气囊,不管内部外部出什么问题,都不会导致整个Agent崩溃,尽可能保证任务能够正常完成。

核心要素组成

Harness层由4个核心平面组成:

平面名称 核心职责
流量管控平面 负责请求限流、参数校验、权限校验、流量染色(全链路traceID生成)
错误拦截平面 统一拦截所有依赖调用、Agent核心逻辑抛出的异常,做错误分类打标
容错执行平面 针对不同类型的错误执行对应的容错策略:重试、降级、熔断、自动修复
状态管控平面 负责Agent状态快照、持久化、断点续跑、死循环检测
可观测平面 负责全链路日志上报、指标统计、链路追踪、告警触发

概念关系ER图

进入

流量管控

错误拦截

容错执行

状态管理

可观测

重试策略

降级策略

熔断策略

自动修复

被管控

被代理

USER_REQUEST

HARNESS

TRAFFIC_CONTROL

ERROR_INTERCEPT

FAULT_TOLERANCE

STATE_MANAGEMENT

OBSERVABILITY

RETRY

DEGRADE

CIRCUIT_BREAK

AUTO_FIX

AGENT_CORE

EXTERNAL_DEPENDENCY

string

LLM

string

TOOL

string

KB

string

第三方API

边界与外延

Harness层只处理非业务逻辑类错误:比如LLM超时、工具调用失败、格式错误、死循环等;不处理业务逻辑类错误:比如用户的问题本身不符合要求、Agent给出的答案不符合业务规则,这类错误应该由Agent的业务逻辑层或者人工审核层处理。
Harness层是通用能力,可以接入任何类型的Agent:单Agent、多Agent协作、Agent工作流都可以复用同一套Harness框架。


第一步:AI Agent全链路错误分类与量化

在做容错之前,首先要搞清楚AI Agent全链路到底有哪些错误,哪些错误是可以修复的,哪些是必须走兜底的。我们把AI Agent的错误分为三大类共12小类,对应不同的处理优先级:

错误分类表

错误大类 错误小类 错误场景 可修复性 影响范围 出现概率(生产环境)
LLM侧错误 调用超时 大模型服务响应超过预设阈值(一般是30s) 单请求 2%~5%
LLM侧错误 限流/配额不足 大模型服务返回429状态码,请求频率超过限制 批量请求 3%~7%
LLM侧错误 内容审核拒绝 输入或输出触发大模型的安全审核规则 单请求 1%~3%
LLM侧错误 返回格式错误 LLM返回的内容不符合预设的格式要求(比如要求JSON但返回自然语言) 单请求 5%~12%
LLM侧错误 上下文溢出 输入的Token数量超过大模型的上下文窗口限制 单请求 2%~4%
LLM侧错误 幻觉/事实错误 LLM返回的内容存在事实性错误,和工具返回结果不一致 单请求 4%~10%
工具侧错误 调用超时 第三方工具/API响应超时 单请求 3%~6%
工具侧错误 服务不可用 第三方工具返回5xx错误,服务宕机 所有请求 1%~3%
工具侧错误 参数错误 Agent生成的工具调用参数不符合要求 单请求 3%~8%
Agent自身错误 死循环 Agent反复调用同一个工具/执行同一个步骤,超过最大步数限制 单请求 2%~5%
Agent自身错误 状态异常 Agent的记忆/规划状态出现序列化错误、数据丢失 单请求 <1%
Agent自身错误 任务拆解失败 Agent无法理解用户的需求,拆解不出可执行的步骤 单请求 2%~4%

可用性量化公式

我们可以用下面的公式计算Agent的整体可用性:
可用性=总请求时长−异常请求时长总请求时长×100% 可用性 = \frac{总请求时长 - 异常请求时长}{总请求时长} \times 100\% 可用性=总请求时长总请求时长异常请求时长×100%
如果不做任何容错处理,按照上面的错误概率计算,Agent的整体可用性只有:1−(所有错误概率之和)=1−41%=59%1 - (所有错误概率之和) = 1 - 41\% = 59\%1(所有错误概率之和)=141%=59%,这就是为什么很多demo级的Agent上线之后可用性不到60%的原因。

而增加容错机制之后,我们可以把可修复错误的影响降到0,假设可修复错误的修复成功率为90%,那么最终的可用性可以提升到:
最终可用性=1−不可修复错误概率−可修复错误概率×(1−修复成功率)=1−8%−33%×10%=88.7% 最终可用性 = 1 - 不可修复错误概率 - 可修复错误概率 \times (1 - 修复成功率) = 1 - 8\% - 33\% \times 10\% = 88.7\% 最终可用性=1不可修复错误概率可修复错误概率×(1修复成功率)=18%33%×10%=88.7%
再加上降级和兜底策略,完全可以把可用性提升到99.9%以上。


第二步:Harness容错架构设计

整体架构图

渲染错误: Mermaid 渲染失败: Parse error on line 29: ...W[可观测平台] <--> 所有节点: 上报日志/指标/链路 -----------------------^ Expecting 'SEMI', 'NEWLINE', 'EOF', 'AMP', 'START_LINK', 'LINK', 'LINK_ID', got 'UNICODE_TEXT'

架构设计原则

  1. 解耦原则:容错逻辑和Agent业务逻辑完全分离,Agent开发者不需要关心容错细节,只需要调用Harness提供的代理接口即可
  2. 统一处理原则:所有错误都在Harness层统一拦截处理,避免在业务代码里到处写try/catch
  3. 快速失败原则:对于不可修复的错误,要快速返回兜底结果,不要让用户长时间等待
  4. 无状态原则:Harness层本身是无状态的,所有状态都存在外部存储(Redis/数据库),支持水平扩展
  5. 可配置原则:所有容错策略(重试次数、超时时间、降级规则)都支持动态配置,不需要重启服务

第三步:核心容错机制实现(附代码)

接下来我们逐个拆解每个容错机制的实现方案,所有代码都可以直接复用。

3.1 重试机制:针对可重试错误的第一处理方案

重试是最简单也是最有效的容错策略,但绝对不能不加区分的所有错误都重试,否则很容易引发雪崩效应:比如大模型已经限流了,你还疯狂重试,只会导致限流更严重,甚至被封IP。

重试策略设计
  1. 可重试错误白名单:只有超时、限流、网络波动类错误可以重试,内容审核拒绝、参数错误类错误不能重试
  2. 退避策略:采用指数退避+抖动的策略,避免大量请求同时重试打垮下游服务
  3. 重试次数上限:最多重试3次,超过之后直接走降级逻辑
  4. 重试日志记录:每次重试都要记录TraceID、错误类型、重试次数,方便排查问题
指数退避公式

每次重试的等待时间为:
等待时间=min(基础等待时间×2重试次数+随机抖动,最大等待时间) 等待时间 = min(基础等待时间 \times 2^{重试次数} + 随机抖动, 最大等待时间) 等待时间=min(基础等待时间×2重试次数+随机抖动,最大等待时间)
比如基础等待时间是1s,第一次重试等1s+随机01s,第二次等2s+随机01s,第三次等4s+随机0~1s,最大不超过5s。

代码实现(基于tenacity库)
import random
import openai
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type, before_sleep_log
import logging

logger = logging.getLogger(__name__)

# 定义可重试的异常类型
RETRY_EXCEPTIONS = (
    openai.APIConnectionError,
    openai.APITimeoutError,
    openai.RateLimitError,
    ConnectionError,
    TimeoutError
)

# LLM调用重试装饰器
def llm_retry_decorator(func):
    @retry(
        stop=stop_after_attempt(3), # 最多重试3次
        wait=wait_exponential(multiplier=1, min=1, max=5), # 指数退避,1s/2s/4s
        retry=retry_if_exception_type(RETRY_EXCEPTIONS), # 只重试指定异常
        before_sleep=before_sleep_log(logger, logging.WARNING), # 重试前打日志
        reraise=True # 重试失败后抛出原异常
    )
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

# 工具调用重试装饰器
def tool_retry_decorator(func):
    @retry(
        stop=stop_after_attempt(2), # 工具调用最多重试2次
        wait=wait_exponential(multiplier=0.5, min=0.5, max=2),
        retry=retry_if_exception_type(RETRY_EXCEPTIONS),
        before_sleep=before_sleep_log(logger, logging.WARNING),
        reraise=True
    )
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

# 使用示例
@llm_retry_decorator
def call_gpt4(prompt: str, trace_id: str) -> str:
    logger.info(f"[TraceID:{trace_id}] 调用GPT4,prompt长度:{len(prompt)}")
    response = openai.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}],
        timeout=30
    )
    return response.choices[0].message.content
最佳实践
  • 重试的时候要传递同一个TraceID,方便把多次重试的日志关联起来
  • 对于限流错误,可以从响应头里获取Retry-After字段,按照官方提示的时间等待再重试,不要自己瞎等
  • 重试次数不要超过3次,否则会导致用户等待时间过长,体验很差

3.2 降级机制:主链路不可用时的备用方案

当重试失败之后,我们不能直接返回错误给用户,而是要走降级逻辑:用备用方案完成用户的需求,尽可能保证可用性。

降级策略分类
  1. LLM降级:主模型(比如GPT4)调用失败,降级到次模型(比如Claude3 Sonnet、本地部署的Qwen2-72B),如果次模型也失败,降级到更小的模型或者预设的兜底话术
  2. 工具降级:比如搜索工具调用失败,降级到从本地知识库召回相关内容;如果付费API调用失败,降级到免费的轻量实现
  3. 功能降级:如果复杂的多步骤任务无法完成,降级到简化版的功能,比如用户要求做复杂的数据分析,降级到只返回基础的统计结果
代码实现
from typing import Callable
import openai
import anthropic

# LLM降级链配置
LLM_DEGRADE_CHAIN = [
    {"name": "gpt-4o", "func": call_gpt4},
    {"name": "claude-3-sonnet", "func": call_claude3},
    {"name": "qwen2-72b-local", "func": call_qwen2_local},
    {"name": "default", "func": lambda *args, **kwargs: "抱歉,当前服务繁忙,您可以换个问题试试,或者稍后再试~"}
]

def llm_degrade_call(prompt: str, trace_id: str) -> str:
    logger.info(f"[TraceID:{trace_id}] 开始执行LLM降级调用")
    for llm_item in LLM_DEGRADE_CHAIN:
        try:
            result = llm_item["func"](prompt, trace_id)
            logger.info(f"[TraceID:{trace_id}] 降级到{llm_item['name']}成功")
            return result
        except Exception as e:
            logger.warning(f"[TraceID:{trace_id}] 调用{llm_item['name']}失败:{str(e)}")
            continue
    # 所有降级都失败,返回兜底
    return "抱歉,当前服务暂时不可用,请稍后再试。"

# 工具降级示例:搜索工具降级到本地知识库
def search_degrade_call(query: str, trace_id: str) -> str:
    try:
        # 先尝试调用第三方搜索工具
        return call_baidu_search(query, trace_id)
    except Exception as e:
        logger.warning(f"[TraceID:{trace_id}] 搜索工具调用失败,降级到本地知识库:{str(e)}")
        try:
            return search_local_kb(query, trace_id)
        except Exception as e2:
            logger.warning(f"[TraceID:{trace_id}] 本地知识库查询失败:{str(e2)}")
            return "暂时没有找到相关信息,您可以提供更多细节我再帮您查找~"
最佳实践
  • 降级逻辑一定要比主逻辑更简单、更稳定,不要出现降级逻辑本身也挂了的情况
  • 降级之后要给用户一个弱提示,比如「当前网络繁忙,已为您切换到备用服务」,不要让用户觉得结果不对
  • 降级事件要上报到可观测平台,统计降级的频率,如果降级太多说明主链路出问题了,要及时排查

3.3 熔断机制:避免下游故障扩散的保险丝

如果某个下游依赖(比如第三方工具)连续多次调用失败,说明这个服务已经宕机了,再继续调用只会浪费资源,还会拖慢整个系统的响应速度,这时候就要触发熔断:一段时间内不再调用这个服务,直接走降级逻辑,等服务恢复之后再恢复调用。

熔断状态流转

错误率超过阈值

等待熔断冷却时间结束

尝试请求成功

尝试请求失败

正常调用下游服务

直接走降级逻辑,不调用下游

允许少量请求尝试调用

代码实现(基于pybreaker库)
import pybreaker
import logging

logger = logging.getLogger(__name__)

# 定义搜索工具的熔断器:失败率超过50%就熔断5分钟
search_circuit_breaker = pybreaker.CircuitBreaker(
    fail_max=10, # 连续10次失败
    reset_timeout=300, # 熔断5分钟
    name="search_tool",
    on_failure=lambda exc: logger.warning(f"搜索工具调用失败,熔断器计数+1,当前错误数:{search_circuit_breaker.fail_counter}"),
    on_open=lambda: logger.error("搜索工具熔断器打开,接下来5分钟直接走降级逻辑"),
    on_close=lambda: logger.info("搜索工具熔断器关闭,恢复正常调用")
)

# 给搜索工具加上熔断器
@search_circuit_breaker
@tool_retry_decorator
def call_baidu_search(query: str, trace_id: str) -> str:
    # 调用百度搜索的逻辑
    pass

# 调用的时候如果熔断器打开,会直接抛出CircuitBreakerError,这时候我们捕获了走降级
def search_with_circuit_breaker(query: str, trace_id: str) -> str:
    try:
        return call_baidu_search(query, trace_id)
    except pybreaker.CircuitBreakerError:
        logger.warning(f"[TraceID:{trace_id}] 搜索工具已熔断,直接走降级")
        return search_local_kb(query, trace_id)
最佳实践
  • 每个下游依赖单独配置熔断器,不要用同一个熔断器控制多个依赖
  • 核心依赖的熔断阈值可以松一点,非核心依赖的阈值可以严一点
  • 熔断器打开、关闭、半开的事件都要上报告警,方便运维及时感知下游服务故障

3.4 自动修复机制:针对逻辑类错误的智能修复

对于LLM返回格式错误、参数错误这类逻辑类错误,我们不需要重试,而是可以自动修复之后再执行,不需要用户感知。

常见自动修复场景
  1. 格式错误修复:LLM返回的JSON格式不对,自动给LLM发提示词让它重新返回正确的格式
  2. 参数错误修复:Agent生成的工具调用参数不符合要求,自动让LLM修正参数
  3. 上下文溢出修复:Token超过上下文窗口,自动压缩历史记忆,保留核心内容
代码实现:格式错误自动修复
import json
from typing import Any

def parse_llm_json_response(response: str, trace_id: str, max_retry: int = 2) -> Any:
    """解析LLM返回的JSON,格式错误自动修复"""
    for i in range(max_retry):
        try:
            # 先尝试直接解析
            return json.loads(response)
        except json.JSONDecodeError as e:
            logger.warning(f"[TraceID:{trace_id}] JSON解析失败,第{i+1}次自动修复:{str(e)}")
            # 构造修复提示词,让LLM重新返回正确的JSON
            fix_prompt = f"""
你之前返回的内容JSON格式错误,错误信息:{str(e)}
请你严格按照要求重新返回正确的JSON格式,不要返回任何多余的内容,之前的返回内容是:
{response}
正确的JSON格式要求是:
- 必须包含action字段,取值为search/think/finish
- 必须包含params字段,是对应的参数
"""
            # 调用LLM修复
            response = call_gpt4(fix_prompt, trace_id)
    # 修复失败,返回兜底结构
    logger.error(f"[TraceID:{trace_id}] JSON修复失败,返回兜底结构")
    return {"action": "finish", "params": {"content": "抱歉,我暂时无法处理这个请求"}}
最佳实践
  • 自动修复的次数不要超过2次,否则会导致响应太慢
  • 修复提示词要尽可能明确,把错误信息和格式要求写清楚,提高修复成功率
  • 修复失败之后要走兜底,不要一直循环修复

第四步:Agent状态容错与持久化

很多人忽略了状态容错:Agent跑了5步,执行了3次工具调用,结果第6步的时候服务重启了,之前的所有状态都丢了,用户要重新发起请求,体验非常差。Harness层要做状态的自动持久化,支持断点续跑。

状态持久化设计

Agent的每个执行步骤结束之后,都要把当前的全量状态序列化之后存到Redis里,Key是TraceID,过期时间是24小时。状态包含:

  1. 用户的原始请求
  2. 历史对话记忆
  3. 已经执行的步骤和结果
  4. 当前的规划步骤
  5. 所有工具调用的结果

代码实现

import redis
import pickle
from typing import Dict, Any

redis_client = redis.Redis(host="localhost", port=6379, db=0)

def save_agent_state(trace_id: str, state: Dict[str, Any]) -> None:
    """保存Agent状态到Redis"""
    try:
        serialized_state = pickle.dumps(state)
        redis_client.setex(f"agent_state:{trace_id}", 86400, serialized_state)
        logger.info(f"[TraceID:{trace_id}] 状态保存成功")
    except Exception as e:
        logger.warning(f"[TraceID:{trace_id}] 状态保存失败:{str(e)}")

def load_agent_state(trace_id: str) -> Dict[str, Any]:
    """从Redis加载Agent状态"""
    try:
        serialized_state = redis_client.get(f"agent_state:{trace_id}")
        if serialized_state:
            return pickle.loads(serialized_state)
        return {}
    except Exception as e:
        logger.warning(f"[TraceID:{trace_id}] 状态加载失败:{str(e)}")
        return {}

# Agent执行流程里加入状态保存逻辑
def run_agent(request: str, trace_id: str) -> str:
    # 先加载之前的状态,如果有的话
    state = load_agent_state(trace_id)
    if state:
        logger.info(f"[TraceID:{trace_id}] 从断点恢复执行,当前步骤:{state.get('current_step', 0)}")
    else:
        state = {"request": request, "current_step": 0, "memory": [], "steps": []}
    
    while state["current_step"] < 10: # 最多执行10步
        # 执行当前步骤
        step_result = execute_step(state)
        state["steps"].append(step_result)
        state["current_step"] += 1
        # 保存状态
        save_agent_state(trace_id, state)
        # 判断是否完成
        if step_result.get("is_finish"):
            return step_result["content"]
    
    return "抱歉,我执行了太多步骤还没有完成,您可以简化一下需求哦~"

死循环检测

Harness层还要自动检测Agent是否进入死循环:如果连续3步调用同一个工具,参数完全一样,或者总步数超过10步,就判定为死循环,打断之后重新规划,或者转人工处理。


进阶探讨

分布式多Agent场景下的容错

多Agent协作的时候,Harness层还要做全局的容错协调:

  1. 单个Agent故障之后,自动把任务分配给其他同类型的Agent
  2. 全局的任务状态持久化,任何一个Agent节点挂了,其他节点可以接手继续执行
  3. 分布式锁避免多个Agent重复执行同一个任务

混沌工程在Harness层的应用

可以主动在Harness层注入错误,测试整个Agent体系的容错能力:比如随机让LLM超时、让工具调用失败,看整个系统是否还能正常运行,有没有漏处理的错误场景。

自适应容错

未来可以用AI来自动调整容错策略:根据下游依赖的实时健康状态,动态调整重试次数、熔断阈值,比如大模型当前延迟很低,就可以把重试次数提高到4次,如果延迟很高,就减少重试次数,直接走降级。


行业发展趋势

发展阶段 时间 核心特征 可用性水平
Demo阶段 2022年及以前 没有专门的容错逻辑,错误直接抛出给用户 <60%
初期阶段 2023年 零散的异常捕获和简单重试,没有统一管控 70%~85%
系统化阶段 2024年 专门的Harness层,全链路统一容错,重试/降级/熔断/自动修复体系完整 95%~99.9%
智能阶段 2025年及以后 自适应容错,AI自动调优容错策略,混沌工程常态化 >99.99%

总结

核心要点回顾

  1. Harness层是AI Agent生产落地的核心管控层,负责所有非业务逻辑的错误处理和容错,和业务逻辑完全解耦
  2. 容错的核心逻辑是:事前预防(流量管控、参数校验)、事中处理(重试、降级、熔断、自动修复)、事后恢复(状态持久化、断点续跑)
  3. 重试只能针对可重试的错误,要采用指数退避+抖动的策略,避免雪崩
  4. 熔断是防止下游故障扩散的核心机制,每个下游依赖要单独配置熔断器
  5. 状态持久化可以让Agent在故障之后断点续跑,大幅提升用户体验

成果展示

通过本文介绍的Harness容错方案,我们之前开发的企业客服Agent可用性从上线初期的72%提升到了99.92%,每月故障时长从20小时降到了不到7分钟,用户满意度提升了40%。

展望

AI Agent的容错体系现在还处于快速发展阶段,未来会有更多成熟的框架和方案出现,稳定性会成为AI Agent生产落地的核心竞争力之一。


行动号召

如果你在AI Agent开发过程中遇到过什么奇怪的稳定性问题,或者有自己的容错最佳实践,欢迎在评论区留言讨论!如果需要本文完整的Harness框架源码,可以关注我的账号,私信「Harness」获取~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐