各位大佬们,下午好,本人最近新购入一台macAir 16G 512内存本子准备大干一场,最近国外的模型不好调用,抽也抽不到,抢key也抢不到,哈哈我手太慢了,所有想能够在本地搭建一个 小型的模型供自己使用 gpt 或者御三家都可以的模型(我是小白,各位如果觉得离谱不要喷我),因为我的代码没有那么高深,所以日常够用就行,有的老友说,你可以去用在线模型呀,我最近用trae模型一直在排队,所有我就萌生了自己搭建一个模型的想法。 如果各位佬友们有那种保姆级的入门教程,如何快速搭建一套完整的模型的教程的话,可以分享一下,感激不尽。谢谢大家。 粗体文本 8 个帖子 - 8 位参与者 阅读完整话题
正常模式下 左侧是文件目录树,右侧是AI对话。 SOLO模式下 非要把这俩反过来,还不能手动改。 5 个帖子 - 4 位参与者 阅读完整话题
之前下载过trae国际版,免费使用了几次,不知道怎么的订阅了专业版(感觉有套路的),直到收到支付宝的扣费信息,就开始申请退款的流程: 最重要的一点:订阅的套餐不要用,一旦使用,就不能退款了 最重要的一点:订阅的套餐不要用,一旦使用,就不能退款了 最重要的一点:订阅的套餐不要用,一旦使用,就不能退款了 1、支付宝内先解约"Trae免密支付" 2、虽然是支付宝扣款的,但是他不负责退款,需要找商家,点击"对订单有疑问" 3、会弹出如下,点击联系商家客服 4、出现一下提示,按照提示发送邮件即可 5、记得在trae官网( TRAE 2025 annual report 需要注意的是:邮件回复比较慢,需要耐心等待,发送的邮件如下: 1、按照要求发送 2、会给回复以下信息,直接在本邮件上按照要求回复就行 3、直到4月17日才收到回复信息,等待大约7天时间 目前还在退款当中,记录一下,遇到同样问题的佬友们参考一下 1 个帖子 - 1 位参与者 阅读完整话题
我全程没手写一行代码,只用 Trae + 下面这套现成提示词,就做出了功能完整的全屏滚动字幕小程序。不用懂前端、不用懂 Canvas、不用调样式,复制粘贴就能生成全套代码,直接上架微信。 首页:5 种预设样式一键切换(滚动字幕、动感摇滚、表白神器、舞台荧光、寻人牌) 展示页:全屏竖排文字滚动,支持荧光 / 闪烁 / 故障风等特效 可自定义:文字、颜色、字号、字体、滚动速度 底部控制面板 + 右侧滑出设置栏 常用语、历史记录、用户配置自动保存 微信开发者工具直接运行,零修改、零报错 1. 一键生成完整小程序 创建一个"大字君"类型的微信小程序项目,功能要求如下: 页面结构 首页(pages/index)- 模板选择页面 5个预设样式按钮:滚动字幕、动感摇滚、表白神器、舞台荧光、寻人牌 输入框可自定义文字 展示页(pages/display)- 文字展示页面 全屏 Canvas 竖排显示滚动文字 底部悬浮控制面板 右侧滑出设置侧边栏 核心功能 Canvas 文字滚动 文字竖排显示(旋转90度) 滚动速度可调:0(停止)/0.5x/1x/2x 字体大小可选:100/150/200/260 支持的字体:渔阳、金榜、黑体、方圆、大楷、刀隶 文字效果 无效果(none) 闪烁(blink)- 文字交替显示/隐藏 荧光(glow)- 文字发光效果 shadowBlur=30 故障风(glitch)- RGB分离偏移效果 描边(stroke)- 文字边缘描边 阴影(shadow)- 文字阴影效果 预设样式配置 BUTTON_STYLES = { ‘滚动字幕’: { textColor: ‘ #ecf0f1 ’, bgColor: ‘ #2c3e50 ’, textEffect: ‘none’ }, ‘动感摇滚’: { textColor: ‘ #000000 ’, bgColor: ‘ #f5576c ’, textEffect: ‘glitch’ }, ‘表白神器’: { textColor: ‘ #ffffff ’, bgColor: ‘ #ff6b9d ’, textEffect: ‘glow’ }, ‘舞台荧光’: { textColor: ‘ #0ff ’, bgColor: ‘ #1a1a2e ’, textEffect: ‘glow’ }, ‘寻人牌’: { textColor: ‘ #8b4513 ’, bgColor: ‘ #fff8e7 ’, textEffect: ‘none’ } } 控制面板 主页/设置按钮 文字输入框(实时输入确认) 常用语横向滚动列表 添加常用语按钮 背景使用 rgba(0, 0, 0, 0.6) 半透明黑色,顶部圆角 24rpx 设置面板(侧边栏) 字体颜色选择器(8种颜色) 字体大小选择(4种) 字体选择(6种字体) 播放速度选择(4档) 文字效果选择(6种) 背景颜色选择器(8种颜色) 数据存储 用户配置:wx.getStorageSync(‘user_config’) 保存:fontSize, speed, textColor, textEffect, bgColor, fontFamily, phrases, lastText 历史记录:wx.getStorageSync(‘history_texts’) 最多保存50条,带时间戳 去重处理(相同文字移到顶部) 生成新页面(需要加页面时用) 创建一个微信小程序页面,包含 wxml、wxss、js、json 四个文件,使用数据驱动、规范命名、事件绑定,逻辑清晰可直接运行。 实现 Canvas 竖排滚动动画 在微信小程序中实现 Canvas 竖排文字滚动动画,支持闪烁、荧光、故障风、描边、阴影等效果,使用标准动画循环与竖排渲染方式,代码稳定不卡顿。 实现用户配置存储 在微信小程序中实现用户配置保存功能,自动存储字号、速度、颜色、效果、字体等设置,页面隐藏时自动保存,打开时自动读取。 实现历史记录管理 实现文字历史记录功能,最多保存 50 条,自动去重,新记录置顶,带时间戳,本地持久化存储。 实现右侧设置面板 创建设置侧边栏,支持字体颜色、字号、速度、文字效果、背景颜色选择,界面美观、操作简单。 实现常用语功能 实现常用语添加、删除、展示功能,支持弹窗编辑,数据本地保存。 实现预设样式按钮 创建 5 种预设样式按钮,一键切换文字颜色、背景色与特效,适配大字君项目使用 按照顺序将提示词发给 Trae,大体功能基本就出来了,最后只用根据自己的喜好写点页面和交互的提示词微调就可以了。 微信小程序开发规范 项目初始化 app.json 包含 pages、window、style、sitemapLocation 每个页面必须:wxml + wxss + js + json Canvas 规范 使用 type=“2d” canvas initCanvas 在 onReady 执行 动画变量挂 this,不进 data 用 requestAnimationFrame 循环 数据存储 用户配置:user_config 历史记录:history_texts onHide 自动保存 文字效果 blink:显隐切换 glow:shadowBlur=30 glitch:RGB分层偏移 stroke:描边 shadow:阴影 附小程序体验码: 1 个帖子 - 1 位参与者 阅读完整话题
虽然我们老师接触还能教我们vibe coding 这也不错了 但是用trae教我们 上课也是让我们跟着他输入提示词 有什么意义呢?mcp、skill完全不涉及。改成语文课联系提示词表达得了,我觉得很鸡肋。。。。。。大学的课真是水到家了 34 个帖子 - 31 位参与者 阅读完整话题
不太能理解trae既然能够用claude code的vs code插件,那为什么不也适配一下codex的vs code插件呢 10 个帖子 - 6 位参与者 阅读完整话题
自己配置了newapi,想将讯飞的codingplan接入trae。 1、我的网络拓扑 A电脑(Windows,安装Trae 3.3.51) ↓ 局域网 B电脑(Windows,安装WSL2+Docker) ↓ Docker容器 New-API(latest版本) ↓ 公网 讯飞星辰Coding Plan(astron-code-latest) 2、已完成的工作 2.1、跨机器网络完全打通 B 电脑 WSL 内 New-API 容器正常运行,端口映射 0.0.0.0:3000->3000/tcp 已在 B 电脑 Windows 做了 WSL2 端口转发 + 防火墙放行 A 电脑浏览器能正常打开 http://172.18.18.17:3000 访问 New-API 后台 2.2、New-API 渠道配置正确 讯飞渠道配置无误,已经测试通过了; 已生成 New-API 令牌:开启无限额度,留空模型限制和 IP 白名单 2.3、Trae 基础配置 2.4、相关报错 Invalid URL (POST /v1) (HTTP Status: 404) 3、疑问 3.1、我这个方案是否可行? 3.2、是我哪里配置错了? 1 个帖子 - 1 位参与者 阅读完整话题
我日常开发较少编写代码,主要使用 Trae-CN。 使用中发现:Trae 思考短-快、逻辑清晰;而本地部署 Qwen3.5-397B 时,模型哔哔哔哔思考没完没了。 其次在Deepseek官方和APi也出现同样问题,官网思考过程简单明了,API思考过程絮絮叨叨,但模型是同一个,很困扰我,因为思考过程耗时的问题,有一段时间我们业务是使用Qwen3-MAX 指令模型来控制速度。 初期猜想: 猜想1:类似 Gemini、Qwen,思考过程按固定格式输出并标记标题 猜想2:对思考过程做了摘要(类似Gemini ) 推翻: 在Trae上接了第三方 API 来使用,第三方api token速率懂的都懂,证明思考阶段为真实结束,并非截断或隐藏。 问题验证: 今日发现 Trae 已支持自定义第三方 API,然后我对本地 Qwen3.5-397B 做一层包装,拦截 Trae 发出的 LLM 请求。 实测结论: Trae 未做额外处理,仅携带内置系统提示词。 复制提示词复现,使用Trae提示词+用户输入,思考长度仅数十字符; 仅使用用户输入,思考过程约 1.4w 字符(VS Code 统计)。 联想与疑问: 验证前我以为 Trae 关闭了思考模式、或用工具封装屏蔽思考过程。实测结果仅靠系统提示词,就能显著压缩思考长度,且 Trae 提示词并未显式限制思考过程。 有无大佬能解释背后原理? 个人的一点想法 提示词中限制好了边界,避免模型过度思考? 附件:两份请求,数据是mock的,但是可以复现这个问题。 短思考过程入参 (点击了解更多详细信息) 长思考过程入参 (点击了解更多详细信息) Trae提示词-翻译版 (点击了解更多详细信息) 1 个帖子 - 1 位参与者 阅读完整话题
最近在使用 Trae IDE 进行开发,有一说一,界面的确清爽好用。但因为我个人的工作流是 Windows Trae 客户端 + SSH 远程连接 Linux 服务器 ,并且配置 第三方的 OpenAI 兼容接口 ,当使用工具内自带的openai接口功能接入gpt-5.4后,发现 AI 开始输出代码或文本时, 前端界面的字符会排版严重错乱,导致修改的代码文件出错。 通过抓包脚本进行调试,发现跟返回的流式传输有关,于是写了一个 Go 语言“智能防抖代理”来解决,终于客户端回复正常了。 脚本功能如下: 物理节流 :接受上游返回后,强制将输出速度限制在 128字节 / 10ms 。增加数据返回客户端的延迟,契合 Trae 的前端渲染节奏, 根治排版混乱 。 UTF-8 边界识别 :在切分数据包时,自动通过二进制位运算检测切口。如果发现切在半个汉字上,自动回退字节, 保证发给前端的每一个字符都是完整的,防止 4054 解析报错 。 接口强转与劫持补全 :Trae自带的GPT-5.4选项实际请求模型是gpt-5.4-2026-03-05,为了方便使用,对 /v1/models 接口请求时强制注入 gpt-5.4-2026-03-05 模型,并增加对话模型替换功能,将前端请求的模型替换成后端支持的模型,例如:gpt-5.4,哪怕你的上游接口没有这个模型也能秒过校验并中转为上游支持的模型。 脚本使用方法 脚本需要运行在 被 SSH 连接的 Linux 远程服务器 上。 1. 保存代码并编译 在 Linux 服务器上创建一个文件 main.go ,将文末的代码粘贴进去。然后执行编译: # 确保你的服务器安装了 Go 环境 go build -o trae_proxy main.go 2. 运行代理服务 必须使用 sudo 运行 ,因为脚本会自动修改 /etc/hosts 劫持域名并生成安装本地根证书。 sudo ./trae_proxy -target "http://你的第三方API地址" -model "你要强制使用的模型" -debug 参数说明: -target :你的第三方 API 基础地址(不需要加 /v1/chat/completions )。 -model :(可选)无视你在 Trae 里选的啥,强行把你所有的请求替换为该模型,比如 gpt-5.4 。 -debug :(可选)开启终端对话日志输出,可以在服务器端直观看到 AI 吐字的过程。 3. 最重要的一步:重启客户端! 脚本启动成功后, 请务必在 Windows 上关闭 Trae 客户端并重新打开(或者 Reload Window) 。只有这样,Trae Server 才会读取到我们新配置的根证书和 Hosts 劫持记录,添加大模型直接填写第三方中转站API秘钥即可,其它保持默认。 4. 安全退出 想要停止代理时,直接在终端按下 Ctrl + C 即可。 脚本内置了优雅退出机制,会自动帮你把 /etc/hosts 恢复原样,并卸载临时证书 。 附:完整 Go 语言源码 ( main.go ) package main import ( "bufio" "bytes" "context" "crypto/rand" "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/json" "encoding/pem" "flag" "fmt" "io" "log" "math/big" "net" "net/http" "net/http/httputil" "net/url" "os" "os/exec" "os/signal" "strings" "sync" "syscall" "time" ) const ( hostsFile = "/etc/hosts" hijackEntry = "127.0.0.1 api.openai.com #AddedByTraeProxy" ) var ( systemCAPath string rootCA tls.Certificate isDebug bool forceModel string ) // --- 流式数据拦截与流控 (智能防错乱版) --- type streamInterceptor struct { originalBody io.ReadCloser dataChan chan []byte errChan chan error logChan chan[]byte closeOnce sync.Once currentBuf[]byte } func newStreamInterceptor(body io.ReadCloser, logChan chan[]byte) *streamInterceptor { s := &streamInterceptor{ originalBody: body, dataChan: make(chan[]byte, 10000), errChan: make(chan error, 1), logChan: logChan, } go s.readFromUpstream() return s } func (s *streamInterceptor) readFromUpstream() { defer close(s.dataChan) for { buf := make([]byte, 4096) n, err := s.originalBody.Read(buf) if n > 0 { chunk := make([]byte, n) copy(chunk, buf[:n]) s.dataChan <- chunk } if err != nil { s.errChan <- err return } } } // 代理发往 IDE 前端的数据读取逻辑 func (s *streamInterceptor) Read(p[]byte) (int, error) { // 恢复雷打不动的物理节流:最大限制 128 字节 limit := 128 if len(p) < limit { limit = len(p) } if len(s.currentBuf) == 0 { select { case chunk, ok := <-s.dataChan: if !ok { select { case err := <-s.errChan: return 0, err default: return 0, io.EOF } } s.currentBuf = chunk } } n := len(s.currentBuf) if n > limit { n = limit } // 【核心修复:智能 UTF-8 边界识别,彻底告别半个字符乱码导致的 4054】 // UTF-8 的多字节字符后续字节特征是二进制 10xxxxxx (即 16进制的 0x80~0xBF) // 如果我们要切断的位置(index n)正好位于一个汉字的中间, // 我们向前回退(n--),直到找到完整的字符边界! if n < len(s.currentBuf) { for n > 0 && (s.currentBuf[n]&0xC0) == 0x80 { n-- } } if n == 0 { // 极小概率的安全兜底 n = 1 } // 切取并输出安全的整字符数据 copy(p, s.currentBuf[:n]) s.currentBuf = s.currentBuf[n:] if isDebug && s.logChan != nil { b := make([]byte, n) copy(b, p[:n]) select { case s.logChan <- b: default: } } // 恢复强制休眠防错乱,保障前端渲染完美顺滑 time.Sleep(10 * time.Millisecond) return n, nil } func (s *streamInterceptor) Close() error { s.closeOnce.Do(func() { if s.logChan != nil { close(s.logChan) } }) return s.originalBody.Close() } // 终端日志打印 func startStreamLogger(ch <-chan[]byte) { var buffer string fmt.Print("\n\033[36m🤖[AI回复]: \033[0m\033[32m") for data := range ch { buffer += string(data) for { idx := strings.Index(buffer, "\n") if idx == -1 { break } line := strings.TrimSpace(buffer[:idx]) buffer = buffer[idx+1:] if strings.HasPrefix(line, "data: ") { payload := strings.TrimPrefix(line, "data: ") if payload == "[DONE]" { fmt.Print("\033[0m\n\033[90m[✔️ 传输结束]\033[0m\n") continue } var v struct { Choices []struct { Delta struct { Content string `json:"content"` } `json:"delta"` } `json:"choices"` } if err := json.Unmarshal([]byte(payload), &v); err == nil && len(v.Choices) > 0 { fmt.Print(v.Choices[0].Delta.Content) } } } } fmt.Print("\033[0m") } // --- 程序主入口 --- func main() { flag.Usage = func() { fmt.Fprintf(os.Stderr, "\n🚀 Trae 代理助手\n\n") fmt.Fprintf(os.Stderr, "用法:\n") fmt.Fprintf(os.Stderr, " %s [参数]\n\n", os.Args[0]) fmt.Fprintf(os.Stderr, "参数列表:\n") flag.PrintDefaults() fmt.Fprintf(os.Stderr, "\n示例:\n") fmt.Fprintf(os.Stderr, " %s -target http://10.168.188.19:8317 -model gpt-5.4 -debug\n\n", os.Args[0]) } targetFlag := flag.String("target", "https://api.openai.com", "目标 API 地址") debugFlag := flag.Bool("debug", false, "开启调试模式(打印请求详情和AI回复)") modelFlag := flag.String("model", "", "强制指定实际请求的模型名称(覆盖前端请求)") helpFlag := flag.Bool("h", false, "显示帮助信息") flag.Parse() if *helpFlag { flag.Usage() os.Exit(0) } targetURL := *targetFlag isDebug = *debugFlag forceModel = *modelFlag remote, err := url.Parse(targetURL) if err != nil { log.Fatalf("❌ 解析目标地址失败: %v", err) } fmt.Println("=====================================================") fmt.Println("🚀 正在启动 API 代理...") fmt.Printf("🎯 目标地址 : %s\n", targetURL) if forceModel != "" { fmt.Printf("🎭 强制模型 : 已开启 (所有请求将强制转为 \033[33m%s\033[0m)\n", forceModel) } if isDebug { fmt.Println("🐛 运行模式 : 调试模式 (将打印详细日志)") } else { fmt.Println("⚡ 运行模式 : 标准模式 (精简输出)") } fmt.Println("🛑 按 Ctrl+C 可以安全停止并自动清理环境。") fmt.Println("\033[31m⚠️ 重要提示 : 代理已启动,请务必【重启或重载 Trae 客户端】使配置生效!\033[0m") fmt.Println("=====================================================") generateAndInstallCA() setupHosts() go handleGracefulShutdown() startProxyServer(remote) } // --- 核心反向代理 --- func startProxyServer(remote *url.URL) { cert := generateFakeServerCert("api.openai.com") dialer := &net.Dialer{ Timeout: 15 * time.Second, KeepAlive: 30 * time.Second, } customTransport := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { if strings.HasPrefix(addr, "api.openai.com") { r := &net.Resolver{ PreferGo: true, Dial: func(ctx context.Context, network, address string) (net.Conn, error) { return net.Dial("udp", "8.8.8.8:53") }, } ips, err := r.LookupIPAddr(ctx, "api.openai.com") if err == nil && len(ips) > 0 { addr = fmt.Sprintf("%s:%s", ips[0].String(), strings.Split(addr, ":")[1]) } } return dialer.DialContext(ctx, network, addr) }, ForceAttemptHTTP2: true, MaxIdleConns: 100, MaxIdleConnsPerHost: 100, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } proxy := httputil.NewSingleHostReverseProxy(remote) proxy.Transport = customTransport // 【强制同步刷新】:设为与休眠时间一致的 10ms, // 防止反向代理库(ReverseProxy)自带的 32KB 缓冲将数据憋住导致超时 proxy.FlushInterval = 10 * time.Millisecond proxy.ErrorHandler = func(w http.ResponseWriter, r *http.Request, err error) { if err == context.Canceled || err == io.EOF { return } if isDebug { log.Printf("❌ 代理错误: %v", err) } w.WriteHeader(http.StatusBadGateway) } originalDirector := proxy.Director proxy.Director = func(req *http.Request) { originalDirector(req) req.Host = remote.Host req.Header.Del("Accept-Encoding") if isDebug { log.Printf("📥 收到请求 -> %s", req.URL.Path) } if forceModel != "" && req.Body != nil && req.Method != http.MethodGet { bodyBytes, err := io.ReadAll(req.Body) req.Body.Close() if err == nil && len(bodyBytes) > 0 { var payload map[string]interface{} if err := json.Unmarshal(bodyBytes, &payload); err == nil { if oldModelInter, hasModel := payload["model"]; hasModel { oldModel, _ := oldModelInter.(string) payload["model"] = forceModel newBodyBytes, _ := json.Marshal(payload) req.Body = io.NopCloser(bytes.NewReader(newBodyBytes)) req.ContentLength = int64(len(newBodyBytes)) req.Header.Set("Content-Length", fmt.Sprintf("%d", len(newBodyBytes))) if isDebug { log.Printf("🔄 [模型篡改] 原始模型: %s -> 强制替换为: %s", oldModel, forceModel) } } else { req.Body = io.NopCloser(bytes.NewReader(bodyBytes)) } } else { req.Body = io.NopCloser(bytes.NewReader(bodyBytes)) } } } } proxy.ModifyResponse = func(resp *http.Response) error { if resp.Request != nil && resp.Request.URL.Path == "/v1/models" { bodyBytes, err := io.ReadAll(resp.Body) resp.Body.Close() var payload map[string]interface{} if err == nil && len(bodyBytes) > 0 { json.Unmarshal(bodyBytes, &payload) } if payload == nil { payload = make(map[string]interface{}) } if _, ok := payload["object"]; !ok { payload["object"] = "list" } dataInter, ok := payload["data"].([]interface{}) if !ok { dataInter =[]interface{}{} } addModel := func(modelName string) { for _, m := range dataInter { if mObj, ok := m.(map[string]interface{}); ok { if id, _ := mObj["id"].(string); id == modelName { return } } } dataInter = append(dataInter, map[string]interface{}{ "id": modelName, "object": "model", "created": time.Now().Unix(), "owned_by": "openai", }) } addModel("gpt-5") if forceModel != "" { addModel(forceModel) } payload["data"] = dataInter newBodyBytes, _ := json.Marshal(payload) resp.Body = io.NopCloser(bytes.NewReader(newBodyBytes)) resp.ContentLength = int64(len(newBodyBytes)) resp.Header.Set("Content-Length", fmt.Sprintf("%d", len(newBodyBytes))) resp.Header.Set("Content-Type", "application/json") if resp.StatusCode >= 400 { resp.StatusCode = http.StatusOK resp.Status = "200 OK" } return nil } contentType := resp.Header.Get("Content-Type") if strings.Contains(contentType, "text/event-stream") { // 流式响应强制干掉 Content-Length 头,防止客户端解析阻塞 resp.Header.Del("Content-Length") var logChan chan []byte if isDebug { logChan = make(chan[]byte, 5000) go startStreamLogger(logChan) } resp.Body = newStreamInterceptor(resp.Body, logChan) } return nil } server := &http.Server{ Addr: "127.0.0.1:443", Handler: proxy, ReadHeaderTimeout: 10 * time.Second, IdleTimeout: 120 * time.Second, TLSConfig: &tls.Config{ Certificates:[]tls.Certificate{*cert}, MaxVersion: tls.VersionTLS12, }, TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)), } if isDebug { log.Println("🛡️ 服务已就绪,正在监听 127.0.0.1:443...") } if err := server.ListenAndServeTLS("", ""); err != nil && err != http.ErrServerClosed { log.Fatalf("❌ 服务绑定失败 (请确保使用 sudo): %v", err) } } // --- 证书管理与系统配置 (保持原样) --- func generateAndInstallCA() { priv, _ := rsa.GenerateKey(rand.Reader, 2048) serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, _ := rand.Int(rand.Reader, serialNumberLimit) caTemplate := &x509.Certificate{ SerialNumber: serialNumber, Subject: pkix.Name{Organization:[]string{"Proxy Local CA"}, CommonName: "Proxy Local Root CA"}, NotBefore: time.Now(), NotAfter: time.Now().AddDate(10, 0, 0), IsCA: true, ExtKeyUsage:[]x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, } caBytes, _ := x509.CreateCertificate(rand.Reader, caTemplate, caTemplate, &priv.PublicKey, priv) certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: caBytes}) keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)}) rootCA, _ = tls.X509KeyPair(certPEM, keyPEM) if _, err := os.Stat("/usr/local/share/ca-certificates"); err == nil { systemCAPath = "/usr/local/share/ca-certificates/proxy_local.crt" os.WriteFile(systemCAPath, certPEM, 0644) exec.Command("update-ca-certificates").Run() } else if _, err := os.Stat("/etc/pki/ca-trust/source/anchors"); err == nil { systemCAPath = "/etc/pki/ca-trust/source/anchors/proxy_local.crt" os.WriteFile(systemCAPath, certPEM, 0644) exec.Command("update-ca-trust", "extract").Run() } } func uninstallCA() { if systemCAPath != "" { os.Remove(systemCAPath) if strings.Contains(systemCAPath, "usr/local") { exec.Command("update-ca-certificates").Run() } else { exec.Command("update-ca-trust", "extract").Run() } } } func generateFakeServerCert(host string) *tls.Certificate { caLeaf, _ := x509.ParseCertificate(rootCA.Certificate[0]) priv, _ := rsa.GenerateKey(rand.Reader, 2048) serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, _ := rand.Int(rand.Reader, serialNumberLimit) template := x509.Certificate{ SerialNumber: serialNumber, NotBefore: time.Now().Add(-24 * time.Hour), NotAfter: time.Now().Add(365 * 24 * time.Hour), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage:[]x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, DNSNames:[]string{host}, } derBytes, _ := x509.CreateCertificate(rand.Reader, &template, caLeaf, &priv.PublicKey, rootCA.PrivateKey) return &tls.Certificate{Certificate: [][]byte{derBytes}, PrivateKey: priv} } func setupHosts() { hostsContent, _ := os.ReadFile(hostsFile) if !strings.Contains(string(hostsContent), "api.openai.com") { f, err := os.OpenFile(hostsFile, os.O_APPEND|os.O_WRONLY, 0644) if err == nil { f.WriteString("\n" + hijackEntry + "\n") f.Close() } } } func handleGracefulShutdown() { sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) <-sigChan fmt.Println("\n🛑 收到退出信号,正在清理环境 (恢复 hosts 和证书)...") file, err := os.Open(hostsFile) if err == nil { var lines[]string scanner := bufio.NewScanner(file) for scanner.Scan() { if scanner.Text() != hijackEntry { lines = append(lines, scanner.Text()) } } file.Close() os.WriteFile(hostsFile,[]byte(strings.Join(lines, "\n")+"\n"), 0644) } uninstallCA() os.Exit(0) } 3 个帖子 - 2 位参与者 阅读完整话题
TRAE v3.3.51 版本正式发布 其中:自定义模型支持 自定义 baseURL :用户在添加/编辑自定义模型时支持配置自定义 baseURL。 给佬友们提个醒,添加模型的时候选择使用其他模型然后输入自己的模型ID 重要 :baseURL要填写完整的URL 支持anthropic的URL完整地址结尾是/anthropic/v1/messages 支持openai的URL完整地址结尾是/openai/v1/chat/completions 6 个帖子 - 5 位参与者 阅读完整话题
7 个帖子 - 4 位参与者 阅读完整话题
有没有佬开了pro+, Bonus usage是多少啊,我开的第一个pro,送了150刀,换了一个账号开了pro送了100刀就提示用完了,好奇他这个 Bonus usage 咋个算的 2 个帖子 - 1 位参与者 阅读完整话题
今早抽到了国际服的邀请码,但是国内版的抽奖网站一直点进去就是黑屏, https://www.trae.cn/solo-code-activity?from=solo_code_modal https://www.trae.cn/solo-code-activity?from=solo_code_modal 1 个帖子 - 1 位参与者 阅读完整话题
可以自定义api地址了。 27 个帖子 - 16 位参与者 阅读完整话题
999r30天,但是没写限量多少,不知道是不是不限量 4 个帖子 - 4 位参与者 阅读完整话题
佬友们,使用谷歌帐号登陆Trae solo提示地区不支持,有知道怎么解决的吗,梯子选的美国节点 6 个帖子 - 4 位参与者 阅读完整话题
公司给配了trae国产的企业版,平时用的不多,就改改前端,但是也不是很好用,找了一圈想把trae里面的gml代理到cc去用,但是没找到,就很好奇为啥没大佬研究这方面 6 个帖子 - 6 位参与者 阅读完整话题
上午抢到了国内版的邀请码,模型太笨了,想尝一下国际版的,我拿了之后会回馈到社区的 1 个帖子 - 1 位参与者 阅读完整话题
佬友们,求一个 trae cn solo 桌面端的邀请码体验下,抽了半个月了抽不到[捂脸] 7 个帖子 - 4 位参与者 阅读完整话题
这个价格各位佬友怎么看? 好像还真能购买的 13 个帖子 - 13 位参与者 阅读完整话题