网站主体备案信息查询网址短链接生成

张小明 2026/1/8 17:03:24
网站主体备案信息查询,网址短链接生成,敬请期待下一句,学做网站开发吗7.4 综合实战#xff1a;视觉代理MCP服务器在本节的实例中#xff0c;实现了一个轻量级的MCP 服务器#xff0c;由Landing AI团队开发#xff0c;能将来自兼容 MCP 协议的客户端#xff08;如Claude Desktop、Cursor、Cline等#xff09;的每个工具调用#xff0c;转换…7.4 综合实战视觉代理MCP服务器在本节的实例中实现了一个轻量级的MCP 服务器由Landing AI团队开发能将来自兼容 MCP 协议的客户端如Claude Desktop、Cursor、Cline等的每个工具调用转换为对Landing AI的VisionAgent REST API的认证HTTPS请求并将包含图像或掩码的响应JSON流回模型让用户无需编写自定义 REST代码或加载额外SDK就能在编辑器中发出自然语言的计算机视觉和文档分析命令。实例7-2执行计算机视觉和文档分析任务的MCP服务器源码路径codes\7\vision-agent-mcp7.4.1 项目介绍本项实现了一个MCP服务器允许用户通过自然语言命令在编辑器中执行计算机视觉和文档分析任务。本项目的主要功能模块如下所示。agentic-document-analysis解析PDF/图像提取文本、表格、图表和diagrams同时考虑布局和其他视觉线索有Web版本text-to-object-detection使用OWLv2、CountGD、Florence-2、AgenticObjectDetection检测自由形式的提示如“所有交通灯”输出边界框有Web版本text-to-instance-segmentation 通过Florence-2Segment-Anything-v2(SAM-2)实现像素级完美掩码activity-recognition 识别视频中的多个活动并提供开始/结束时间戳depth-pro 对单张图像进行高分辨率单目深度估计7.4.2 通用工具1文件src/utils/errors.ts定义了一个错误处理模块用于在Node.js应用程序中创建和管理自定义错误类型。它扩展了JavaScript的内置Error 类创建了几种特定于应用程序的错误类型如 VisionAgentError、ValidationError、FileProcessingError、ApiRequestError和ConfigurationError。每种错误类型都包含一个错误代码、可选的状态码和详细信息。此外还实现了一些辅助函数用于从错误对象创建API 错误响应、创建验证结果以及格式化用户友好的错误消息。/** * 视觉代理的基础错误类继承自原生Error */ export class VisionAgentError extends Error { public readonly code: string; public readonly status?: number; public readonly details?: Recordstring, unknown; /** * 创建一个VisionAgentError实例 * param message 错误消息 * param code 错误代码 * param status HTTP状态码可选 * param details 错误详情可选 */ constructor(message: string, code: string, status?: number, details?: Recordstring, unknown) { super(message); this.name VisionAgentError; this.code code; this.status status; this.details details; } } /** * 验证错误类表示数据验证失败 */ export class ValidationError extends VisionAgentError { /** * 创建一个ValidationError实例 * param message 错误消息 * param details 错误详情可选 */ constructor(message: string, details?: Recordstring, unknown) { super(message, VALIDATION_ERROR, 400, details); this.name ValidationError; } } /** * 文件处理错误类表示文件处理过程中发生的错误 */ export class FileProcessingError extends VisionAgentError { /** * 创建一个FileProcessingError实例 * param message 错误消息 * param details 错误详情可选 */ constructor(message: string, details?: Recordstring, unknown) { super(message, FILE_PROCESSING_ERROR, 400, details); this.name FileProcessingError; } } /** * API请求错误类表示API请求过程中发生的错误 */ export class ApiRequestError extends VisionAgentError { /** * 创建一个ApiRequestError实例 * param message 错误消息 * param status HTTP状态码 * param details 错误详情可选 */ constructor(message: string, status: number, details?: Recordstring, unknown) { super(message, API_REQUEST_ERROR, status, details); this.name ApiRequestError; } } /** * 配置错误类表示配置相关的错误 */ export class ConfigurationError extends VisionAgentError { /** * 创建一个ConfigurationError实例 * param message 错误消息 * param details 错误详情可选 */ constructor(message: string, details?: Recordstring, unknown) { super(message, CONFIGURATION_ERROR, 500, details); this.name ConfigurationError; } } /** * 将错误转换为ApiError对象 * param error 要转换的错误 * returns 转换后的ApiError对象 */ export function createApiError(error: unknown): ApiError { if (error instanceof VisionAgentError) { return { code: error.code, message: error.message, status: error.status, details: error.details }; } if (error instanceof Error) { return { code: UNKNOWN_ERROR, message: error.message, status: 500 }; } return { code: UNKNOWN_ERROR, message: 发生未知错误, status: 500, details: { originalError: error } }; } /** * 创建验证结果对象成功情况 * param success 表示验证是否成功此处为true * param data 验证成功时返回的数据 * returns 验证结果对象 */ export function createValidationResultT(success: true, data: T): ValidationResultT; /** * 创建验证结果对象失败情况 * param success 表示验证是否成功此处为false * param error 验证失败时的错误消息 * returns 验证结果对象 */ export function createValidationResultT(success: false, error: string): ValidationResultT; /** * 创建验证结果对象的实现 * param success 表示验证是否成功 * param dataOrError 验证成功时的数据或验证失败时的错误消息 * returns 验证结果对象 */ export function createValidationResultT(success: boolean, dataOrError: T | string): ValidationResultT { if (success) { return { success: true, data: dataOrError as T }; } else { return { success: false, error: dataOrError as string }; } } /** * 判断错误是否为Axios错误 * param error 要检查的错误 * returns 如果是Axios错误则返回true否则返回false */ export function isAxiosError(error: unknown): error is { isAxiosError: true; response?: { status: number; data: unknown } } { return typeof error object error ! null isAxiosError in error error.isAxiosError true; } /** * 格式化错误信息使其更适合展示给用户 * param error 要格式化的ApiError对象 * returns 格式化后的错误字符串 */ export function formatErrorForUser(error: ApiError): string { let message 错误 ${error.code}; if (error.status) { message (${error.status}); } message : ${error.message}; if (error.details Object.keys(error.details).length 0) { const detailsStr Object.entries(error.details) .map(([key, value]) ${key}: ${String(value)}) .join(, ); message (${detailsStr}); } return message; }2文件src/utils/file.ts是一个文件处理相关的工具函数集合主要功能包括检测文件类型验证文件大小和类型是否符合要求将文件转换为Base64编码支持从本地路径或远程URL获取文件对图像还会进行裁剪、格式转换等处理从Base64字符串加载文件并确定内容类型和文件名以及处理工具参数中的文件包括下载远程文件到临时目录、转换为 Base64 等最后清理临时文件为视觉分析等操作提供文件预处理支持。下面这段代码的功能是将文件转换为Base64编码支持从远程URL或本地路径获取文件对图像文件会进行裁剪、格式转换等处理同时会验证文件类型和大小是否符合要求。原理是先判断文件来源远程或本地获取文件缓冲区后根据文件类型进行相应处理图像文件用sharp库处理后转换为Base64其他类型直接转换。export async function fileToBase64(input: string, options: LoadFileOptions {}): Promisestring {try {//处理文件前验证文件类型const fileType options.fileType || detectFileType(input);validateFileType(input, fileType);let buffer: Buffer;if (input.startsWith(http://) || input.startsWith(https://)) {//从远程URL获取文件const response await axios.get(input, {responseType: arraybuffer,timeout: FILE_LIMITS.DOWNLOAD_TIMEOUT_MS,maxContentLength: getMaxSizeForFileType(fileType)});buffer Buffer.from(response.data, binary);} else {//验证本地文件是否存在且可读await fs.promises.access(input, fs.constants.R_OK);buffer await fs.promises.readFile(input);}//验证文件大小validateFileSize(buffer, fileType);switch (fileType) {case image://对图像进行处理移除透明度、调整大小、转换为png格式const processedImage await sharp(buffer).removeAlpha().resize({width: options.sharpOptions?.formatOptions?.width as number || undefined,height: options.sharpOptions?.formatOptions?.height as number || undefined,fit: inside,withoutEnlargement: true}).toFormat(png).toBuffer();return processedImage.toString(base64);default://非图像文件直接转换为Base64return buffer.toString(base64);}} catch (err) {if (err instanceof Error) {throw new Error(处理文件${input}失败: ${err.message});} else {throw new Error(处理文件${input}失败:未知错误);}}}下面这段代码的功能是从Base64字符串加载文件确定文件的缓冲区、文件名、内容类型等信息。原理是先处理Base64字符串去除数据头转换为缓冲区然后验证文件大小如果指定了文件类型再确定内容类型和文件名最后返回包含这些信息的对象。export function loadFileFromBase64(base64String: string,options: LoadFileOptions): LoadedFile {//检查Base64字符串是否有效if (!base64String || typeof base64String ! string) {throw new Error(提供的Base64字符串无效);}//移除Base64字符串的数据头const base64Data base64String.replace(/^data:([^;]);base64,/, );const buffer Buffer.from(base64Data, base64);//如果指定了文件类型验证文件大小if (options.fileType) {validateFileSize(buffer, options.fileType);}//确定内容类型let contentType options.contentType;if (!contentType) {contentType detectContentTypeFromBase64(base64Data, options.fileType);}//确定文件名let filename options.filename || file;if (!filename.includes(.)) {const extension getExtensionFromContentType(contentType);filename ${filename}.${extension};}return {buffer,filename,contentType,originalSize: buffer.length};}下面这段代码的功能是处理工具参数中的文件包括下载远程文件到临时目录、将文件转换为 Base64等处理完成后清理临时文件。原理是遍历工具参数中的不同文件类型对每个文件进行来源判断本地或远程远程文件下载到临时目录后转换为Base64处理完成后通过finally块清理临时文件。export async function processFileArgs(toolArgs: JsonObject): PromiseJsonObject {const fileTypeMap {images: image,pdfs: pdf,videos: video} as const;const allFileTypes [image, video, pdf, images, pdfs, videos] as const;if (!toolArgs[requestBody] || typeof toolArgs[requestBody] ! object) {return toolArgs;}//跟踪临时文件以便清理const tempFiles: string[] [];try {for (const fileType of allFileTypes) {if (fileType in toolArgs[requestBody]) {const isSingular [image, video, pdf].includes(fileType);const isPluralArray Array.isArray(toolArgs[requestBody][fileType]);if (isSingular || !isPluralArray) {let url toolArgs[requestBody][fileType] as string;if (url?.startsWith()) {url url.slice(1);}//处理远程URLif (url?.startsWith(http://) || url?.startsWith(https://)) {url await downloadToTemp(url, fileType);tempFiles.push(url);}if (url) {const normalizedPath path.normalize(url);if (!path.isAbsolute(normalizedPath)) {throw new Error(请为${fileType}提供全局绝对文件路径而不是本地路径。);}const conversionFileType isSingular ? fileType as FileType : fileTypeMap[fileType as keyof typeof fileTypeMap];const fileBase64 await fileToBase64(url, { fileType: conversionFileType });toolArgs[requestBody][fileType] fileBase64;}} else if (isPluralArray) {const files toolArgs[requestBody][fileType] as string[];//验证数组大小if (files.length FILE_LIMITS.MAX_FILES_IN_ARRAY) {throw new Error(在${fileType}数组中文件数量过多。允许的最大数量${FILE_LIMITS.MAX_FILES_IN_ARRAY}提供的数量${files.length});}const conversionFileType fileTypeMap[fileType as keyof typeof fileTypeMap];const processedFiles: string[] [];for (let i 0; i files.length; i) {let url files[i];if (url?.startsWith()) {url url.slice(1);}//处理远程URLif (url?.startsWith(http://) || url?.startsWith(https://)) {url await downloadToTemp(url, fileType);tempFiles.push(url);}if (url) {const normalizedPath path.normalize(url);if (!path.isAbsolute(normalizedPath)) {throw new Error(请为${fileType}[${i}]提供全局绝对文件路径而不是本地路径。);}const fileBase64 await fileToBase64(url, { fileType: conversionFileType as FileType });processedFiles.push(fileBase64);}}toolArgs[requestBody][fileType] processedFiles;}}}return toolArgs;} finally {//清理临时文件await Promise.allSettled(tempFiles.map(async (tempFile) {try {await fs.promises.unlink(tempFile);} catch (error) {console.warn(清理临时文件失败${tempFile}, error);}}));}}下面这段代码的功能是从远程URL下载文件到临时目录。原理是使用fetch方法获取远程文件验证下载文件的大小是否符合对应文件类型的限制然后将文件内容写入临时目录返回临时文件路径。async function downloadToTemp(url: string, fileType: string): Promisestring {try {//从远程URL获取文件const response await fetch(url, {signal: AbortSignal.timeout(FILE_LIMITS.DOWNLOAD_TIMEOUT_MS)});//检查响应是否成功if (!response.ok) {throw new Error(HTTP ${response.status}: ${response.statusText});}//获取文件大小并验证const contentLength response.headers.get(content-length);if (contentLength) {const size parseInt(contentLength, 10);const detectedFileType detectFileType(url);const maxSize getMaxSizeForFileType(detectedFileType);if (size maxSize) {throw new Error(下载大小${(size / (1024 * 1024)).toFixed(2)}MB超过了${detectedFileType}文件的限制);}}//将响应转换为缓冲区const buffer await response.arrayBuffer();validateFileSize(Buffer.from(buffer), detectFileType(url));//确定临时文件扩展名const ext getFileExtension(fileType);const tempPath path.join(os.tmpdir(), vision_agent_temp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}${ext});//将文件写入临时目录await fs.promises.writeFile(tempPath, Buffer.from(buffer));return tempPath;} catch (error) {if (error instanceof Error) {throw new Error(下载${url}失败: ${error.message});}throw new Error(下载${url}失败:未知错误);}}3文件src/utils/http.ts的功能是对HTTP请求或响应中的数据进行安全处理主要用于日志记录时脱敏敏感信息如API密钥、令牌、密码等同时限制日志内容的长度防止敏感数据泄露并控制日志体积。处理逻辑会根据数据类型字符串、对象或其他类型采取不同的脱敏策略确保关键信息被替换为[REDACTED]。if (typeof data string) { // 移除潜在的敏感信息 return data .replace(/Bearer\s[A-Za-z0-9._-]/g, Bearer [REDACTED]) // 脱敏Bearer令牌 .replace(/Basic\s[A-Za-z0-9/]/g, Basic [REDACTED]) // 脱敏Basic认证信息 .replace(/apiKey\s*:\s*[^]/g, apiKey: [REDACTED]) // 脱敏apiKey字段 .substring(0, HTTP_LIMITS.MAX_RESPONSE_LOG_LENGTH); // 限制日志长度 } if (typeof data object data ! null) { try { // 序列化对象时脱敏敏感字段包含key、token、password、secret的字段 const sanitized JSON.stringify(data, (key, value) { if (typeof key string (key.toLowerCase().includes(key) || key.toLowerCase().includes(token) || key.toLowerCase().includes(password) || key.toLowerCase().includes(secret))) { return [REDACTED]; } return value; }); return sanitized.substring(0, HTTP_LIMITS.MAX_RESPONSE_LOG_LENGTH); // 限制日志长度 } catch { return [无法序列化对象]; } } // 其他类型数据转为字符串后限制长度 return String(data).substring(0, HTTP_LIMITS.MAX_RESPONSE_LOG_LENGTH);
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

电子商务网站建设的一般过程深圳珠宝品牌网站设计

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 选择一篇CVPR2023的视觉Transformer论文,分别用传统手动实现和快马平台自动生成两种方式完成复现。生成对比报告脚本:1) 记录各阶段耗时 2) 代码质量分析 3)…

张小明 2026/1/7 22:02:09 网站建设

建设公司网站管理制度的意义青海微网站建设

突破性远程游戏控制技术:RdpGamepad深度解析 【免费下载链接】RdpGamepad Remote Desktop Plugin for Xbox Gamepads 项目地址: https://gitcode.com/gh_mirrors/rd/RdpGamepad 在数字化娱乐时代,远程游戏体验面临着输入延迟和设备兼容性的双重挑…

张小明 2026/1/7 22:02:11 网站建设

广州站图片安装wordpress 500

Memobase用户记忆系统完整部署指南 【免费下载链接】memobase Profile-Based Long-Term Memory for AI Applications 项目地址: https://gitcode.com/gh_mirrors/me/memobase 项目概述 Memobase是一个基于用户资料的长期记忆系统,专为AI应用程序设计。该系统…

张小明 2026/1/7 22:02:09 网站建设

cms仿站建设第二个北京在哪里

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速开发一个RT-Thread物联网原型系统,功能需求:1.通过ESP8266连接WiFi;2.采集环境光强度(模拟数据即可);3.每…

张小明 2026/1/7 22:02:13 网站建设

北京网站报价wordpress二次开发手册chm

ABB RobotWare数据包一键下载:全面版本覆盖与快速安装指南 【免费下载链接】ABBRobotWare数据包下载分享指南 本仓库致力于提供ABB RobotWare的各种版本数据包,旨在帮助那些需要在不同版本间切换或更新ABB机器人操作软件的开发者和工程师。由于官方渠道可…

张小明 2026/1/7 22:02:14 网站建设

男女做羞羞完整版网站洛阳网百姓呼声

YOLOv11损失函数改进:提升小目标检测能力 在复杂场景下的目标检测任务中,一个长期存在的挑战是——那些只占图像极少数像素的目标,比如高空航拍图中的车辆、监控画面里的行人,或是显微镜下的细胞结构,常常被模型“视而…

张小明 2026/1/7 22:02:14 网站建设