@lutery/vision-mcp 1.0.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.
Files changed (122) hide show
  1. package/README.md +428 -0
  2. package/dist/adapters/base-adapter.d.ts +69 -0
  3. package/dist/adapters/base-adapter.d.ts.map +1 -0
  4. package/dist/adapters/base-adapter.js +143 -0
  5. package/dist/adapters/base-adapter.js.map +1 -0
  6. package/dist/adapters/claude-adapter.d.ts +38 -0
  7. package/dist/adapters/claude-adapter.d.ts.map +1 -0
  8. package/dist/adapters/claude-adapter.js +251 -0
  9. package/dist/adapters/claude-adapter.js.map +1 -0
  10. package/dist/adapters/glm-adapter.d.ts +15 -0
  11. package/dist/adapters/glm-adapter.d.ts.map +1 -0
  12. package/dist/adapters/glm-adapter.js +131 -0
  13. package/dist/adapters/glm-adapter.js.map +1 -0
  14. package/dist/adapters/modelscope-adapter.d.ts +20 -0
  15. package/dist/adapters/modelscope-adapter.d.ts.map +1 -0
  16. package/dist/adapters/modelscope-adapter.js +142 -0
  17. package/dist/adapters/modelscope-adapter.js.map +1 -0
  18. package/dist/adapters/openai-adapter.d.ts +20 -0
  19. package/dist/adapters/openai-adapter.d.ts.map +1 -0
  20. package/dist/adapters/openai-adapter.js +194 -0
  21. package/dist/adapters/openai-adapter.js.map +1 -0
  22. package/dist/adapters/siliconflow-adapter.d.ts +21 -0
  23. package/dist/adapters/siliconflow-adapter.d.ts.map +1 -0
  24. package/dist/adapters/siliconflow-adapter.js +145 -0
  25. package/dist/adapters/siliconflow-adapter.js.map +1 -0
  26. package/dist/config/model-config.d.ts +39 -0
  27. package/dist/config/model-config.d.ts.map +1 -0
  28. package/dist/config/model-config.js +115 -0
  29. package/dist/config/model-config.js.map +1 -0
  30. package/dist/index.d.ts +17 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +186 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/prompts/system.d.ts +75 -0
  35. package/dist/prompts/system.d.ts.map +1 -0
  36. package/dist/prompts/system.js +272 -0
  37. package/dist/prompts/system.js.map +1 -0
  38. package/dist/providers/provider-registry.d.ts +58 -0
  39. package/dist/providers/provider-registry.d.ts.map +1 -0
  40. package/dist/providers/provider-registry.js +173 -0
  41. package/dist/providers/provider-registry.js.map +1 -0
  42. package/dist/src/adapters/base-adapter.d.ts +59 -0
  43. package/dist/src/adapters/base-adapter.d.ts.map +1 -0
  44. package/dist/src/adapters/base-adapter.js +83 -0
  45. package/dist/src/adapters/base-adapter.js.map +1 -0
  46. package/dist/src/adapters/glm-adapter.d.ts +15 -0
  47. package/dist/src/adapters/glm-adapter.d.ts.map +1 -0
  48. package/dist/src/adapters/glm-adapter.js +116 -0
  49. package/dist/src/adapters/glm-adapter.js.map +1 -0
  50. package/dist/src/adapters/siliconflow-adapter.d.ts +21 -0
  51. package/dist/src/adapters/siliconflow-adapter.d.ts.map +1 -0
  52. package/dist/src/adapters/siliconflow-adapter.js +130 -0
  53. package/dist/src/adapters/siliconflow-adapter.js.map +1 -0
  54. package/dist/src/config/model-config.d.ts +40 -0
  55. package/dist/src/config/model-config.d.ts.map +1 -0
  56. package/dist/src/config/model-config.js +126 -0
  57. package/dist/src/config/model-config.js.map +1 -0
  58. package/dist/src/index.d.ts +17 -0
  59. package/dist/src/index.d.ts.map +1 -0
  60. package/dist/src/index.js +188 -0
  61. package/dist/src/index.js.map +1 -0
  62. package/dist/src/prompts/system.d.ts +75 -0
  63. package/dist/src/prompts/system.d.ts.map +1 -0
  64. package/dist/src/prompts/system.js +272 -0
  65. package/dist/src/prompts/system.js.map +1 -0
  66. package/dist/src/tools/vision-tool.d.ts +91 -0
  67. package/dist/src/tools/vision-tool.d.ts.map +1 -0
  68. package/dist/src/tools/vision-tool.js +171 -0
  69. package/dist/src/tools/vision-tool.js.map +1 -0
  70. package/dist/src/utils/errors.d.ts +65 -0
  71. package/dist/src/utils/errors.d.ts.map +1 -0
  72. package/dist/src/utils/errors.js +146 -0
  73. package/dist/src/utils/errors.js.map +1 -0
  74. package/dist/src/utils/image-input.d.ts +45 -0
  75. package/dist/src/utils/image-input.d.ts.map +1 -0
  76. package/dist/src/utils/image-input.js +226 -0
  77. package/dist/src/utils/image-input.js.map +1 -0
  78. package/dist/src/utils/logger.d.ts +63 -0
  79. package/dist/src/utils/logger.d.ts.map +1 -0
  80. package/dist/src/utils/logger.js +157 -0
  81. package/dist/src/utils/logger.js.map +1 -0
  82. package/dist/test/integration.test.d.ts +10 -0
  83. package/dist/test/integration.test.d.ts.map +1 -0
  84. package/dist/test/integration.test.js +270 -0
  85. package/dist/test/integration.test.js.map +1 -0
  86. package/dist/test/test-utils.d.ts +45 -0
  87. package/dist/test/test-utils.d.ts.map +1 -0
  88. package/dist/test/test-utils.js +107 -0
  89. package/dist/test/test-utils.js.map +1 -0
  90. package/dist/test/vision-tool.test.d.ts +9 -0
  91. package/dist/test/vision-tool.test.d.ts.map +1 -0
  92. package/dist/test/vision-tool.test.js +167 -0
  93. package/dist/test/vision-tool.test.js.map +1 -0
  94. package/dist/tools/vision-tool.d.ts +91 -0
  95. package/dist/tools/vision-tool.d.ts.map +1 -0
  96. package/dist/tools/vision-tool.js +167 -0
  97. package/dist/tools/vision-tool.js.map +1 -0
  98. package/dist/utils/data-url-parser.d.ts +27 -0
  99. package/dist/utils/data-url-parser.d.ts.map +1 -0
  100. package/dist/utils/data-url-parser.js +53 -0
  101. package/dist/utils/data-url-parser.js.map +1 -0
  102. package/dist/utils/errors.d.ts +65 -0
  103. package/dist/utils/errors.d.ts.map +1 -0
  104. package/dist/utils/errors.js +146 -0
  105. package/dist/utils/errors.js.map +1 -0
  106. package/dist/utils/image-input.d.ts +45 -0
  107. package/dist/utils/image-input.d.ts.map +1 -0
  108. package/dist/utils/image-input.js +238 -0
  109. package/dist/utils/image-input.js.map +1 -0
  110. package/dist/utils/logger.d.ts +63 -0
  111. package/dist/utils/logger.d.ts.map +1 -0
  112. package/dist/utils/logger.js +157 -0
  113. package/dist/utils/logger.js.map +1 -0
  114. package/dist/utils/thinking-extractors.d.ts +34 -0
  115. package/dist/utils/thinking-extractors.d.ts.map +1 -0
  116. package/dist/utils/thinking-extractors.js +83 -0
  117. package/dist/utils/thinking-extractors.js.map +1 -0
  118. package/dist/utils/thinking-filter.d.ts +32 -0
  119. package/dist/utils/thinking-filter.d.ts.map +1 -0
  120. package/dist/utils/thinking-filter.js +147 -0
  121. package/dist/utils/thinking-filter.js.map +1 -0
  122. package/package.json +41 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Model Configuration Manager
3
+ *
4
+ * @description 管理视觉模型的配置,从环境变量加载
5
+ */
6
+ export type ModelType = 'glm-4.6v' | 'siliconflow';
7
+ export interface ModelConfig {
8
+ type: ModelType;
9
+ name: string;
10
+ baseUrl: string;
11
+ apiKey: string;
12
+ timeout?: number;
13
+ maxRetries?: number;
14
+ thinking?: {
15
+ type: 'enabled' | 'disabled';
16
+ };
17
+ }
18
+ export interface ModelDefaults {
19
+ baseUrl: string;
20
+ modelName: string;
21
+ timeout: number;
22
+ maxRetries: number;
23
+ }
24
+ /**
25
+ * 从环境变量加载模型配置
26
+ */
27
+ export declare function loadModelConfig(): ModelConfig;
28
+ /**
29
+ * 验证模型配置
30
+ */
31
+ export declare function validateModelConfig(config: ModelConfig): boolean;
32
+ /**
33
+ * 脱敏显示 API Key
34
+ */
35
+ export declare function maskApiKey(apiKey: string): string;
36
+ /**
37
+ * 获取模型的显示信息(用于日志)
38
+ */
39
+ export declare function getModelDisplayInfo(config: ModelConfig): string;
40
+ //# sourceMappingURL=model-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../../src/config/model-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAiBD;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAkE7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAiChE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Model Configuration Manager
3
+ *
4
+ * @description 管理视觉模型的配置,从环境变量加载
5
+ */
6
+ import { ModelConfigError } from '../utils/errors.js';
7
+ import { logger } from '../utils/logger.js';
8
+ const MODEL_DEFAULTS = {
9
+ 'glm-4.6v': {
10
+ baseUrl: 'https://open.bigmodel.cn/api/paas/v4',
11
+ modelName: 'glm-4.6v',
12
+ timeout: 60000,
13
+ maxRetries: 2
14
+ },
15
+ 'siliconflow': {
16
+ baseUrl: 'https://api.siliconflow.cn/v1',
17
+ modelName: 'Qwen/Qwen2-VL-72B-Instruct',
18
+ timeout: 60000,
19
+ maxRetries: 2
20
+ }
21
+ };
22
+ /**
23
+ * 从环境变量加载模型配置
24
+ */
25
+ export function loadModelConfig() {
26
+ try {
27
+ // 加载模型类型
28
+ const type = process.env.VISION_MODEL_TYPE;
29
+ if (!type || !['glm-4.6v', 'siliconflow'].includes(type)) {
30
+ throw new ModelConfigError(`Invalid or missing VISION_MODEL_TYPE: ${type}. Must be "glm-4.6v" or "siliconflow"`);
31
+ }
32
+ const defaults = MODEL_DEFAULTS[type];
33
+ // 加载必要配置
34
+ const name = process.env.VISION_MODEL_NAME || defaults.modelName;
35
+ const baseUrl = process.env.VISION_API_BASE_URL || defaults.baseUrl;
36
+ const apiKey = process.env.VISION_API_KEY;
37
+ if (!apiKey) {
38
+ throw new ModelConfigError('Missing VISION_API_KEY environment variable');
39
+ }
40
+ // 验证 API Key 格式
41
+ if (type === 'glm-4.6v' && !apiKey.includes('.')) {
42
+ logger.warn('GLM API Key does not contain dot (.) - may be invalid', {
43
+ modelType: type
44
+ });
45
+ }
46
+ if (type === 'siliconflow' && !apiKey.startsWith('sk-')) {
47
+ logger.warn('SiliconFlow API Key does not start with "sk-" - may be invalid', {
48
+ modelType: type
49
+ });
50
+ }
51
+ // 加载可选配置
52
+ const timeout = process.env.VISION_API_TIMEOUT
53
+ ? parseInt(process.env.VISION_API_TIMEOUT, 10)
54
+ : defaults.timeout;
55
+ const maxRetries = process.env.VISION_MAX_RETRIES
56
+ ? parseInt(process.env.VISION_MAX_RETRIES, 10)
57
+ : defaults.maxRetries;
58
+ const config = {
59
+ type,
60
+ name,
61
+ baseUrl: baseUrl.replace(/\/$/, ''), // 移除末尾的 /
62
+ apiKey,
63
+ timeout,
64
+ maxRetries,
65
+ thinking: type === 'glm-4.6v' ? { type: 'enabled' } : undefined
66
+ };
67
+ logger.info('Model configuration loaded successfully', {
68
+ modelType: type,
69
+ modelName: name,
70
+ baseUrl: config.baseUrl
71
+ });
72
+ return config;
73
+ }
74
+ catch (error) {
75
+ logger.error('Failed to load model configuration', error);
76
+ throw error;
77
+ }
78
+ }
79
+ /**
80
+ * 验证模型配置
81
+ */
82
+ export function validateModelConfig(config) {
83
+ try {
84
+ const errors = [];
85
+ if (!config.name || typeof config.name !== 'string') {
86
+ errors.push('Model name is required');
87
+ }
88
+ if (!config.baseUrl || typeof config.baseUrl !== 'string') {
89
+ errors.push('Base URL is required');
90
+ }
91
+ if (!config.apiKey || typeof config.apiKey !== 'string') {
92
+ errors.push('API Key is required');
93
+ }
94
+ if (typeof config.timeout !== 'number' || config.timeout <= 0) {
95
+ errors.push('Timeout must be a positive number');
96
+ }
97
+ if (typeof config.maxRetries !== 'number' || config.maxRetries < 0) {
98
+ errors.push('Max retries must be a non-negative number');
99
+ }
100
+ if (errors.length > 0) {
101
+ throw new ModelConfigError(errors.join('; '));
102
+ }
103
+ return true;
104
+ }
105
+ catch (error) {
106
+ logger.error('Model configuration validation failed', error);
107
+ throw error;
108
+ }
109
+ }
110
+ /**
111
+ * 脱敏显示 API Key
112
+ */
113
+ export function maskApiKey(apiKey) {
114
+ if (!apiKey || apiKey.length <= 8) {
115
+ return '***';
116
+ }
117
+ const visible = Math.min(4, Math.floor(apiKey.length / 4));
118
+ return `${apiKey.substring(0, visible)}${'*'.repeat(Math.max(1, apiKey.length - visible * 2))}${apiKey.substring(apiKey.length - visible)}`;
119
+ }
120
+ /**
121
+ * 获取模型的显示信息(用于日志)
122
+ */
123
+ export function getModelDisplayInfo(config) {
124
+ return `${config.type} - ${config.name} (API Key: ${maskApiKey(config.apiKey)})`;
125
+ }
126
+ //# sourceMappingURL=model-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-config.js","sourceRoot":"","sources":["../../../src/config/model-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Vision MCP Server
4
+ *
5
+ * @description MCP Server providing vision capabilities via GLM-4.6V and SiliconFlow
6
+ * This server implements the Model Context Protocol for LLM integration
7
+ *
8
+ * IMPORTANT: This server uses STDIO for MCP communication. Do not use console.log for debugging.
9
+ * Use console.error (stderr) for all logging as required by MCP protocol.
10
+ */
11
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ /**
13
+ * 创建并配置 MCP Server
14
+ */
15
+ declare function createMCPServer(): McpServer;
16
+ export { createMCPServer };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE;;GAEG;AACH,iBAAS,eAAe,IAAI,SAAS,CAoJpC;AAuDD,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Vision MCP Server
4
+ *
5
+ * @description MCP Server providing vision capabilities via GLM-4.6V and SiliconFlow
6
+ * This server implements the Model Context Protocol for LLM integration
7
+ *
8
+ * IMPORTANT: This server uses STDIO for MCP communication. Do not use console.log for debugging.
9
+ * Use console.error (stderr) for all logging as required by MCP protocol.
10
+ */
11
+ import { config } from 'dotenv';
12
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
13
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
+ import { z } from 'zod';
15
+ // 加载环境变量(如果有 .env 文件)
16
+ config();
17
+ import { logger } from './utils/logger.js';
18
+ import { getVisionTool, VisionToolInputSchema } from './tools/vision-tool.js';
19
+ import { toVisionMCPError, toMCPErrorResponse } from './utils/errors.js';
20
+ /**
21
+ * 创建并配置 MCP Server
22
+ */
23
+ function createMCPServer() {
24
+ const server = new McpServer({
25
+ name: 'vision-mcp',
26
+ version: '1.0.0'
27
+ });
28
+ // 初始化视觉工具
29
+ let visionTool;
30
+ try {
31
+ visionTool = getVisionTool();
32
+ logger.info('Vision MCP Server initialized successfully');
33
+ }
34
+ catch (error) {
35
+ logger.error('Failed to initialize vision tool', error);
36
+ throw error;
37
+ }
38
+ // 注册视觉分析工具
39
+ server.tool('analyze_image', 'Analyze an image using a vision model (GLM-4.6V or SiliconFlow). Supports URL, base64 data URL, or local file path.', {
40
+ image: z.string().describe('Image URL, base64 data URL, or local file path'),
41
+ prompt: z.string().describe('Analysis prompt describing what to analyze'),
42
+ output_format: z.enum(['text', 'json']).optional().default('text').describe('Output format preference (text or json)'),
43
+ template: z.string().optional().describe('System prompt template (ui-analysis, object-detection, ocr, etc.)')
44
+ }, async ({ image, prompt, output_format, template }) => {
45
+ try {
46
+ logger.logRequest('Vision tool called', {
47
+ imageLength: image.length,
48
+ promptLength: prompt.length,
49
+ outputFormat: output_format
50
+ });
51
+ // 验证输入
52
+ const validationResult = VisionToolInputSchema.safeParse({
53
+ image,
54
+ prompt,
55
+ output_format,
56
+ template
57
+ });
58
+ if (!validationResult.success) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: JSON.stringify({
64
+ error: 'Invalid input',
65
+ details: validationResult.error.errors
66
+ }, null, 2)
67
+ }
68
+ ],
69
+ isError: true
70
+ };
71
+ }
72
+ // 执行分析
73
+ const result = await visionTool.analyze(validationResult.data);
74
+ logger.logRequest('Tool execution completed', {
75
+ outputLength: result.content.length,
76
+ processingTime: result.metadata.processingTimeMs,
77
+ modelType: result.metadata.modelType
78
+ });
79
+ // 返回结果
80
+ return {
81
+ content: [
82
+ {
83
+ type: 'text',
84
+ text: result.content
85
+ }
86
+ ]
87
+ };
88
+ }
89
+ catch (error) {
90
+ logger.error('Tool execution failed', error);
91
+ return toMCPErrorResponse(toVisionMCPError(error));
92
+ }
93
+ });
94
+ // 注册获取可用模板工具
95
+ server.tool('list_templates', 'List available system prompt templates for different vision analysis tasks', {}, async () => {
96
+ try {
97
+ logger.logRequest('List templates tool called', {});
98
+ // 导入模板信息
99
+ const { getAvailableTemplates } = await import('./prompts/system.js');
100
+ const templates = getAvailableTemplates();
101
+ return {
102
+ content: [
103
+ {
104
+ type: 'text',
105
+ text: JSON.stringify(templates, null, 2)
106
+ }
107
+ ]
108
+ };
109
+ }
110
+ catch (error) {
111
+ logger.error('Failed to list templates', error);
112
+ return toMCPErrorResponse(toVisionMCPError(error));
113
+ }
114
+ });
115
+ // 注册获取配置信息工具
116
+ server.tool('get_config', 'Get current model configuration (model type, name, etc.)', {}, async () => {
117
+ try {
118
+ const { modelConfig } = visionTool.getToolInfo();
119
+ const { maskApiKey } = await import('./config/model-config.js');
120
+ return {
121
+ content: [
122
+ {
123
+ type: 'text',
124
+ text: JSON.stringify({
125
+ type: modelConfig.type,
126
+ name: modelConfig.name,
127
+ baseUrl: modelConfig.baseUrl,
128
+ apiKey: maskApiKey(modelConfig.apiKey),
129
+ timeout: modelConfig.timeout,
130
+ maxRetries: modelConfig.maxRetries
131
+ }, null, 2)
132
+ }
133
+ ]
134
+ };
135
+ }
136
+ catch (error) {
137
+ logger.error('Failed to get config', error);
138
+ return toMCPErrorResponse(toVisionMCPError(error));
139
+ }
140
+ });
141
+ return server;
142
+ }
143
+ /**
144
+ * 主函数
145
+ */
146
+ async function main() {
147
+ try {
148
+ logger.info('Starting Vision MCP Server...');
149
+ // 创建服务器
150
+ const server = createMCPServer();
151
+ // 创建传输层
152
+ const transport = new StdioServerTransport();
153
+ // 连接服务器
154
+ await server.connect(transport);
155
+ logger.error('Vision MCP Server is running on stdio');
156
+ // 处理进程信号
157
+ process.on('SIGINT', async () => {
158
+ logger.error('Received SIGINT, shutting down...');
159
+ process.exit(0);
160
+ });
161
+ process.on('SIGTERM', async () => {
162
+ logger.error('Received SIGTERM, shutting down...');
163
+ process.exit(0);
164
+ });
165
+ // 未捕获异常处理
166
+ process.on('uncaughtException', (error) => {
167
+ logger.error('Uncaught exception', error);
168
+ process.exit(1);
169
+ });
170
+ process.on('unhandledRejection', (reason, promise) => {
171
+ logger.error(`Unhandled rejection at: ${promise}, reason: ${reason}`);
172
+ process.exit(1);
173
+ });
174
+ }
175
+ catch (error) {
176
+ logger.error('Fatal error starting server', error);
177
+ process.exit(1);
178
+ }
179
+ }
180
+ // 运行主函数
181
+ if (import.meta.url === `file://${process.argv[1]}`) {
182
+ main().catch((error) => {
183
+ logger.error('Fatal error in main', error);
184
+ process.exit(1);
185
+ });
186
+ }
187
+ export { createMCPServer };
188
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * System Prompt Templates
3
+ *
4
+ * @description 内置的系统提示词模板,覆盖常见视觉任务场景
5
+ */
6
+ export interface SystemPromptTemplate {
7
+ id: string;
8
+ name: string;
9
+ template: string;
10
+ description: string;
11
+ useCases: string[];
12
+ }
13
+ /**
14
+ * 基础系统提示词
15
+ * 提供通用指导原则和规范
16
+ */
17
+ export declare const BASE_SYSTEM_PROMPT = "You are a vision analysis assistant with access to image data.\n\nYour task is to analyze images accurately and provide helpful responses based on what you see.\n\nGuidelines:\n1. Be precise and detailed in your observations\n2. When coordinates or measurements are requested, provide them in the format specified\n3. If an image is unclear or ambiguous, acknowledge the limitations\n4. Convert any complex structured data to the requested format\n5. Be helpful and follow the specific instructions provided by the user\n\nRemember: You are providing visual information to another AI system, so clarity and structure are important.";
18
+ /**
19
+ * 通用描述模板
20
+ */
21
+ export declare const GENERAL_DESCRIPTION_TEMPLATE: SystemPromptTemplate;
22
+ /**
23
+ * UI 分析模板
24
+ * 用于分析 UI 原型图、截图等
25
+ */
26
+ export declare const UI_ANALYSIS_TEMPLATE: SystemPromptTemplate;
27
+ /**
28
+ * 对象定位和检测模板
29
+ */
30
+ export declare const OBJECT_DETECTION_TEMPLATE: SystemPromptTemplate;
31
+ /**
32
+ * OCR 和文本提取模板
33
+ */
34
+ export declare const OCR_TEMPLATE: SystemPromptTemplate;
35
+ /**
36
+ * 结构化信息提取模板
37
+ */
38
+ export declare const STRUCTURED_EXTRACTION_TEMPLATE: SystemPromptTemplate;
39
+ /**
40
+ * 获取系统提示词模板
41
+ *
42
+ * @param templateId 模板 ID
43
+ * @param customInstructions 额外的自定义指令(可选)
44
+ * @returns 完整的系统提示词
45
+ */
46
+ export declare function getSystemPrompt(templateId: string, customInstructions?: string): string;
47
+ /**
48
+ * 所有可用的系统提示词模板
49
+ */
50
+ export declare const SYSTEM_PROMPT_TEMPLATES: Record<string, SystemPromptTemplate>;
51
+ /**
52
+ * 获取模板列表
53
+ */
54
+ export declare function getAvailableTemplates(): Array<{
55
+ id: string;
56
+ name: string;
57
+ description: string;
58
+ useCases: string[];
59
+ }>;
60
+ /**
61
+ * 自动选择合适的模板
62
+ *
63
+ * @param prompt 用户提示词
64
+ * @returns 推荐的模板 ID
65
+ */
66
+ export declare function autoSelectTemplate(prompt: string): string;
67
+ /**
68
+ * 构建完整的提示词
69
+ *
70
+ * @param templateId 模板 ID
71
+ * @param userPrompt 用户提示词
72
+ * @returns 构建完成的提示词
73
+ */
74
+ export declare function buildPrompt(templateId: string | undefined, userPrompt: string): string;
75
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/prompts/system.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,4nBAW8E,CAAC;AAE9G;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,oBAe1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,oBA4ClC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,oBA2BvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,oBA8B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,oBA8B5C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAevF;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAMxE,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CAOD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0BzD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAUtF"}