luma-mcp 1.2.8 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -125,7 +125,7 @@ npx luma-mcp
125
125
  "mcpServers": {
126
126
  "luma": {
127
127
  "command": "node",
128
- "args": ["D:\\codes\\Luma_mcp\\build\\index.js"],
128
+ "args": ["D:\\codes\\luma-mcp\\build\\index.js"],
129
129
  "env": {
130
130
  "ZHIPU_API_KEY": "your-zhipu-api-key"
131
131
  }
@@ -141,7 +141,7 @@ npx luma-mcp
141
141
  "mcpServers": {
142
142
  "luma": {
143
143
  "command": "node",
144
- "args": ["D:\\codes\\Luma_mcp\\build\\index.js"],
144
+ "args": ["D:\\codes\\luma-mcp\\build\\index.js"],
145
145
  "env": {
146
146
  "MODEL_PROVIDER": "siliconflow",
147
147
  "SILICONFLOW_API_KEY": "your-siliconflow-api-key"
@@ -368,35 +368,35 @@ analyze_image({
368
368
 
369
369
  ### 通用配置
370
370
 
371
- | 变量名 | 必需 | 默认值 | 说明 |
372
- | ----------------- | ---- | ------- | ---------------------------------------------- |
371
+ | 变量名 | 必需 | 默认值 | 说明 |
372
+ |-------------------|------|---------|----------------------------------------------|
373
373
  | `MODEL_PROVIDER` | 否 | `zhipu` | 模型提供商:`zhipu`、`siliconflow` 或 `qwen` |
374
374
  | `MODEL_NAME` | 否 | 见下文 | 模型名称(自动根据提供商选择) |
375
- | `MAX_TOKENS` | 否 | `16384` | 最大生成 tokens |
376
- | `TEMPERATURE` | 否 | `0.7` | 温度参数 (0-1) |
377
- | `TOP_P` | 否 | `0.7` | Top-p 参数 (0-1) |
375
+ | `MAX_TOKENS` | 否 | `16384` | 最大生成 tokens |
376
+ | `TEMPERATURE` | 否 | `0.7` | 温度参数 (0-1) |
377
+ | `TOP_P` | 否 | `0.7` | Top-p 参数 (0-1) |
378
378
  | `ENABLE_THINKING` | 否 | `true` | 是否启用思考模式(GLM-4.6V 和 Qwen3-VL-Flash) |
379
379
 
380
380
  ### 智谱 GLM-4.6V 专用
381
381
 
382
- | 变量名 | 必需 | 默认值 | 说明 |
383
- | --------------- | ---------------- | ------ | ------------------- |
382
+ | 变量名 | 必需 | 默认值 | 说明 |
383
+ |-----------------|----------------|--------|---------------------|
384
384
  | `ZHIPU_API_KEY` | 是(使用智谱时) | - | 智谱 AI 的 API 密钥 |
385
385
 
386
386
  默认模型:`glm-4.6v`
387
387
 
388
388
  ### 硅基流动 DeepSeek-OCR 专用
389
389
 
390
- | 变量名 | 必需 | 默认值 | 说明 |
391
- | --------------------- | -------------------- | ------ | ------------------- |
390
+ | 变量名 | 必需 | 默认值 | 说明 |
391
+ |-----------------------|--------------------|--------|---------------------|
392
392
  | `SILICONFLOW_API_KEY` | 是(使用硅基流动时) | - | 硅基流动的 API 密钥 |
393
393
 
394
394
  默认模型:`deepseek-ai/DeepSeek-OCR`
395
395
 
396
396
  ### 阿里云通义千问 Qwen3-VL-Flash 专用
397
397
 
398
- | 变量名 | 必需 | 默认值 | 说明 |
399
- | ------------------- | ---------------- | ------ | --------------------- |
398
+ | 变量名 | 必需 | 默认值 | 说明 |
399
+ |---------------------|----------------|--------|-----------------------|
400
400
  | `DASHSCOPE_API_KEY` | 是(使用千问时) | - | 阿里云百炼的 API 密钥 |
401
401
 
402
402
  默认模型:`qwen3-vl-flash`
@@ -542,13 +542,13 @@ data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA...
542
542
  ### 如何选择模型?
543
543
 
544
544
  | 特性 | GLM-4.6V(智谱) | DeepSeek-OCR(硅基流动) | Qwen3-VL-Flash(阿里云) |
545
- | ------------- | ---------------- | ------------------------ | ------------------------ |
546
- | **费用** | 收费 | **完全免费** | 收费 |
547
- | **中文理解** | 优秀 | 良好 | **优秀** |
548
- | **OCR 能力** | 良好 | **优秀** | 优秀 |
549
- | **思考模式** | 支持 | 不支持 | 支持 |
550
- | **速度/成本** | 中等 | 免费 | **快速/低成本** |
551
- | **适用场景** | 通用图片分析 | OCR、文字识别 | 快速分析、3D 定位 |
545
+ |---------------|----------------|------------------------|------------------------|
546
+ | **费用** | 收费 | **完全免费** | 收费 |
547
+ | **中文理解** | 优秀 | 良好 | **优秀** |
548
+ | **OCR 能力** | 良好 | **优秀** | 优秀 |
549
+ | **思考模式** | 支持 | 不支持 | 支持 |
550
+ | **速度/成本** | 中等 | 免费 | **快速/低成本** |
551
+ | **适用场景** | 通用图片分析 | OCR、文字识别 | 快速分析、3D 定位 |
552
552
 
553
553
  **推荐**:
554
554
 
package/build/config.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface LumaConfig {
11
11
  temperature: number;
12
12
  topP: number;
13
13
  enableThinking: boolean;
14
+ baseVisionPrompt?: string;
14
15
  }
15
16
  /**
16
17
  * 从环境变量加载配置
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAE5E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,UAAU,CA+CvC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAE5E,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,UAAU,CAgDvC"}
package/build/config.js CHANGED
@@ -15,28 +15,28 @@ export function loadConfig() {
15
15
  apiKey = process.env.SILICONFLOW_API_KEY;
16
16
  defaultModel = 'deepseek-ai/DeepSeek-OCR';
17
17
  if (!apiKey) {
18
- throw new Error('SILICONFLOW_API_KEY environment variable is required when using SiliconFlow provider');
18
+ throw new Error('SILICONFLOW_API_KEY environment variable is required. Please configure it in your MCP settings.');
19
19
  }
20
20
  }
21
21
  else if (provider === 'qwen') {
22
22
  apiKey = process.env.DASHSCOPE_API_KEY;
23
23
  defaultModel = 'qwen3-vl-flash';
24
24
  if (!apiKey) {
25
- throw new Error('DASHSCOPE_API_KEY environment variable is required when using Qwen provider');
25
+ throw new Error('DASHSCOPE_API_KEY environment variable is required. Please configure it in your MCP settings.');
26
26
  }
27
27
  }
28
28
  else if (provider === 'volcengine') {
29
29
  apiKey = process.env.VOLCENGINE_API_KEY;
30
30
  defaultModel = 'doubao-seed-1-6-flash-250828';
31
31
  if (!apiKey) {
32
- throw new Error('VOLCENGINE_API_KEY environment variable is required when using Volcengine provider');
32
+ throw new Error('VOLCENGINE_API_KEY environment variable is required. Please configure it in your MCP settings.');
33
33
  }
34
34
  }
35
35
  else {
36
36
  apiKey = process.env.ZHIPU_API_KEY;
37
37
  defaultModel = 'glm-4.6v';
38
38
  if (!apiKey) {
39
- throw new Error('ZHIPU_API_KEY environment variable is required when using Zhipu provider');
39
+ throw new Error('ZHIPU_API_KEY environment variable is required. Please configure it in your MCP settings.');
40
40
  }
41
41
  }
42
42
  return {
@@ -47,6 +47,7 @@ export function loadConfig() {
47
47
  temperature: parseFloat(process.env.TEMPERATURE || '0.7'),
48
48
  topP: parseFloat(process.env.TOP_P || '0.7'),
49
49
  enableThinking: process.env.ENABLE_THINKING !== 'false',
50
+ baseVisionPrompt: process.env.BASE_VISION_PROMPT,
50
51
  };
51
52
  }
52
53
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,aAAa;IACb,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,OAAO,CAAkB,CAAC;IAEzF,kBAAkB;IAClB,IAAI,MAA0B,CAAC;IAC/B,IAAI,YAAoB,CAAC;IAEzB,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QACzC,YAAY,GAAG,0BAA0B,CAAC;QAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACvC,YAAY,GAAG,gBAAgB,CAAC;QAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACxC,YAAY,GAAG,8BAA8B,CAAC;QAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACnC,YAAY,GAAG,UAAU,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY;QAC7C,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,EAAE,EAAE,CAAC;QAC1D,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,KAAK,CAAC;QACzD,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC;QAC5C,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,OAAO;KACxD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,aAAa;IACb,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,OAAO,CAAkB,CAAC;IAEzF,kBAAkB;IAClB,IAAI,MAA0B,CAAC;IAC/B,IAAI,YAAoB,CAAC;IAEzB,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QACzC,YAAY,GAAG,0BAA0B,CAAC;QAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACvC,YAAY,GAAG,gBAAgB,CAAC;QAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACxC,YAAY,GAAG,8BAA8B,CAAC;QAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;QACpH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACnC,YAAY,GAAG,UAAU,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY;QAC7C,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,EAAE,EAAE,CAAC;QAC1D,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,KAAK,CAAC;QACzD,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC;QAC9C,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,OAAO;QACvD,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;KAC/C,CAAC;AACJ,CAAC"}
package/build/index.js CHANGED
@@ -16,6 +16,37 @@ import { QwenClient } from "./qwen-client.js";
16
16
  import { VolcengineClient } from "./volcengine-client.js";
17
17
  import { imageToBase64, validateImageSource } from "./image-processor.js";
18
18
  import { withRetry, createSuccessResponse, createErrorResponse, } from "./utils/helpers.js";
19
+ /**
20
+ * Default base vision prompt used when BASE_VISION_PROMPT is not set.
21
+ * This acts like a lightweight system prompt for image understanding.
22
+ *
23
+ * 设计目标:
24
+ * - 优先输出基于截图“可见事实”的结构/布局信息
25
+ * - 尽量减少凭经验猜测实现方式、性能、无障碍等不可见细节
26
+ */
27
+ const DEFAULT_BASE_VISION_PROMPT = [
28
+ "你是一个专门帮助开发者理解截图内容的视觉结构分析助手。",
29
+ "你的首要目标是:基于截图中可见的信息,准确还原页面/界面的结构、布局和主要元素,而不是主观做视觉审美评价或猜测底层实现。",
30
+ "当用户提到“页面结构”、“页面架构”、“布局”、“组件树”、“还原界面”、“前端/客户端界面”等需求时,请遵循以下原则:",
31
+ "1. 先进行【事实描述】,只陈述从截图中可以直接观察到的内容(区域划分、布局方式、组件/控件、大致层级关系等);不要推测不可见的信息,例如具体实现技术(JS/CSS/Canvas)、运行性能、无障碍属性(aria-*)、隐藏的交互状态(hover/focus/点击后的效果等)。",
32
+ "2. 描述布局时,尽量用有助于还原实现的方式组织信息,例如:顶部导航栏 / 左侧侧边栏 / 主内容区 / 底部栏、单栏/双栏/多栏、是否有固定头部等。",
33
+ "3. 如用户没有明确要求“设计点评/优化建议”,可以完全不写或只给最多 1~2 条简短、标明为“通用建议”的内容,且要明确说明这些建议无法仅凭截图确认当前是否已经做到。",
34
+ "4. 任何基于猜测的内容,都要使用“从截图中无法确认,但一般建议……”这样的表述,避免把猜测说成事实。",
35
+ ].join("\n");
36
+ /**
37
+ * Build full prompt by combining base vision prompt and user prompt.
38
+ */
39
+ function buildFullPrompt(userPrompt, basePrompt) {
40
+ if (!basePrompt) {
41
+ return userPrompt;
42
+ }
43
+ const trimmedBase = basePrompt.trim();
44
+ const trimmedUser = userPrompt.trim();
45
+ if (!trimmedBase) {
46
+ return trimmedUser;
47
+ }
48
+ return `${trimmedBase}\n\n用户任务描述:\n${trimmedUser}`;
49
+ }
19
50
  /**
20
51
  * 创建 MCP 服务器
21
52
  */
@@ -23,6 +54,7 @@ async function createServer() {
23
54
  logger.info("Initializing Luma MCP Server");
24
55
  // 加载配置
25
56
  const config = loadConfig();
57
+ const baseVisionPrompt = config.baseVisionPrompt ?? DEFAULT_BASE_VISION_PROMPT;
26
58
  // 根据配置选择模型客户端
27
59
  let visionClient;
28
60
  if (config.provider === "siliconflow") {
@@ -56,21 +88,30 @@ async function createServer() {
56
88
  await validateImageSource(imageSource);
57
89
  // 2. 处理图片(读取或返回URL)
58
90
  const imageDataUrl = await imageToBase64(imageSource);
59
- // 3. 直接使用原始提示词(不进行包装或增强)
60
- const fullPrompt = prompt;
91
+ // 3. Build full prompt from base vision prompt and user prompt
92
+ const fullPrompt = buildFullPrompt(prompt, baseVisionPrompt);
61
93
  // 4. 调用视觉模型分析图片
62
94
  return await visionClient.analyzeImage(imageDataUrl, fullPrompt, config.enableThinking);
63
95
  }, 2, // 最多重试2次
64
96
  1000 // 初始延补1秒
65
97
  );
66
98
  // 注册工具 - 使用 McpServer.tool() API
67
- server.tool("analyze_image", "图像分析工具:支持三种使用方式:1) 用户粘贴图片时直接调用,无需手动指定路径 2) 指定本地图片路径,如./screenshot.png 3) 指定图片URL,如https://example.com/image.png。AI应根据用户问题生成专业的分析提示词(如用户问'网站布局有什么问题',应生成'请详细分析这个网站界面的布局问题,包括视觉层次、对齐方式、间距、响应式设计等方面的问题'),然后传递提示词和图片进行调用。", {
99
+ server.tool("analyze_image", `图像分析工具:
100
+ - 何时调用:当用户提到“看图、看截图、看看这张图片/界面/页面/报错/架构/布局/组件结构/页面结构”等需求,或者在对话中出现图片附件并询问与图片内容相关的问题(包括 UI/前端界面结构、代码截图、日志/报错截图、文档截图、表单、表格等),都应优先调用本工具,而不是只用文本推理。
101
+ - 图片来源:1) 用户粘贴图片时直接调用,无需手动指定路径 2) 指定本地图片路径,如 ./screenshot.png 3) 指定图片 URL,如 https://example.com/image.png。
102
+ - 提示词(prompt)约定:
103
+ - **不要**在调用本工具前自己构造一大段复杂分析提示词;
104
+ - 直接把“用户关于图片的原始问题/指令”作为 prompt 传入即可,例如:
105
+ - “这张图是什么界面?整体结构是什么样的?”
106
+ - “帮我从前端实现角度拆解这个页面的布局和组件结构”;
107
+ - Luma 会在服务器内部自动拼接系统级视觉说明和分析模板,调用底层视觉模型完成完整理解;
108
+ - 你只需要确保 prompt 准确表达用户对这张图想了解的内容,无需重复描述图片细节或编写长篇提示词。`, {
68
109
  image_source: z
69
110
  .string()
70
111
  .describe("要分析的图片来源:支持三种方式 1) 用户粘贴图片时由Claude Desktop自动提供路径 2) 本地文件路径,如./screenshot.png 3) HTTP(S)图片URL,如https://example.com/image.png(支持 PNG、JPG、JPEG、WebP、GIF,最大 10MB)"),
71
112
  prompt: z
72
113
  .string()
73
- .describe("分析提示词:AI根据用户问题生成的专业分析提示词。应该包含具体的分析要求和期望的输出格式。"),
114
+ .describe("用户关于图片的原始问题或简短指令,例如“这张图是什么界面?”、“帮我分析这个页面的结构和布局”。服务器会在内部补充系统级视觉提示词并构造完整分析指令。"),
74
115
  }, async (params) => {
75
116
  try {
76
117
  // AI应该已经根据用户问题生成了合适的prompt
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "luma-mcp",
3
- "version": "1.2.8",
3
+ "version": "1.3.0",
4
4
  "description": "Multi-model vision understanding MCP server. Supports GLM-4.6V (Zhipu), DeepSeek-OCR (SiliconFlow - Free), Qwen3-VL-Flash (Aliyun), and Doubao-Seed-1.6 (Volcengine)",
5
5
  "type": "module",
6
+ "files": [
7
+ "build/",
8
+ "package.json",
9
+ "README.md"
10
+ ],
6
11
  "bin": {
7
12
  "luma-mcp": "build/index.js"
8
13
  },
package/.env.example DELETED
@@ -1,33 +0,0 @@
1
- # 模型提供商选择:zhipu | siliconflow | qwen | volcengine
2
- MODEL_PROVIDER=zhipu
3
-
4
- # ========== Zhipu AI (推荐 - GLM-4.6V) ==========
5
- # 获取API Key: https://open.bigmodel.cn/
6
- ZHIPU_API_KEY=your-zhipu-api-key-here
7
- MODEL_NAME=glm-4.6v
8
-
9
- # ========== SiliconFlow (免费 - DeepSeek-OCR) ==========
10
- # 获取API Key: https://siliconflow.cn/
11
- # SILICONFLOW_API_KEY=your-siliconflow-api-key
12
- # MODEL_NAME=deepseek-ai/DeepSeek-OCR
13
-
14
- # ========== 阿里云 Qwen (Qwen3-VL-Flash) ==========
15
- # 获取API Key: https://dashscope.aliyun.com/
16
- # DASHSCOPE_API_KEY=your-dashscope-api-key
17
- # MODEL_NAME=qwen3-vl-flash
18
-
19
- # ========== 火山方舟 Volcengine (Doubao-Seed-1.6) ==========
20
- # 获取API Key: https://console.volcengine.com/ark
21
- # VOLCENGINE_API_KEY=your-volcengine-api-key
22
- # MODEL_NAME=doubao-seed-1-6-flash-250828
23
- # 可选模型:
24
- # - doubao-seed-1-6-flash-250828 (性价比高,256k上下文)
25
- # - doubao-seed-1-6-vision-250815 (视觉优化,64k输出)
26
- # - doubao-seed-1-6-lite-251015 (轻量级)
27
- # 注意: 使用控制台中的实际模型ID
28
-
29
- # ========== 通用参数 ==========
30
- MAX_TOKENS=16384
31
- TEMPERATURE=0.7
32
- TOP_P=0.7
33
- ENABLE_THINKING=true
@@ -1,49 +0,0 @@
1
- name: Create Release
2
-
3
- on:
4
- push:
5
- tags:
6
- - 'v*.*.*'
7
-
8
- jobs:
9
- release:
10
- runs-on: ubuntu-latest
11
- permissions:
12
- contents: write
13
-
14
- steps:
15
- - name: Checkout code
16
- uses: actions/checkout@v4
17
- with:
18
- fetch-depth: 0
19
-
20
- - name: Extract version from tag
21
- id: version
22
- run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
23
-
24
- - name: Extract changelog for this version
25
- id: changelog
26
- run: |
27
- VERSION=${{ steps.version.outputs.VERSION }}
28
- echo "Extracting changelog for version $VERSION"
29
-
30
- # Extract changelog content between version headers
31
- sed -n "/## \[${VERSION}\]/,/## \[/p" CHANGELOG.md | sed '$d' > release_notes.md
32
-
33
- # If empty, use a default message
34
- if [ ! -s release_notes.md ]; then
35
- echo "Release version ${VERSION}" > release_notes.md
36
- fi
37
-
38
- cat release_notes.md
39
-
40
- - name: Create GitHub Release
41
- uses: softprops/action-gh-release@v1
42
- with:
43
- tag_name: v${{ steps.version.outputs.VERSION }}
44
- name: Release v${{ steps.version.outputs.VERSION }}
45
- body_path: release_notes.md
46
- draft: false
47
- prerelease: false
48
- env:
49
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
package/CHANGELOG.md DELETED
@@ -1,261 +0,0 @@
1
- # Changelog
2
-
3
- 本项目的所有重大变更都将记录在此文件中。
4
-
5
- ## [1.2.8] - 2025-12-23
6
-
7
- ### Fixed
8
-
9
- - 🐛 **修复 enableThinking 参数传递**: 修复 index.ts 中未将 enableThinking 参数传递给视觉模型客户端的问题
10
- - 🔧 **统一 thinking 逻辑**: 所有支持 thinking 的客户端(智谱、千问、火山方舟)现在使用统一的启用逻辑
11
- - 📝 **完善日志记录**: 千问客户端新增 API 调用日志,与其他客户端保持一致
12
-
13
- ### Changed
14
-
15
- - ♻️ **重构智谱客户端**: 优化 thinking 参数处理逻辑,使代码更清晰易懂
16
- - ♻️ **重构千问客户端**: 统一 thinking 启用逻辑,默认启用思考模式
17
- - ✨ **火山方舟 thinking 支持**: 火山方舟 Doubao 模型现在正确支持思考模式
18
-
19
- ### Technical Details
20
-
21
- - `src/index.ts`: 在 analyzeWithRetry 中正确传递 config.enableThinking 参数
22
- - `src/zhipu-client.ts`: 重构 thinking 逻辑,使用 `if (enableThinking !== false)` 统一判断
23
- - `src/qwen-client.ts`:
24
- - 统一 thinking 启用逻辑为 `if (enableThinking !== false)`
25
- - 新增 logger 导入和 API 调用日志
26
- - 添加成功/失败日志记录
27
- - `src/volcengine-client.ts`:
28
- - 新增 thinking 参数支持到 VolcengineRequest 接口
29
- - 实现 thinking 模式启用逻辑
30
- - 更新日志记录以反映实际 thinking 状态
31
-
32
- ### Thinking Mode Support
33
-
34
- 现在所有支持的模型都正确启用思考模式:
35
-
36
- | 模型 | Thinking 支持 | 实现方式 | 默认状态 |
37
- |-----------------------|---------------|---------------------------------|----------|
38
- | 智谱 GLM-4.6V | ✅ | `thinking: { type: "enabled" }` | 启用 |
39
- | 千问 Qwen3-VL | ✅ | `extra_body.enable_thinking` | 启用 |
40
- | 火山方舟 Doubao | ✅ | `thinking: { type: "enabled" }` | 启用 |
41
- | 硅基流动 DeepSeek-OCR | ❌ | 不支持 | N/A |
42
-
43
- 用户可通过 `ENABLE_THINKING=false` 环境变量禁用思考模式以提升速度和降低成本。
44
-
45
- ## [1.2.7] - 2025-12-17
46
-
47
- ### Added
48
-
49
- - 🆕 **火山方舟 Provider**: 新增第四个视觉模型提供商 - 火山方舟 Volcengine
50
- - 🎯 **Doubao-Seed-1.6 系列**: 支持 flash、vision、lite 多种版本
51
- - 🔧 **统一配置架构**: 客户端构造函数改为接受 LumaConfig 对象,实现配置集中管理
52
- - 🖼️ **完整图片格式支持**: 火山方舟支持 base64 数据、URL 链接和本地文件
53
-
54
- ### Changed
55
-
56
- - 🏗️ **架构重构**: 三个现有客户端(Zhipu、SiliconFlow、Qwen)重构为统一配置对象模式
57
- - 🗃️ **客户端优化**: 移除硬编码默认值,所有配置统一从环境变量读取
58
- - 📝 **API 格式统一**: 火山方舟客户端改为使用 Chat Completions API 格式,与其他 provider 保持一致
59
- - 📚 **文档完善**: 更新中英文 README,添加火山方舟配置示例和模型对比
60
-
61
- ### Technical Details
62
-
63
- - `src/config.ts`: 新增 volcengine provider 支持,添加 VOLCENGINE_API_KEY 环境变量
64
- - `src/volcengine-client.ts`: 新文件,完整实现 VolcengineClient 类,支持 Chat Completions API
65
- - `src/zhipu-client.ts`: 重构构造函数,移除硬编码参数,支持 LumaConfig
66
- - `src/siliconflow-client.ts`: 重构构造函数,支持统一配置对象
67
- - `src/qwen-client.ts`: 重构构造函数,支持统一配置对象
68
- - `src/index.ts`: 添加 VolcengineClient 导入和实例化逻辑
69
- - `.env.example`: 添加火山方舟配置示例和说明
70
- - `README.md` & `docs/README_EN.md`: 新增火山方舟特性说明和配置示例
71
-
72
- ### Provider Summary
73
-
74
- 现在支持 4 个视觉模型提供商:
75
-
76
- 1. **智谱 GLM-4.6V** (默认): 中文理解优秀,16384 tokens
77
- 2. **硅基流动 DeepSeek-OCR**: 免费使用,OCR 能力强
78
- 3. **阿里云 Qwen3-VL-Flash**: 速度快成本低,支持思考模式
79
- 4. **火山方舟 Doubao-Seed-1.6**: 性价比高,256k 上下文,支持多种版本
80
-
81
- ## [1.2.6] - 2025-12-16
82
-
83
- ### Changed
84
-
85
- - 🚀 **模型升级**: 更新智谱模型从 GLM-4.5V 升级至 GLM-4.6V,性能和理解能力提升
86
- - 📈 **Token 限制提升**: 默认 maxTokens 从 8192 提升至 16384,支持更详细的分析输出
87
- - 💡 **思考模式默认开启**: ENABLE_THINKING 默认为 true,提供更准确的分析结果
88
- - 🧹 **代码清理**: 移除 prompts.ts 提示词模板文件,简化架构
89
- - 🔧 **TypeScript 优化**: 清理未使用的类型导入,修复 TS6133 警告
90
- - 📝 **文档完善**: 更新中英文 README,强化三种使用方式说明(粘贴图片、本地路径、URL)
91
-
92
- ### Technical Details
93
-
94
- - `src/config.ts`: 更新默认模型为 glm-4.6v,默认 maxTokens 改为 16384,enableThinking 默认为 true
95
- - `src/zhipu-client.ts`: 更新模型引用,清理未使用导入
96
- - `src/siliconflow-client.ts`: 清理未使用的类型导入
97
- - `src/index.ts`: 简化 prompt 处理逻辑,直接使用原始提示词
98
- - 删除 `src/prompts.ts`: 移除 buildAnalysisPrompt 函数
99
- - README 更新: 模型信息、Token 配置、项目结构、思考模式配置
100
-
101
- ## [1.2.4] - 2025-12-16 (Reverted)
102
-
103
- ### Note
104
-
105
- 此版本因代码回滚问题被回退,所有优化内容已整合至 v1.2.6
106
-
107
- ## [1.2.3] - 2025-11-21
108
-
109
- ### Changed
110
-
111
- - 🧹 **代码清理**: 移除 Claude 特定调试注释和实验性代码
112
- - 📝 **工具描述优化**: 简化和专业化工具说明,提升 AI 模型调用成功率
113
- - 🔧 **路径处理通用化**: 重构 @ 前缀路径处理,移除平台特定命名
114
-
115
- ### Technical Details
116
-
117
- - 移除 Claude 资源读取相关的实验性代码
118
- - 重命名 `stripAtPrefix()` 为 `normalizeImageSourcePath()`
119
- - 清理所有客户端适配器中的调试日志和注释
120
- - 统一代码风格和注释规范
121
-
122
- ## [1.2.2] - 2025-11-20
123
-
124
- ### Added
125
-
126
- - ✨ **@ 路径支持**: 自动处理 Claude Code 的 @ 文件引用前缀,修复第一次调用失败的问题
127
- - 📝 **智能 Prompt**: 通用请求自动添加详细指引,保证全面分析
128
-
129
- ### Changed
130
-
131
- - 🔧 **Prompt 统一**: 简化为单一通用 prompt,智能处理不同场景
132
- - ✨ **表述优化**: 融合 Minimax 的经典表述,强调“不遗漏细节”和“完整提取”
133
- - 📚 **文档更新**: 更新项目结构,添加 qwen-client.ts 和测试文件
134
-
135
- ### Fixed
136
-
137
- - 🐛 **@ 路径问题**: 修复 Claude Code 中 `@folder/image.png` 导致的路径错误
138
- - 🐛 **编译错误**: 修复 image-processor.ts 中重复声明的变量
139
-
140
- ### Technical Details
141
-
142
- - 新增 `stripAtPrefix()` 函数处理 Claude Code 的文件引用语法
143
- - 简化 `buildAnalysisPrompt()` 从两套逻辑到单一逻辑
144
- - 添加智能请求检测,自动补充详细分析指引
145
-
146
- ## [1.2.1] - 2025-11-18
147
-
148
- ### Changed
149
-
150
- - 📝 **文档优化**: 精简 README,移除冲余配置文件路径说明
151
- - 📝 **更新日志简化**: 将 README 中的详细更新日志替换为 CHANGELOG.md 链接
152
- - ✨ **Qwen 测试示例**: 添加 Qwen3-VL-Flash 本地测试命令
153
- - 💰 **定价信息**: 添加阿里云通义千问定价参考链接
154
- - 📋 **模型对比**: 更新模型选择表,完善 Qwen3-VL-Flash 信息
155
- - 🔗 **API Key 获取**: 添加阿里云百炼 API Key 获取指南
156
- - 📚 **相关链接**: 新增阿里云百炼平台和 Qwen3-VL 文档链接
157
- - 🐛 **错误信息**: 优化 API 调用失败排查提示,包含阿里云账户
158
-
159
- ### Fixed
160
-
161
- - 🐛 **描述修正**: 修正 package.json 中模型名称为 qwen3-vl-flash
162
- - 📝 **注释精简**: 简化 prompts.ts 注释头
163
-
164
- ## [1.2.0] - 2025-11-17
165
-
166
- ### Added
167
-
168
- - 🎉 **第三个视觉模型**: 新增阿里云通义千问 Qwen3-VL-Flash 支持
169
- - 💡 **思考模式**: Qwen3-VL-Flash 支持深度思考模式(enable_thinking),提升复杂场景分析准确性
170
- - ⚡ **高性价比**: Flash 版本速度更快、成本更低,适合大量使用
171
- - 🔌 **OpenAI 兼容**: 使用阿里云百炼的 OpenAI 兼容 API,统一接口设计
172
- - 🌐 **多地域支持**: 默认使用北京地域,支持新加坡地域配置
173
-
174
- ### Changed
175
-
176
- - ⚙️ 新增 `MODEL_PROVIDER=qwen` 和 `DASHSCOPE_API_KEY` 环境变量配置
177
- - 📝 更新所有文档(中英文),添加 Qwen3-VL-Flash 配置示例
178
- - 💰 默认使用 qwen3-vl-flash 模型,兹顾性能与成本
179
- - 🏗️ 重构客户端构造函数,统一参数传递方式
180
-
181
- ### Technical Details
182
-
183
- - 新增文件:
184
- - `src/qwen-client.ts` - 阿里云通义千问 VL API 客户端实现
185
- - 修改文件:
186
- - `src/config.ts` - 添加 'qwen' 提供商支持
187
- - `src/zhipu-client.ts` - 重构构造函数,支持独立参数
188
- - `src/siliconflow-client.ts` - 重构构造函数,支持独立参数
189
- - `src/index.ts` - 添加 Qwen 客户端初始化逻辑
190
- - `package.json` - 更新版本至 1.2.0,添加 qwen/aliyun/dashscope 关键词
191
-
192
- ## [1.1.1] - 2025-11-13
193
-
194
- ### Added
195
-
196
- - 🖼️ **Data URI 支持**: 支持接收 base64 编码的图片数据 (data:image/png;base64,...)
197
- - 🚀 **为未来做准备**: 当 MCP 客户端支持时,可直接传递用户粘贴的图片
198
-
199
- ### Changed
200
-
201
- - 📝 更新工具描述,说明支持三种输入格式:本地路径、URL、Data URI
202
- - ✅ 新增 Data URI 格式验证(MIME 类型、大小限制)
203
-
204
- ## [1.1.0] - 2025-11-13
205
-
206
- ### Added
207
-
208
- - 🎉 **多模型支持**: 新增硅基流动 DeepSeek-OCR 支持
209
- - 🆓 **免费选项**: DeepSeek-OCR 通过硅基流动提供完全免费的 OCR 服务
210
- - 📐 **统一接口**: 创建 VisionClient 接口,支持灵活扩展更多视觉模型
211
- - ⚙️ **灵活配置**: 通过 `MODEL_PROVIDER` 环境变量轻松切换模型
212
-
213
- ### Changed
214
-
215
- - 🔧 环境变量命名优化,支持通用配置(`MODEL_NAME`、`MAX_TOKENS` 等)
216
- - 📝 更新文档,提供双模型配置说明和选择建议
217
- - 🏗️ 重构代码结构,提升可维护性
218
-
219
- ### Technical Details
220
-
221
- - 新增文件:
222
- - `src/vision-client.ts` - 视觉模型客户端统一接口
223
- - `src/siliconflow-client.ts` - 硅基流动 API 客户端实现
224
- - `.env.example` - 配置示例文件
225
- - 修改文件:
226
- - `src/config.ts` - 支持多提供商配置
227
- - `src/zhipu-client.ts` - 实现 VisionClient 接口
228
- - `src/index.ts` - 根据配置动态选择客户端
229
- - `README.md` - 完整的双模型使用文档
230
-
231
- ## [1.0.3] - 2025-11-12
232
-
233
- ### Features
234
-
235
- - 基于智谱 GLM-4.5V 的视觉理解能力
236
- - 支持本地文件和远程 URL
237
- - 内置重试机制
238
- - 思考模式支持
239
-
240
- ---
241
-
242
- **模型对比**:
243
-
244
- || 特性 | GLM-4.5V | DeepSeek-OCR | Qwen3-VL-Flash |
245
- ||----------|----------|--------------|----------------|
246
- || 提供商 | 智谱清言 | 硅基流动 | 阿里云百炼 |
247
- || 费用 | 收费 | **免费** | 收费 |
248
- || 中文理解 | 优秀 | 良好 | **优秀** |
249
- || OCR 能力 | 良好 | **优秀** | 优秀 |
250
- || 思考模式 | ✅ | ❌ | ✅ |
251
- || 速度/成本 | 中等 | 免费 | **快/低** |
252
- || 综合能力 | 良好 | OCR 专精 | **优秀** |
253
- || 3D 定位 | ❌ | ❌ | ✅ |
254
-
255
- **推荐使用场景**:
256
-
257
- - 需要 OCR/文字识别 → **DeepSeek-OCR** (免费)
258
- - 需要深度图片理解 → **Qwen3-VL-Flash** 或 **GLM-4.5V**
259
- - 需要思考模式 → **Qwen3-VL-Flash** 或 **GLM-4.5V**
260
- - 需要高性价比 → **Qwen3-VL-Flash** (速度快、成本低)
261
- - 需要 3D 定位/复杂分析 → **Qwen3-VL-Flash**
@@ -1,64 +0,0 @@
1
- /**
2
- * 测试 Data URI 支持
3
- */
4
-
5
- import { validateImageSource, imageToBase64 } from '../src/image-processor.js';
6
-
7
- // 一个有效的 1x1 像素 PNG 图片的 Data URI
8
- const validDataUri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
9
-
10
- // 无效的 Data URI(不支持的格式)
11
- const invalidDataUri = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MCIgc3R5bGU9ImZpbGw6I2ZmZiIgLz48L3N2Zz4=';
12
-
13
- async function testDataUri() {
14
- console.log('🧪 测试 Data URI 支持\n');
15
-
16
- // 测试 1: 验证有效的 Data URI
17
- try {
18
- console.log('测试 1: 验证有效的 PNG Data URI');
19
- await validateImageSource(validDataUri);
20
- console.log('✅ 通过:有效的 Data URI 验证成功\n');
21
- } catch (error) {
22
- console.log(`❌ 失败: ${error instanceof Error ? error.message : String(error)}\n`);
23
- }
24
-
25
- // 测试 2: 验证无效的 Data URI(不支持的格式)
26
- try {
27
- console.log('测试 2: 验证不支持的格式 (SVG)');
28
- await validateImageSource(invalidDataUri);
29
- console.log('❌ 失败:应该抛出错误\n');
30
- } catch (error) {
31
- console.log(`✅ 通过:正确拒绝不支持的格式 - ${error instanceof Error ? error.message : String(error)}\n`);
32
- }
33
-
34
- // 测试 3: Data URI 转换(应该直接返回)
35
- try {
36
- console.log('测试 3: Data URI 转换');
37
- const result = await imageToBase64(validDataUri);
38
- if (result === validDataUri) {
39
- console.log('✅ 通过:Data URI 正确传递(未修改)\n');
40
- } else {
41
- console.log('❌ 失败:Data URI 被修改了\n');
42
- }
43
- } catch (error) {
44
- console.log(`❌ 失败: ${error instanceof Error ? error.message : String(error)}\n`);
45
- }
46
-
47
- // 测试 4: 大小验证(创建一个超过10MB的Data URI)
48
- try {
49
- console.log('测试 4: 验证大小限制 (>10MB)');
50
- // 创建一个约 15MB 的 base64 字符串(20MB * 3/4 = 15MB)
51
- const largeBase64 = 'A'.repeat(20 * 1024 * 1024);
52
- const largeDataUri = `data:image/png;base64,${largeBase64}`;
53
- await validateImageSource(largeDataUri);
54
- console.log('❌ 失败:应该拒绝过大的文件\n');
55
- } catch (error) {
56
- console.log(`✅ 通过:正确拒绝超大文件 - ${error instanceof Error ? error.message : String(error)}\n`);
57
- }
58
-
59
- console.log('==========================================');
60
- console.log('✅ Data URI 测试完成!');
61
- console.log('==========================================\n');
62
- }
63
-
64
- testDataUri().catch(console.error);
@@ -1,100 +0,0 @@
1
- /**
2
- * 直接测试 DeepSeek-OCR API(无任何包装)
3
- */
4
-
5
- import axios from 'axios';
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
-
9
- async function testDeepSeekOCR(imagePath: string) {
10
- console.log('\n🧪 测试 DeepSeek-OCR API(原始调用)\n');
11
-
12
- const apiKey = process.env.SILICONFLOW_API_KEY;
13
-
14
- if (!apiKey) {
15
- console.error('❌ 错误: 需要设置 SILICONFLOW_API_KEY 环境变量');
16
- console.error('示例: $env:SILICONFLOW_API_KEY="your-api-key"');
17
- process.exit(1);
18
- }
19
-
20
- // 读取图片并转为 base64
21
- const imageBuffer = fs.readFileSync(imagePath);
22
- const base64Image = imageBuffer.toString('base64');
23
- const mimeType = imagePath.endsWith('.png') ? 'image/png' : 'image/jpeg';
24
- const imageDataUrl = `data:${mimeType};base64,${base64Image}`;
25
-
26
- console.log(`📸 图片: ${imagePath}`);
27
- console.log(`📦 大小: ${(imageBuffer.length / 1024).toFixed(2)} KB\n`);
28
-
29
- // 测试不同的 prompt
30
- const prompts = [
31
- '识别图片中的所有文字',
32
- 'OCR',
33
- 'Extract all text from this image',
34
- 'What do you see in this image?',
35
- '请详细描述这张图片'
36
- ];
37
-
38
- for (const prompt of prompts) {
39
- console.log(`\n🔍 测试 Prompt: "${prompt}"`);
40
- console.log('─'.repeat(50));
41
-
42
- try {
43
- const response = await axios.post(
44
- 'https://api.siliconflow.cn/v1/chat/completions',
45
- {
46
- model: 'deepseek-ai/DeepSeek-OCR',
47
- messages: [
48
- {
49
- role: 'user',
50
- content: [
51
- {
52
- type: 'image_url',
53
- image_url: {
54
- url: imageDataUrl,
55
- },
56
- },
57
- {
58
- type: 'text',
59
- text: prompt,
60
- },
61
- ],
62
- },
63
- ],
64
- temperature: 0.7,
65
- max_tokens: 4096,
66
- },
67
- {
68
- headers: {
69
- 'Authorization': `Bearer ${apiKey}`,
70
- 'Content-Type': 'application/json',
71
- },
72
- timeout: 60000,
73
- }
74
- );
75
-
76
- const result = response.data.choices[0].message.content;
77
- const usage = response.data.usage;
78
-
79
- console.log(`✅ Tokens: ${usage.total_tokens} (prompt: ${usage.prompt_tokens}, completion: ${usage.completion_tokens})`);
80
- console.log(`📝 响应长度: ${result?.length || 0} 字符`);
81
-
82
- if (result && result.trim().length > 0) {
83
- console.log('\n📊 结果:');
84
- console.log('─'.repeat(50));
85
- console.log(result);
86
- console.log('─'.repeat(50));
87
- console.log('\n✅ 找到有效响应!');
88
- break;
89
- } else {
90
- console.log('❌ 空响应');
91
- }
92
- } catch (error: any) {
93
- console.log(`❌ 错误: ${error.message}`);
94
- }
95
- }
96
- }
97
-
98
- // 运行测试
99
- const imagePath = path.join(process.cwd(), 'test.png');
100
- testDeepSeekOCR(imagePath).catch(console.error);
@@ -1,101 +0,0 @@
1
- /**
2
- * Luma MCP 本地测试脚本
3
- * 直接测试图片分析功能,不需要MCP客户端
4
- */
5
-
6
- import { loadConfig } from '../src/config.js';
7
- import type { VisionClient } from '../src/vision-client.js';
8
- import { ZhipuClient } from '../src/zhipu-client.js';
9
- import { SiliconFlowClient } from '../src/siliconflow-client.js';
10
- import { imageToBase64, validateImageSource } from '../src/image-processor.js';
11
- import { buildAnalysisPrompt } from '../src/prompts.js';
12
- import { logger } from '../src/utils/logger.js';
13
-
14
- async function testImageAnalysis(imagePath: string, question?: string) {
15
- console.log('\n==========================================');
16
- console.log('🧪 测试 Luma MCP 图片分析');
17
- console.log('==========================================\n');
18
-
19
- try {
20
- // 1. 加载配置
21
- console.log('📝 加载配置...');
22
- const config = loadConfig();
23
- console.log(`✅ 配置加载成功: 提供商 ${config.provider}, 模型 ${config.model}\n`);
24
-
25
- // 2. 验证图片
26
- console.log('🔍 验证图片来源...');
27
- await validateImageSource(imagePath);
28
- console.log(`✅ 图片验证通过: ${imagePath}\n`);
29
-
30
- // 3. 处理图片
31
- console.log('🖼️ 处理图片...');
32
- const imageDataUrl = await imageToBase64(imagePath);
33
- const isUrl = imagePath.startsWith('http');
34
- console.log(`✅ 图片处理完成: ${isUrl ? 'URL' : 'Base64编码'}\n`);
35
-
36
- // 4. 构建提示词
37
- console.log('💬 构建提示词...');
38
- // DeepSeek-OCR 需要简洁 prompt
39
- const prompt = config.provider === 'siliconflow'
40
- ? (question || '请详细分析这张图片的内容')
41
- : buildAnalysisPrompt(question);
42
- console.log(`✅ 提示词: ${question || '通用描述'}\n`);
43
-
44
- // 5. 创建客户端并调用API
45
- const client: VisionClient = config.provider === 'siliconflow'
46
- ? new SiliconFlowClient(config)
47
- : new ZhipuClient(config);
48
-
49
- const modelName = config.provider === 'siliconflow' ? 'DeepSeek-OCR' : 'GLM-4.5V';
50
- console.log(`🤖 调用 ${modelName} API...`);
51
- const result = await client.analyzeImage(imageDataUrl, prompt);
52
-
53
- // 6. 显示结果
54
- console.log('\n==========================================');
55
- console.log('📊 分析结果');
56
- console.log('==========================================\n');
57
- console.log(result);
58
- console.log('\n==========================================');
59
- console.log('✅ 测试完成!');
60
- console.log('==========================================\n');
61
-
62
- } catch (error) {
63
- console.error('\n❌ 测试失败:');
64
- console.error(error instanceof Error ? error.message : String(error));
65
- process.exit(1);
66
- }
67
- }
68
-
69
- // 解析命令行参数
70
- const args = process.argv.slice(2);
71
-
72
- if (args.length === 0) {
73
- console.log(`
74
- 使用方法:
75
- npm run test:local <图片路径或URL> [问题]
76
-
77
- 示例:
78
- # 分析本地图片
79
- npm run test:local ./test.png
80
-
81
- # 分析本地图片并提问
82
- npm run test:local ./code-error.png "这段代码为什么报错?"
83
-
84
- # 分析远程图片
85
- npm run test:local https://example.com/image.jpg
86
-
87
- 环境变量:
88
- # 使用智谱 GLM-4.5V
89
- ZHIPU_API_KEY=your-api-key
90
-
91
- # 使用硅基流动 DeepSeek-OCR
92
- MODEL_PROVIDER=siliconflow
93
- SILICONFLOW_API_KEY=your-api-key
94
- `);
95
- process.exit(1);
96
- }
97
-
98
- const imagePath = args[0];
99
- const question = args.slice(1).join(' ') || undefined;
100
-
101
- testImageAnalysis(imagePath, question);
package/test/test-qwen.ts DELETED
@@ -1,88 +0,0 @@
1
- /**
2
- * Qwen 客户端测试
3
- * 测试阿里云通义千问VL视觉理解
4
- */
5
-
6
- import { QwenClient } from '../src/qwen-client.js';
7
- import { imageToBase64 } from '../src/image-processor.js';
8
-
9
- async function testQwen() {
10
- const apiKey = process.env.DASHSCOPE_API_KEY;
11
-
12
- if (!apiKey) {
13
- console.error('❌ 错误: 需要设置 DASHSCOPE_API_KEY 环境变量');
14
- console.log('设置方法:');
15
- console.log(' macOS/Linux: export DASHSCOPE_API_KEY="your-api-key"');
16
- console.log(' Windows: $env:DASHSCOPE_API_KEY="your-api-key"');
17
- process.exit(1);
18
- }
19
-
20
- // 获取图片路径
21
- const imagePath = process.argv[2];
22
- if (!imagePath) {
23
- console.error('❌ 错误: 请提供图片路径');
24
- console.log('用法: tsx test/test-qwen.ts <图片路径>');
25
- console.log('示例: tsx test/test-qwen.ts ./test.png');
26
- process.exit(1);
27
- }
28
-
29
- console.log('🚀 开始测试 Qwen3-VL-Flash...\n');
30
-
31
- try {
32
- // 1. 初始化客户端
33
- console.log('1️⃣ 初始化 Qwen 客户端...');
34
- const client = new QwenClient(
35
- apiKey,
36
- 'qwen3-vl-flash', // 使用高性价比的 Flash 版本
37
- 4096,
38
- 0.7
39
- );
40
- console.log(`✅ 客户端初始化成功: ${client.getModelName()}\n`);
41
-
42
- // 2. 读取图片
43
- console.log('2️⃣ 读取图片...');
44
- const imageData = await imageToBase64(imagePath);
45
- console.log(`✅ 图片读取成功 (${imagePath})\n`);
46
-
47
- // 3. 测试基础分析
48
- console.log('3️⃣ 测试基础分析(不启用思考模式)...');
49
- const basicResult = await client.analyzeImage(
50
- imageData,
51
- '请详细分析这张图片的内容',
52
- false
53
- );
54
- console.log('📊 基础分析结果:');
55
- console.log(basicResult);
56
- console.log('\n');
57
-
58
- // 4. 测试思考模式
59
- console.log('4️⃣ 测试思考模式(enable_thinking=true)...');
60
- const thinkingResult = await client.analyzeImage(
61
- imageData,
62
- '请详细分析这张图片的内容,包括所有细节',
63
- true // 启用思考模式
64
- );
65
- console.log('🧠 思考模式分析结果:');
66
- console.log(thinkingResult);
67
- console.log('\n');
68
-
69
- // 5. 测试 OCR
70
- console.log('5️⃣ 测试 OCR 能力...');
71
- const ocrResult = await client.analyzeImage(
72
- imageData,
73
- '识别图片中的所有文字',
74
- false
75
- );
76
- console.log('📝 OCR 结果:');
77
- console.log(ocrResult);
78
- console.log('\n');
79
-
80
- console.log('✅ 所有测试完成!');
81
-
82
- } catch (error) {
83
- console.error('❌ 测试失败:', error instanceof Error ? error.message : error);
84
- process.exit(1);
85
- }
86
- }
87
-
88
- testQwen();