Trae Builder:C++服务入口为何还需手写main函数
本文记录在已有ChatServer业务类基础上,利用Trae IDE的Builder智能体自动生成main函数入口的实操过程。涵盖构造函数修正、Auto Mode与文件引用技巧、Agent与大模型的区别,以及多模型配置加载和HTTP服务启动的关键步骤,适合需要快速落地AI对话服务的C++开发者参考。
为什么还要手写 main 函数
在 AI 对话服务项目里,业务类往往承担了核心逻辑。以 ChatServer 为例,多个大模型的 API 密钥、超参数,以及本地 Ollama 模型的连接信息,都由它来管理。业务代码写完了,项目却起不来,原因常常很朴素:main 函数还没写。
main 函数看着不起眼,干的却是“glue code”(胶水代码)的活:加载配置、实例化服务对象、启动 HTTP 服务器。手写的话,错误处理容易漏,配置加载顺序也容易搞乱;交给 AI 吧,又怕它摸不清项目上下文。这种时候,
Trae IDE 的 Builder 智能体就派上用场了。
ChatServer 构造函数的修正与梳理
在让 AI 生成 main 函数之前,得先确认现有的 ChatServer 构造函数是干净可用的。原始代码里有几处典型的笔误和语法问题,比如nake_shared 应为 make_shared,有些头文件拼错了,数组初始化的语法也不规范。
修正后的构造函数主要做三件事:
- 实例化各模型配置:DeepSeek、GPT-4o-mini、Gemini-2.0-flash 和 Ollama 本地模型,各自创建一个配置对象。模型名称、API Key、temperature 和 maxTokens 等参数都放在对象里。
- 组装配置集合把上面四个配置对象放进
std::vector<std::shared_ptr<ai_chat_sdk::Config>>容器中。 - 批量初始化 SDK:调用
_chatSK->initModels(modelConfigs)所有模型一次性初始化。一旦失败,就用日志宏ERR把错误信息打出来。
这段代码的价值在于,它把“配置”和“初始化”拆开了。main 函数只管拿到ServerConfig,再传给 ChatServer,每个模型的细节不用重复处理。
namespace ai_chat_server
{
ChatServer::ChatServer (const ServerConfig& config)
{
// deepseek模型配置
auto deepseekConfig= std::make_shared<ai_chat_sdk::APIConfig>();
deepseekConfig->_modelName="deepseek-chat";
deepseekConfig->_apikey= config.deepseekAPIKey;
deepseekConfig->_temperature= config.temperature;
deepseekConfig->_maxTokens=config.maxTokens;
// gpt‑4o‑mini模型配置
auto chatGPTConfig= std::make_shared<ai_chat_sdk::APIConfig>();
chatGPTConfig->_modelName="gpt-4o-mini";
chatGPTConfig->_apikey= config.chatGPTAPIKey;
chatGPTConfig->_temperature= config.temperature;
chatGPTConfig->_maxTokens=config.maxTokens;
// gemini‑2.0‑flash模型配置
auto geminiConfig = std::make_shared<ai_chat_sdk::APIConfig>();
geminiConfig->_modelName="gemini-2.0-flash";
geminiConfig->_apikey= config.geminiAPIKey;
geminiConfig->_temperature=config.temperature;
geminiConfig->_maxTokens=config.maxTokens;
// Ollama本地deepseek‑r1:1.5b模型配置
auto ollamaConfig= std::make_shared<ai_chat_sdk::OllamaConfig>();
ollamaConfig->_modelName=config.ollamaModelName;
ollamaConfig->_modelDesc= config.ollamaModelDesc;
ollamaConfig->_endpoint= config.ollamaEndpoint;
ollamaConfig->_temperature=config.temperature;
ollamaConfig->_maxTokens=config.maxTokens;
// 组装全部模型配置集合
std::vector<std::shared_ptr<ai_chat_sdk::Config>> modelConfigs={
deepseekConfig,
chatGPTConfig,
geminiConfig,
ollamaConfig
};
// SDK初始化全部模型,初始化失败打印错误日志
if(!_chatSK->initModels(modelConfigs))
{
ERR("ChatSK init Failed!!!");
}
}
}Trae IDE:不只是编辑器,更是编程伙伴
Trae IDE 是在 VSCode 内核上改的,真正的差异在于 AI 能力集成得深。代码补全、智能问答这些常见的都有,此外还提供 Agent 自动编程功能,能读懂项目结构,也能执行多步任务。
远程开发支持
C++ 项目里,远程开发很常见。Trae 支持 Remote SSH,输入ssh 用户名@IP地址 -A就能连上远程 Linux 主机。想要完整的 C++ 开发体验,建议在远程主机上装两个关键插件:
- clangd:语法高亮、代码补全、静态检查、符号跳转和悬停文档查看,都靠它。
- CMake Tools:CMake 项目的构建、编译和调试由它支持。
AI 对话面板的核心控件
Trae 侧边栏里,AI 对话面板是交互的核心。有两个功能需要特别留意:
- Auto Mode 即自动模型模式。打开它,Trae 会看任务复杂度和模型负载,自己挑最合适的模型,界面上那个模型下拉列表也就不再出现,操作更省事。关掉之后,用户可手动从内置模型里选,比如 Doubao-Seed-1.6、Kimi-K2-0905、Qwen-3-Coder、GLM-4.6 等。
- 快捷符号:
@另一个功能是指定智能体,内置的 Chat、Builder 都能选,自定义智能体同样可以。#还有引用外部文件,碰上长提示词,或者需要 AI 去读项目源码,这个功能很好用。比如输入#ChatServer.h #ChatServer.cpp,AI 就会把这两个文件的内容读进来,当作上下文使用。
智能体(Agent)与大语言模型的区别
“大语言模型”和“智能体”常被混为一谈。把两者的区别弄清楚,用 Trae 的时候会顺手不少。
大语言模型:知识渊博的博士生
DeepSeek-Chat、GPT-4o-mini、Gemini-2.0-flash 这类大语言模型,说到底就是文本生成器。知识问答、文本理解是它们的强项,短板也很清楚:输出只限文本,调用外部工具或 API 这件事它们做不了。
比如让它订机票,它顶多回你“第一步打开 APP,第二步搜索航班”,下单这步它干不了。原因很简单,它没有“手”和“脚”,真实世界里的动作执行不了。
智能体 Agent:有手有脚的实干家
智能体拿大语言模型当“大脑”,接到复杂任务后自己拆成若干子步骤,再调用文件读写、命令执行、网络请求这些工具,把真实业务跑完。
它的核心能力有这么几项:
- 任务拆解:把“生成一个 HTTP 服务入口”分成“读取配置”、“实例化对象”、“启动服务器”等子任务。
- 工具调用:文件直接编辑,编译命令直接执行。
- 上下文维护:多轮交互里状态不丢,每一步都踩在前一步的结果上。
- 迭代执行:工具返回什么(比如编译报错),后续策略就跟着调。
Trae 的内置智能体
Trae 内置了三种智能体,各自适用的场景不一样:
- Chat:轻量级对话智能体,代码库问答、简单代码片段生成这类活适合它,复杂的多步骤项目构建它不做。
- Builder:为从零到一的项目开发而设。代码解析、文件编辑、命令行执行、编译构建等多套工具它都会自动调用,靠多轮交互把项目做出来。本文生成 main 函数用的就是 Builder。
- Builder with MCP:在 Builder 之上再自动加载配好的 MCP Server,外部工具能力因此更多。
实战:用 Builder 生成 main 函数
说回最开始那个需求:给 ChatServer 生成 main 函数。流程走下来很直接:
- 打开项目:在 Trae IDE 里打开放着 ChatServer.h 和 ChatServer.cpp 的项目目录。
- 选择智能体在 AI 侧边栏里点选智能体就行。想自己挑模型,可以把 Auto Mode 关掉手动选;懒得选就保持默认,交给系统自动分配。
Builder - 引用上下文接着在输入框里用把关键文件引进来。比如可以这样写:
##ChatServer.h #ChatServer.cpp #ServerConfig.h 请为这个项目生成一个 main 函数。要求: 1. 从配置文件或环境变量加载 ServerConfig。 2. 实例化 ChatServer 对象。 3. 启动 HTTP 服务,监听指定端口。 4. 添加基本的信号处理,确保优雅退出。 - 执行与整合Builder 拿到需求后会先分析代码结构,再生成符合要求的 main.cpp。生成出来的文件里,启动服务器、解析 JSON 配置这些都会正确处理。文件生成完,把它加进 CMakeLists.txt,编译运行就能跑起来。
httplib
生成的 main 函数大致是这个结构:
#include "ChatServer.h"
#include <ai_chat_sdk/util/myLog.h>
#include <csignal>
#include <iostream>
void signalHandler(int signum) {
INFO("Interrupt signal (" << signum << ") received. Shutting down...");
exit(signum);
}
int main() {
// 注册信号处理
signal(SIGINT, signalHandler);
signal(SIGTERM, signalHandler);
try {
// 加载配置(此处简化,实际应从文件或环境变量读取)
ServerConfig config;
config.deepseekAPIKey = getenv("DEEPSEEK_API_KEY");
config.chatGPTAPIKey = getenv("CHATGPT_API_KEY");
config.geminiAPIKey = getenv("GEMINI_API_KEY");
config.ollamaEndpoint = getenv("OLLAMA_ENDPOINT");
config.ollamaModelName = "deepseek-r1:1.5b";
config.temperature = 0.7;
config.maxTokens = 2048;
// 实例化 ChatServer
ai_chat_server::ChatServer server(config);
// 启动 HTTP 服务
INFO("Starting HTTP server on port 8080...");
// 假设 ChatServer 内部有 start 方法绑定 httplib::Server
// 此处需根据实际 ChatServer 接口调整
server.start(8080);
} catch (const std::exception& e) {
ERR("Fatal error: " << e.what());
return 1;
}
return 0;
}结语
借助 Trae 的 Builder 智能体,手写样板代码的时间省下来了,因疏忽造成的配置遗漏或语法错误也一并避开。更关键的是,人和代码的互动方式变了:不再是一行行敲键盘,而是把意图说清楚、验证结果、再迭代优化。
对 C++ 开发者来说,AI 辅助编程不是要取代传统技能,而是把人从繁琐的 boilerplate 里解放出来,把精力更多放在架构设计和业务逻辑上。下次碰到一个缺入口的项目,不妨先让 Builder 帮你走出第一步。