新闻详情

新闻详情

首页 / 资讯中心 / 详情

Flask+YOLO+RTSP多路视频实时推理服务搭建

发布时间:2026/9/29 5:11:10来源:尧图网络
Flask+YOLO+RTSP多路视频实时推理服务搭建
简介本资源是一个基于Flask框架构建的轻量级RTSP视频流实时目标检测系统面向人工智能初学者、计算机视觉开发者及智能安防项目实践者解决监控场景下低延迟YOLO推理与Web可视化落地难题。压缩包共771个文件主体为725个Python源码含核心rtsp_inference.py、Flask路由与模板逻辑、8个跨平台可执行程序支持ARM64/64/32位、以及pt模型文件、HTML前端模板、配置文件和环境依赖相关脚本整体体积仅8.25MB便于快速部署与二次开发。已有55人学习下载资源结构清晰source目录组织主逻辑templates提供结果渲染界面backup保留关键备份配套best.pt模型开箱即用。读者可直接运行获得RTSP流接入、YOLOv5/v8级目标检测、边界框标注与类别置信度Web展示全流程能力并通过预置多架构exe与venv环境脚本降低Windows/Linux部署门槛。1. 把 RTSP 视频流喂进 YOLO 模型再用 Flask 端出网页不是“跑通就行”而是能扛住 4 路海康枪机、30fps 不卡顿的轻量级推理服务你手头有一批海康/大华 IPC 摄像头RTSP 地址已经配好rtsp://admin:password192.168.1.64:554/stream1想实时检测人、车、安全帽——但 OpenCV YOLOv5 的脚本一跑就吃满 CPU浏览器里cv2.imshow()根本没法给产线同事看用 FastAPI 写个 API 又嫌依赖重、部署慢而现成的商业平台要么贵、要么绑定云服务、要么黑匣子改不了逻辑。这个基于Flask的RTSP视频流YOLO推理.zip就是为这种“既要实时、又要可控、还要能本地跑”的硬需求打磨出来的它不依赖 Docker 或 GPU 服务器纯 Python Flask OpenCV PyTorch在 i5-8250U 笔记本上实测可稳定拉取 4 路 720p25fps RTSP 流每路独立 YOLOv5s 推理CPU 模式帧率维持在 18~22 FPS前端通过 MJPEG Stream 自动拼接四宫格画面所有代码无加密、无外链、无隐藏模块。适合安防集成商快速交付、高校实验室做边缘 demo、工厂产线做简易 AI 巡检原型——尤其适合那些被“Flask 如何绑定到网页元素”“RTSP 浏览器播放失败”“YOLO 多路推理卡死”反复翻车的工程师。2. 从拉流、解码、推理到推流四层流水线拆解与关键参数实测2.1 RTSP 拉流层为什么不用cv2.VideoCapture直连TCP/UDP 自动降级策略怎么写项目没用cv2.VideoCapture(rtsp_url)简单粗暴拉流是因为该方式在弱网或高丢包场景下极易阻塞主线程且无法感知连接断开。实际采用cv2.VideoCapturethreading.Eventurllib.parse三重兜底# stream_manager.py import cv2 import threading import time from urllib.parse import urlparse class RTSPStream: def __init__(self, rtsp_url, timeout5): self.rtsp_url rtsp_url self.cap None self.frame None self.is_running False self.lock threading.Lock() self._stop_event threading.Event() # 解析协议类型强制 TCP海康/大华推荐 parsed urlparse(rtsp_url) if tcp not in rtsp_url.lower(): self.rtsp_url f{parsed.scheme}://{parsed.netloc}{parsed.path}?tcp def start(self): self.is_running True self.thread threading.Thread(targetself._read_frame_loop) self.thread.daemon True self.thread.start() def _read_frame_loop(self): while self.is_running and not self._stop_event.is_set(): try: if self.cap is None: self.cap cv2.VideoCapture(self.rtsp_url, cv2.CAP_FFMPEG) self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 关键减小缓冲区防卡顿 self.cap.set(cv2.CAP_PROP_FPS, 25) # 设置超时FFmpeg 后端支持 self.cap.set(cv2.CAP_PROP_OPEN_TIMEOUT_MSEC, 3000) self.cap.set(cv2.CAP_PROP_READ_TIMEOUT_MSEC, 3000) ret, frame self.cap.read() if not ret: # 主动释放并重连 self._reconnect() continue with self.lock: self.frame frame.copy() except Exception as e: print(f[{self.rtsp_url}] 拉流异常: {e}) self._reconnect() time.sleep(2) def _reconnect(self): if self.cap: self.cap.release() self.cap None # 清空 frame 防止旧帧残留 with self.lock: self.frame None提示cv2.CAP_PROP_BUFFERSIZE 1是血泪经验——默认缓冲区 3~5 帧网络抖动时会积压导致延迟飙升?tcp强制走 TCP 协议海康/大华设备默认 UDP 易丢包OPEN_TIMEOUT_MSEC和READ_TIMEOUT_MSEC必须显式设置否则cap.read()会无限阻塞。2.2 解码与预处理层YOLO 输入尺寸适配、BGR→RGB 转换、归一化如何避免精度损失YOLOv5 默认输入为640x640但直接cv2.resize(frame, (640,640))会严重拉伸变形。项目采用「保持宽高比 黑边填充」策略并复用官方letterbox函数来自utils/general.py# utils/preprocess.py import numpy as np import cv2 def letterbox(img, new_shape(640, 640), color(114, 114, 114), autoTrue, scaleFillFalse, scaleupTrue): # 官方 letterbox 实现保留原始比例 shape img.shape[:2] # [height, width] if isinstance(new_shape, int): new_shape (new_shape, new_shape) # Scale ratio (new / old) r min(new_shape[0] / shape[0], new_shape[1] / shape[1]) if not scaleup: # only scale down r min(r, 1.0) # Compute padding ratio r, r # width, height ratios new_unpad int(round(shape[1] * r)), int(round(shape[0] * r)) dw, dh new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh padding if auto: # minimum rectangle dw, dh np.mod(dw, 32), np.mod(dh, 32) # wh padding elif scaleFill: # stretch dw, dh 0.0, 0.0 new_unpad (new_shape[1], new_shape[0]) ratio new_shape[1] / shape[1], new_shape[0] / shape[0] dw / 2 # divide padding into 2 sides dh / 2 if shape[::-1] ! new_unpad: # resize img cv2.resize(img, new_unpad, interpolationcv2.INTER_LINEAR) top, bottom int(round(dh - 0.1)), int(round(dh 0.1)) left, right int(round(dw - 0.1)), int(round(dw 0.1)) img cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, valuecolor) # add border return img, ratio, (dw, dh) # 使用示例 def preprocess_frame(frame, img_size640): # BGR to RGB, normalize to [0,1], HWC to CHW img letterbox(frame, new_shapeimg_size)[0] img img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, to 3x640x640 img np.ascontiguousarray(img) img torch.from_numpy(img).float() / 255.0 # 归一化 if img.ndimension() 3: img img.unsqueeze(0) return img注意letterbox中autoTrue保证 padding 是 32 的倍数YOLO 下采样步长避免模型因尺寸不对齐报错cv2.copyMakeBorder填充黑边而非拉伸确保检测框坐标可逆映射回原始画面。2.3 YOLO 推理层CPU 模式下如何把 YOLOv5s 推理压到 45ms/帧项目默认加载yolov5s.ptPyTorch 官方预训练权重但做了三项关键优化模型半精度FP16推理model.half()img.half()CPU 上提速约 1.8x需 PyTorch ≥1.9NMS 阈值精简conf_thres0.4,iou_thres0.45平衡速度与漏检禁用梯度计算torch.no_grad()model.eval()关闭 BN 统计更新。# inference.py import torch from models.experimental import attempt_load from utils.general import non_max_suppression class YOLOInference: def __init__(self, weightsyolov5s.pt, devicecpu): self.device torch.device(device) self.model attempt_load(weights, map_locationself.device) self.model.half() # FP16 self.model.eval() self.names self.model.module.names if hasattr(self.model, module) else self.model.names def run(self, img_tensor): # img_tensor: [1, 3, 640, 640], float16, devicecpu with torch.no_grad(): pred self.model(img_tensor, augmentFalse)[0] pred non_max_suppression(pred, conf_thres0.4, iou_thres0.45, classesNone, agnosticFalse) return pred # 实测耗时i5-8250U, PyTorch 1.12 # FP32: ~82ms/帧 → FP16: ~45ms/帧 → 加入 warmup 后稳定在 42±3ms提示首次推理前必须执行model(torch.zeros(1, 3, 640, 640).to(device).half())预热否则首帧耗时翻倍non_max_suppression返回的是List[torch.Tensor]每个 Tensor 形如[num_dets, 6]xyxy, conf, cls。2.4 MJPEG 推流层Flask 如何把多路推理结果合成一路 HTTP 流Flask 本身不支持 WebSocket 或 WebRTC项目采用最轻量的 MJPEG over HTTP 方案——每个摄像头对应一个/stream/id路由浏览器img src/stream/0自动轮询# app.py from flask import Flask, Response, render_template import cv2 import threading from stream_manager import RTSPStream from inference import YOLOInference app Flask(__name__) streams [] inference_engine YOLOInference(yolov5s.pt) app.route(/stream/int:idx) def video_feed(idx): def generate(): while True: frame streams[idx].get_latest_frame() # 从 RTSPStream 获取最新帧 if frame is None: time.sleep(0.1) continue # YOLO 推理 绘制 bbox img_tensor preprocess_frame(frame) preds inference_engine.run(img_tensor) annotated_frame draw_boxes(frame, preds[0]) # 绘制函数见下文 # 编码为 JPEG ret, buffer cv2.imencode(.jpg, annotated_frame, [cv2.IMWRITE_JPEG_QUALITY, 85]) if not ret: continue frame_bytes buffer.tobytes() yield (b--frame\r\n bContent-Type: image/jpeg\r\n\r\n frame_bytes b\r\n) return Response(generate(), mimetypemultipart/x-mixed-replace; boundaryframe) def draw_boxes(img, pred, names[person, car, bus], colors[(0,255,0), (255,0,0), (0,0,255)]): for *xyxy, conf, cls in pred: label f{names[int(cls)]} {conf:.2f} c1, c2 (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])) cv2.rectangle(img, c1, c2, colors[int(cls) % len(colors)], 2) t_size cv2.getTextSize(label, 0, fontScale0.5, thickness1)[0] c2 c1[0] t_size[0], c1[1] - t_size[1] - 3 cv2.rectangle(img, c1, c2, colors[int(cls) % len(colors)], -1) cv2.putText(img, label, (c1[0], c1[1] - 2), 0, 0.5, [225, 255, 255], thickness1, lineTypecv2.LINE_AA) return img注意multipart/x-mixed-replace是浏览器原生支持的流式 MIME 类型无需额外 JScv2.imencode(..., quality85)平衡画质与带宽实测 720p 流约 350KB/sdraw_boxes中cv2.putText字体大小设为0.5防止小字体糊成一片。3. 多路并发下的资源争抢与内存泄漏四个必须堵死的坑3.1 现象启动 4 路 RTSP 后第 3 分钟开始 CPU 占用率从 60% 暴涨到 100%top显示python进程 RSS 内存持续增长原因cv2.VideoCapture在频繁重连时未彻底释放底层 FFmpeg AVFormatContext导致内存泄漏同时threading.Event未正确清理线程句柄堆积。解决在_reconnect()中强制调用gc.collect()并增加cap.release()后的del cap和time.sleep(0.05)等待释放def _reconnect(self): if self.cap: self.cap.release() del self.cap self.cap None gc.collect() # 强制回收 time.sleep(0.05) # 让 FFmpeg 释放资源3.2 现象浏览器打开/stream/0正常但/stream/1卡死cv2.VideoCapture返回None原因FFmpeg 后端对并发 RTSP 连接数有限制默认 4且CAP_FFMPEG在多线程中非完全线程安全。解决全局限制 FFmpeg 并发数启动时设置环境变量# app.py 开头 import os os.environ[OPENCV_FFMPEG_CAPTURE_OPTIONS] rtsp_transport;tcp # 并在 stream_manager.py 中为每个 RTSPStream 实例设置唯一标识 self.cap cv2.VideoCapture(self.rtsp_url, cv2.CAP_FFMPEG) self.cap.set(cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_NONE) # 禁用硬件加速防冲突3.3 现象YOLO 推理结果偶尔出现“检测框漂移”或“同一目标 ID 反复跳变”原因preprocess_frame中letterbox的 padding 值未同步记录导致绘制 bbox 时坐标未还原到原始分辨率。解决letterbox返回(img, ratio, (dw, dh))绘制前必须逆向还原def draw_boxes(img, pred, ratio, pad): # ratio (width_ratio, height_ratio), pad (dw, dh) for *xyxy, conf, cls in pred: # 还原到原始尺寸 xyxy[0] (xyxy[0] - pad[0]) / ratio[0] xyxy[1] (xyxy[1] - pad[1]) / ratio[1] xyxy[2] (xyxy[2] - pad[0]) / ratio[0] xyxy[3] (xyxy[3] - pad[1]) / ratio[1] # ... 后续绘制3.4 现象Flask 服务运行 2 小时后/stream/0返回500 Internal Server Error日志显示OSError: [Errno 24] Too many open files原因Linux 默认单进程文件描述符限制为 1024MJPEG 流每个请求占用 1 文件句柄多用户访问迅速耗尽。解决启动 Flask 前提升 ulimit并在app.run()中指定threadedTrue已默认开启# 启动前执行 ulimit -n 65536 python app.py提示生产环境务必用gunicorn替代flask run其--worker-class gevent可大幅降低文件句柄消耗。4. 四宫格总览页实现HTML/CSS/JS 如何让多路流“真同步”不撕裂4.1 前端布局CSS Grid 实现自适应四宫格拒绝float或inline-block坑templates/index.html使用 CSS Grid 确保四路流严格等宽等高且响应式缩放!DOCTYPE html html head titleAI 视频总览/title style body { margin: 0; padding: 0; background: #000; } .grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; height: 100vh; gap: 2px; } .stream-item { width: 100%; height: 100%; background: #000; } .stream-item img { width: 100%; height: 100%; object-fit: contain; /* 关键防止拉伸 */ display: block; } media (max-width: 768px) { .grid-container { grid-template-columns: 1fr; grid-template-rows: 1fr 1fr 1fr 1fr; } } /style /head body div classgrid-container div classstream-itemimg src/stream/0 //div div classstream-itemimg src/stream/1 //div div classstream-itemimg src/stream/2 //div div classstream-itemimg src/stream/3 //div /div /body /html注意object-fit: contain保证图像按比例缩放填满容器不裁剪不拉伸gap: 2px提供视觉分隔移动端media查询自动切为竖排四路。4.2 流同步控制如何避免四路img加载不同步导致“画面撕裂”浏览器默认并行加载img但各路 RTSP 流起始时间不同导致画面不同步。项目采用 JS 控制加载时序script // 等待 DOM 加载完成按顺序触发加载 document.addEventListener(DOMContentLoaded, function() { const streams [/stream/0, /stream/1, /stream/2, /stream/3]; const imgs document.querySelectorAll(.stream-item img); streams.forEach((src, idx) { setTimeout(() { imgs[idx].src src ?t Date.now(); // 添加时间戳防缓存 }, idx * 100); // 每路延迟 100ms模拟同步启动 }); }); /script提示?t时间戳强制绕过浏览器缓存setTimeout延迟虽小但能显著减少首帧不同步现象实测 4 路流首帧时间差从 ±800ms 降至 ±120ms。4.3 推理状态反馈在视频画面上叠加 FPS、设备温度、模型加载时间项目在draw_boxes后追加状态栏绘制信息直出不依赖额外 APIdef draw_status(img, fps, temp_cNone, model_load_time0.0): h, w img.shape[:2] # 底部状态栏 cv2.rectangle(img, (0, h-30), (w, h), (0,0,0), -1) text fFPS: {fps:.1f} | Model: {model_load_time:.2f}s if temp_c: text f | CPU: {temp_c}°C cv2.putText(img, text, (10, h-8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,255,0), 1) return img # 在 generate() 中调用 annotated_frame draw_boxes(frame, preds[0]) annotated_frame draw_status(annotated_frame, fps, temp_cget_cpu_temp())注意get_cpu_temp()使用psutil.sensors_temperatures()Linux或wmiWindows需安装psutil状态栏高度固定 30px字体大小 0.4 防遮挡。5. 生产级加固从“能跑”到“可运维”的六个落地技巧5.1 配置中心化把 4 路 RTSP 地址、模型路径、推理阈值全抽到config.yaml硬编码地址和参数是运维噩梦。项目提供config.yaml示例# config.yaml streams: - url: rtsp://admin:12345192.168.1.101:554/stream1 name: 东门入口 enabled: true - url: rtsp://admin:12345192.168.1.102:554/stream1 name: 西门出口 enabled: false - url: rtsp://admin:12345192.168.1.103:554/stream1 name: 车间A enabled: true - url: rtsp://admin:12345192.168.1.104:554/stream1 name: 仓库B enabled: true model: weights: weights/yolov5s.pt img_size: 640 conf_thres: 0.4 iou_thres: 0.45 flask: host: 0.0.0.0 port: 5000 debug: false加载逻辑config.pyimport yaml from pathlib import Path def load_config(config_pathconfig.yaml): with open(config_path, r, encodingutf-8) as f: cfg yaml.safe_load(f) # 过滤 disabled 流 cfg[streams] [s for s in cfg[streams] if s.get(enabled, True)] return cfg CONFIG load_config()提示yaml.safe_load防止任意代码执行enabled: false可快速关停某路流而不改代码配置文件路径支持绝对/相对路径。5.2 日志分级ERROR 级别只报致命错误INFO 级别记录每路流健康状态项目使用logging.config.dictConfig实现结构化日志# logging_config.py LOGGING_CONFIG { version: 1, disable_existing_loggers: False, formatters: { standard: {format: %(asctime)s [%(levelname)s] %(name)s: %(message)s}, detailed: {format: %(asctime)s [%(levelname)s] %(name)s %(funcName)s:%(lineno)d: %(message)s} }, handlers: { file: { level: INFO, class: logging.handlers.RotatingFileHandler, filename: logs/app.log, maxBytes: 10485760, # 10MB backupCount: 5, formatter: detailed, encoding: utf8 }, console: { level: WARNING, class: logging.StreamHandler, formatter: standard } }, loggers: { stream_manager: {handlers: [file, console], level: INFO, propagate: False}, inference: {handlers: [file], level: INFO, propagate: False}, app: {handlers: [file, console], level: INFO, propagate: False} } } # app.py 中应用 import logging.config logging.config.dictConfig(LOGGING_CONFIG) logger logging.getLogger(app) logger.info(Flask server started on %s:%d, CONFIG[flask][host], CONFIG[flask][port])注意RotatingFileHandler自动轮转日志避免磁盘占满stream_manager日志级别设为INFO每 10 秒记录一次连接状态console只输出WARNING以上避免刷屏。5.3 模型热加载不重启服务动态切换 YOLO 权重文件当客户要求临时换模型如从yolov5s.pt切到yolov5m.pt无需CtrlC再python app.py。项目提供/api/reload_model接口app.route(/api/reload_model, methods[POST]) def reload_model(): data request.get_json() new_weights data.get(weights, yolov5s.pt) try: global inference_engine inference_engine YOLOInference(new_weights) logger.info(fModel reloaded: {new_weights}) return jsonify({status: success, model: new_weights}) except Exception as e: logger.error(fModel reload failed: {e}) return jsonify({status: error, message: str(e)}), 500前端调用示例curlcurl -X POST http://localhost:5000/api/reload_model \ -H Content-Type: application/json \ -d {weights: weights/yolov5m.pt}提示热加载会短暂中断推理约 200ms但不影响流服务新模型需提前放入weights/目录接口返回 JSON 便于自动化脚本调用。5.4 健康检查端点/health返回各组件状态供 Nginx 或 Prometheus 采集app.route(/health) def health_check(): status { status: healthy, timestamp: time.time(), streams: [], model: { weights: inference_engine.weights, device: str(inference_engine.device), warmup: True } } for i, stream in enumerate(streams): status[streams].append({ id: i, url: stream.rtsp_url, is_running: stream.is_running, last_frame_time: getattr(stream, _last_frame_time, 0), latency_ms: int((time.time() - getattr(stream, _last_frame_time, 0)) * 1000) if hasattr(stream, _last_frame_time) else -1 }) # 检查是否所有流都存活 if not all(s[is_running] for s in status[streams]): status[status] degraded return jsonify(status)注意/health返回标准 JSON字段名与 Prometheus exporter 兼容latency_ms计算最后一帧时间戳3000ms 视为流中断Nginx 可配置health_check指向此端点实现自动摘除故障节点。5.5 Windows 兼容性补丁OpenCV 在 Win10 上的 RTSP 乱码与中文路径问题项目在stream_manager.py开头加入 Windows 特殊处理import sys if sys.platform win32: import locale # 强制 UTF-8 编码解决中文路径乱码 locale.setlocale(locale.LC_ALL, Chinese_China.936) # 替换 FFmpeg 路径若用户自定义 os.environ[OPENCV_FFMPEG_BINARY] ffmpeg.exe # 放入同目录同时requirements.txt明确指定 Windows 友好版本opencv-python4.8.1.78 torch1.12.1cpu numpy1.23.5 Flask2.2.5 PyYAML6.0.1 psutil5.9.5提示opencv-python4.8.1.78是最后一个稳定支持cv2.CAP_FFMPEG的版本torch1.12.1cpu适配 Win10 x64psutil用于获取 CPU 温度需管理员权限。从那以后我每次部署前都强制走一遍python -c import cv2; print(cv2.__version__)和python -c import torch; print(torch.__version__, torch.cuda.is_available())—— 表面看是校验环境实则是给自己留个后悔药只要这两行不出错后面 90% 的坑都不会踩。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

超声波测距原理与嵌入式实战:从HC-SR04到温度补偿 2026/9/29 6:02:30

超声波测距原理与嵌入式实战:从HC-SR04到温度补偿

1. 项目概述:为什么超声波测距是嵌入式入门绕不开的“第一道硬菜”超声波测距不是个新鲜词,但凡做过单片机课程设计、智能小车、倒车雷达或者物联网感知层开发的人,几乎都和HC-SR04或US-100打过交道。它不像LED闪烁那样只是验证IO口&#xff…

阅读更多 →
ctf-wiki 逆向脱壳实战:手动定位 IAT 并用 ImportREC 重建导入表 2026/9/29 6:02:30

ctf-wiki 逆向脱壳实战:手动定位 IAT 并用 ImportREC 重建导入表

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 当我们在 OllyDbg 中借助 ESP 定律等技巧找到程序 OEP 并完成内存转储(Dump)后&…

阅读更多 →
Qoder AI编程环境实操指南:安装配置到IDE插件联动 2026/9/29 6:02:30

Qoder AI编程环境实操指南:安装配置到IDE插件联动

如果你最近在折腾 AI 编程工具,估计绕不开 Qoder 这个名字。它是一款把大模型能力直接内嵌到日常开发流程里的 AI 编程环境,对话生成代码、上下文补全、报错解释、批量重构,这些原本要来回切换网页和编辑器才能完成的事,现在在编辑…

阅读更多 →
微信聊天记录导出完整指南:10 分钟出第一份文件 2026/9/29 6:02:30

微信聊天记录导出完整指南:10 分钟出第一份文件

微信聊天记录导出完整指南:10 分钟出第一份文件 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …

阅读更多 →
收藏备用!智能体(Agent)从入门到核心架构全解析:TaoToken 统一 Key 接入配置实战 2026/9/29 6:02:30

收藏备用!智能体(Agent)从入门到核心架构全解析:TaoToken 统一 Key 接入配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI 编程助手做 iOS 开发靠谱吗?TaoToken 统一 Key 接入 Cline 的 Swift 工程实测 2026/9/29 6:02:23

AI 编程助手做 iOS 开发靠谱吗?TaoToken 统一 Key 接入 Cline 的 Swift 工程实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉