Service-as-a-Software 实战:用 AI Agent Harness 重构 SaaS 商业模式的配置骨架
1. 传统 SaaS 的“工具困境”与 SaaSS 的破局点如果你正在做 SaaS 产品大概率遇到过这种尴尬客户买了你的系统但后台活跃度低得可怜续费全靠销售磨嘴皮子。问题不在于功能不够多而在于客户要的从来不是“一套 CRM”而是“更多成交的线索”不是“一个财务软件”而是“合规的账和税”。工具和结果之间隔着一条需要人去学习和操作的鸿沟。Service-as-a-SoftwareSaaSS要解决的就是这条鸿沟。它的核心思路是把 SaaS 从“卖工具”变成“交付结果”——客户提出业务目标AI Agent 集群自动调用 SaaS 的 API、对接企业内部系统把活干完服务商按实际创造的价值收费。而支撑这套模式落地的工程底座就是 AI Agent Harness它像一套“Agent 管控装置”负责任务拆解、工具调用、执行编排、异常兜底和价值计量。这篇文章面向想把传统 SaaS 升级为 SaaSS 的开发者和产品团队给出一套可复制的 Agent 编排配置骨架包括 Prompt 工程模板、工具调用链以及如何通过统一 Key/API 通道接入 TaoToken 来跑通整条链路。你不需要先成为大模型专家只要会写 Python、能看懂 JSON 配置就能跟着把骨架搭起来。2. 前置准备用 TaoToken 统一 Key 打通模型通道在写 Agent 编排代码之前得先解决一个现实问题Agent 要调用大模型做语义解析、意图判断、结果校验如果每个模型都单独申请 Key、单独维护 SDK工程复杂度会迅速失控。我的做法是用 TaoToken 作为统一的模型接入通道一个 Key 覆盖多种模型调用省去多平台切换的麻烦。TaoToken 的定位是 AI 模型 API 的统一入口适合需要频繁切换模型、或者想让 Agent 编排层与底层模型解耦的团队。你可以先到官网了解整体能力再进控制台创建 API Key。具体路径是访问 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 了解平台然后进入控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 生成 Key在 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 可以管理你的密钥。拿到 Key 之后Agent 编排层只需要配置一个 base_url 和 api_key就能在 Prompt 模板里自由指定模型。这样做的好处是当某个模型在特定任务上表现更好时你只需要改配置不用动编排逻辑。对于 SaaSS 场景来说这意味着你可以针对“线索评分”用推理强的模型针对“邮件生成”用速度快的模型而计费和鉴权仍然走同一条通道。注意API Key 属于敏感凭证不要硬编码在代码里建议用环境变量或密钥管理服务注入。生产环境务必开启调用额度监控避免 Agent 异常循环导致费用失控。3. 可复制的 Agent Harness 配置骨架下面这套骨架分为三层Prompt 工程模板层、工具调用链层、编排执行层。我把它设计成配置驱动核心逻辑放在 Python 里业务差异通过 JSON 配置表达方便你替换成自己的 SaaS 场景。3.1 Prompt 工程模板任务拆解与结果校验Agent Harness 的第一个关键动作是把客户的模糊目标拆成原子步骤。这里用结构化 Prompt 强制模型输出 JSON避免后续解析出错。# prompt_templates.py TASK_SPLIT_PROMPT 你是任务拆解专家。请把用户的业务目标拆分为可执行的原子步骤。 每个步骤必须包含以下字段 - step_id: 整数编号 - step_desc: 步骤描述 - required_tool: 需要调用的工具名从工具清单中选择 - input_schema: 该步骤需要的输入参数说明 - success_criteria: 判定该步骤成功的标准 可用工具清单 {tool_list} 用户业务目标{task_desc} 只输出 JSON 数组不要输出任何解释性文字。 RESULT_VALIDATE_PROMPT 你是结果校验专家。请判断以下 Agent 执行结果是否满足业务目标。 业务目标{task_desc} 执行结果{result_json} 判定标准{success_criteria} 输出 JSON {{passed: true/false, confidence: 0.0-1.0, reason: 简要说明}} 这两个模板是整个 Harness 的“大脑”。任务拆解模板负责把“筛选高意向线索”翻译成“拉取线索 → 评分 → 过滤 → 汇总”这样的步骤链结果校验模板负责在每一步执行后判断是否达标不达标就触发重试或转人工。3.2 工具调用链统一适配层配置工具调用链的核心是“统一适配”。不管底层是 Salesforce、金蝶还是自研系统Agent 只认工具名和参数 schema。下面是一个工具注册表的配置示例{ tools: [ { name: crm.fetch_leads, description: 从 CRM 拉取指定时间范围内的未转化线索, endpoint: https://your-saas.example.com/api/leads, method: POST, auth_type: bearer, input_schema: { days: integer, 默认30, status: string, 默认unconverted } }, { name: llm.qualify_lead, description: 调用大模型判断线索意向等级, endpoint: https://taotoken.net/api/v1/chat/completions, method: POST, auth_type: bearer, input_schema: { lead_info: object, criteria: string } }, { name: notify.send_report, description: 把结果汇总发送给客户, endpoint: https://your-saas.example.com/api/notify, method: POST, auth_type: bearer, input_schema: { channel: string, content: object } } ] }这个注册表就是 Harness 的“工具适配层”。新增一个 SaaS 能力只需要往 JSON 里加一条记录编排逻辑不用改。对于接入 TaoToken 的模型调用endpoint 统一指向 API 地址鉴权用同一个 Key模型名在请求体里指定即可。3.3 编排执行层串行与并行混合调度有了 Prompt 模板和工具注册表编排层负责按步骤调度。下面是一个简化但可运行的执行器# harness_engine.py import json import os import requests from prompt_templates import TASK_SPLIT_PROMPT, RESULT_VALIDATE_PROMPT TAOTOKEN_API https://taotoken.net/api/v1/chat/completions TAOTOKEN_KEY os.getenv(TAOTOKEN_API_KEY) def call_llm(prompt: str, model: str gpt-4o-mini) - str: headers { Authorization: fBearer {TAOTOKEN_KEY}, Content-Type: application/json } payload { model: model, messages: [{role: user, content: prompt}], temperature: 0.1 } resp requests.post(TAOTOKEN_API, headersheaders, jsonpayload, timeout60) resp.raise_for_status() return resp.json()[choices][0][message][content] def load_tools(path: str tools.json) - dict: with open(path, r, encodingutf-8) as f: data json.load(f) return {t[name]: t for t in data[tools]} def split_task(task_desc: str, tools: dict) - list: tool_list \n.join([f- {k}: {v[description]} for k, v in tools.items()]) prompt TASK_SPLIT_PROMPT.format(tool_listtool_list, task_desctask_desc) raw call_llm(prompt) return json.loads(raw) def execute_step(step: dict, tools: dict, context: dict) - dict: tool tools.get(step[required_tool]) if not tool: return {status: failed, error: f工具不存在: {step[required_tool]}} # 这里根据 input_schema 从 context 组装参数实际项目可用 JSON Schema 校验 params {k: context.get(k) for k in tool[input_schema].keys()} headers {Authorization: fBearer {TAOTOKEN_KEY}} resp requests.post(tool[endpoint], headersheaders, jsonparams, timeout60) if resp.status_code ! 200: return {status: failed, error: resp.text} return {status: success, data: resp.json()} def run_harness(task_desc: str, context: dict) - dict: tools load_tools() steps split_task(task_desc, tools) audit_log [] for step in steps: result execute_step(step, tools, context) audit_log.append({step: step, result: result}) if result[status] ! success: # 异常兜底重试一次仍失败则转人工 retry execute_step(step, tools, context) audit_log.append({step: step, retry: retry}) if retry[status] ! success: return {status: need_human, audit_log: audit_log} context.update(result.get(data, {})) return {status: completed, context: context, audit_log: audit_log}这段代码就是 Harness 的最小可用骨架。它做了四件事拆任务、查工具、执行、记日志。你可以把tools.json里的 endpoint 换成自己 SaaS 的接口把call_llm的模型名换成你需要的版本整条链路就能跑起来。4. 验证请求确认 Agent 编排链路可跑通骨架搭好后别急着接真实业务数据先用一个最小任务验证链路。我通常用“筛选近 30 天高意向线索”作为冒烟测试因为它涉及模型调用、工具调用和结果汇总三个环节。4.1 发起一次编排请求# test_harness.py from harness_engine import run_harness context { days: 30, status: unconverted, criteria: 高管职位、科技行业、近7天有官网访问记录 } result run_harness(筛选出近30天的高意向销售线索并汇总, context) print(json.dumps(result, ensure_asciiFalse, indent2))预期返回结构如下{ status: completed, context: { leads: [...], qualified_leads: [...], report: {...} }, audit_log: [ {step: {step_id: 1, required_tool: crm.fetch_leads}, result: {status: success}}, {step: {step_id: 2, required_tool: llm.qualify_lead}, result: {status: success}}, {step: {step_id: 3, required_tool: notify.send_report}, result: {status: success}} ] }4.2 用模型对话做单点验证如果你只想先确认 TaoToken 的模型通道是否正常可以先用模型对话页面发一条测试消息确认 Key 有效、模型可调用。路径是 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。在页面里输入“请返回 JSON{ok: true}”如果模型正常返回说明通道没问题再回到代码里跑完整编排。4.3 验证成功的三个标志第一audit_log里每一步的status都是success没有出现need_human。第二context里的qualified_leads数量大于 0说明模型评分和过滤逻辑生效。第三整个请求从发起到返回在 60 秒内完成如果超时通常是某个工具接口响应慢或模型调用排队需要检查超时配置。5. 本篇常见错排查5.1 任务拆解返回的不是合法 JSON这是最常见的问题。模型有时会在 JSON 前后加“好的以下是拆解结果”之类的文字。解决办法有两个一是在 Prompt 里强调“只输出 JSON 数组”二是在代码里加一层容错解析用正则提取第一个[到最后一个]之间的内容再json.loads。如果仍然失败把temperature降到 0并换用指令遵循能力更强的模型。5.2 工具调用返回 401 或 403先检查TAOTOKEN_API_KEY环境变量是否注入成功再确认请求头格式是Bearer key。如果是调用自有 SaaS 接口报 401检查该接口的鉴权方式是否和tools.json里的auth_type一致。我踩过的坑是本地测试时 Key 写在.env里但执行脚本的目录不对导致load_dotenv没加载到排查了半天。5.3 编排进入死循环或重复调用如果某个步骤一直失败并触发重试而重试逻辑没有次数上限就会死循环。上面的骨架里我用了“重试一次后转人工”的策略实际项目建议再加一个全局步骤上限比如超过 10 步就强制终止并告警。另外工具调用要设置timeout避免某个接口挂起导致整个编排卡死。5.4 模型返回的置信度不可靠有些模型在结果校验时会给出虚高的置信度。解决办法是不要只依赖模型自评而是在 Prompt 里要求它给出具体理由再用规则引擎做二次判断。比如“置信度 0.9 且理由中包含具体线索特征”才判定为通过。对于关键业务建议保留人工抽检环节把抽检结果回流到 Prompt 迭代中。5.5 接入文档与 Key 管理混乱团队协作时最容易出现的问题是 Key 泄露或权限过大。建议在 API Keys 页面为不同环境创建不同的 Key开发、测试、生产隔离。接入文档可以参考 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的请求示例和错误码说明。如果要做长期编码和 Agent 自动化可以了解 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合需要持续调用模型能力的场景。6. 从骨架到生产SaaSS 落地的下一步这套骨架跑通之后你手里就有了一个可用的 Agent Harness 最小闭环。接下来要做的不是加更多功能而是把它接到真实业务场景里验证价值计量。比如在线索筛选场景中记录每次编排筛选出多少条高意向线索按每条线索的业务价值折算服务费生成对账单。这一步跑通SaaSS 的商业模式才算真正闭环。对于想要长期迭代 Agent 能力的团队建议把 Prompt 模板、工具注册表、编排配置都纳入版本管理每次调整都留痕。模型通道方面统一走 TaoToken 的 API 入口需要切换模型时只改配置不改代码。如果你在接入过程中遇到鉴权或调用问题优先查接入文档和 API Keys 管理页面如果是要验证某个模型在特定任务上的表现可以直接用模型对话做快速对比。整套链路的核心思想就一句话让 Agent 干完活让 Harness 管好 Agent让价值计量说清楚钱从哪来。