@louloulinx/metagpt 0.1.3

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 (113) hide show
  1. package/.eslintrc.json +23 -0
  2. package/.prettierrc +7 -0
  3. package/LICENSE +21 -0
  4. package/README-CN.md +754 -0
  5. package/README.md +238 -0
  6. package/bun.lock +1023 -0
  7. package/doc/TutorialAssistant.md +114 -0
  8. package/doc/VercelLLMProvider.md +164 -0
  9. package/eslint.config.js +55 -0
  10. package/examples/data-interpreter-example.ts +173 -0
  11. package/examples/qwen-direct-example.ts +60 -0
  12. package/examples/qwen-example.ts +62 -0
  13. package/examples/tutorial-assistant-example.ts +97 -0
  14. package/jest.config.ts +22 -0
  15. package/output/tutorials/Go/350/257/255/350/250/200/347/274/226/347/250/213/346/225/231/347/250/213_2025-02-25T09-35-15-436Z.md +2208 -0
  16. package/output/tutorials/Rust/346/225/231/347/250/213_2025-02-25T08-27-27-632Z.md +1967 -0
  17. package/output/tutorials//345/246/202/344/275/225/344/275/277/347/224/250TypeScript/345/274/200/345/217/221Node.js/345/272/224/347/224/250_2025-02-25T08-14-39-605Z.md +1721 -0
  18. package/output/tutorials//346/225/260/345/255/227/347/273/217/346/265/216/345/255/246/346/225/231/347/250/213_2025-02-25T10-45-03-605Z.md +902 -0
  19. package/output/tutorials//346/232/250/345/215/227/345/244/247/345/255/246/346/225/260/345/255/227/347/273/217/346/265/216/345/255/246/345/244/215/350/257/225/350/265/204/346/226/231_2025-02-25T11-16-59-133Z.md +719 -0
  20. package/package.json +58 -0
  21. package/plan-cn.md +321 -0
  22. package/plan.md +154 -0
  23. package/src/actions/analyze-task.ts +65 -0
  24. package/src/actions/base-action.ts +103 -0
  25. package/src/actions/di/execute-nb-code.ts +247 -0
  26. package/src/actions/di/write-analysis-code.ts +234 -0
  27. package/src/actions/write-tutorial.ts +232 -0
  28. package/src/config/browser.ts +33 -0
  29. package/src/config/config.ts +345 -0
  30. package/src/config/embedding.ts +26 -0
  31. package/src/config/llm.ts +36 -0
  32. package/src/config/mermaid.ts +37 -0
  33. package/src/config/omniparse.ts +25 -0
  34. package/src/config/redis.ts +34 -0
  35. package/src/config/s3.ts +33 -0
  36. package/src/config/search.ts +30 -0
  37. package/src/config/workspace.ts +20 -0
  38. package/src/index.ts +40 -0
  39. package/src/management/team.ts +168 -0
  40. package/src/memory/longterm.ts +218 -0
  41. package/src/memory/manager.ts +160 -0
  42. package/src/memory/types.ts +100 -0
  43. package/src/memory/working.ts +154 -0
  44. package/src/monitoring/system.ts +413 -0
  45. package/src/monitoring/types.ts +230 -0
  46. package/src/plugin/manager.ts +79 -0
  47. package/src/plugin/types.ts +114 -0
  48. package/src/provider/vercel-llm.ts +314 -0
  49. package/src/rag/base-rag.ts +194 -0
  50. package/src/rag/document-qa.ts +102 -0
  51. package/src/roles/base-role.ts +155 -0
  52. package/src/roles/data-interpreter.ts +360 -0
  53. package/src/roles/engineer.ts +1 -0
  54. package/src/roles/tutorial-assistant.ts +217 -0
  55. package/src/skills/base-skill.ts +144 -0
  56. package/src/skills/code-review.ts +120 -0
  57. package/src/tools/base-tool.ts +155 -0
  58. package/src/tools/file-system.ts +204 -0
  59. package/src/tools/tool-recommend.d.ts +14 -0
  60. package/src/tools/tool-recommend.ts +31 -0
  61. package/src/types/action.ts +38 -0
  62. package/src/types/config.ts +129 -0
  63. package/src/types/document.ts +354 -0
  64. package/src/types/llm.ts +64 -0
  65. package/src/types/memory.ts +36 -0
  66. package/src/types/message.ts +193 -0
  67. package/src/types/rag.ts +86 -0
  68. package/src/types/role.ts +67 -0
  69. package/src/types/skill.ts +71 -0
  70. package/src/types/task.ts +32 -0
  71. package/src/types/team.ts +55 -0
  72. package/src/types/tool.ts +77 -0
  73. package/src/types/workflow.ts +133 -0
  74. package/src/utils/common.ts +73 -0
  75. package/src/utils/yaml.ts +67 -0
  76. package/src/websocket/browser-client.ts +187 -0
  77. package/src/websocket/client.ts +186 -0
  78. package/src/websocket/server.ts +169 -0
  79. package/src/websocket/types.ts +125 -0
  80. package/src/workflow/executor.ts +193 -0
  81. package/src/workflow/executors/action-executor.ts +72 -0
  82. package/src/workflow/executors/condition-executor.ts +118 -0
  83. package/src/workflow/executors/parallel-executor.ts +201 -0
  84. package/src/workflow/executors/role-executor.ts +76 -0
  85. package/src/workflow/executors/sequence-executor.ts +196 -0
  86. package/tests/actions.test.ts +105 -0
  87. package/tests/benchmark/performance.test.ts +147 -0
  88. package/tests/config/config.test.ts +115 -0
  89. package/tests/config.test.ts +106 -0
  90. package/tests/e2e/setup.ts +74 -0
  91. package/tests/e2e/workflow.test.ts +88 -0
  92. package/tests/llm.test.ts +84 -0
  93. package/tests/memory/memory.test.ts +164 -0
  94. package/tests/memory.test.ts +63 -0
  95. package/tests/monitoring/monitoring.test.ts +225 -0
  96. package/tests/plugin/plugin.test.ts +183 -0
  97. package/tests/provider/bailian-llm.test.ts +98 -0
  98. package/tests/rag.test.ts +162 -0
  99. package/tests/roles.test.ts +88 -0
  100. package/tests/skills.test.ts +166 -0
  101. package/tests/team.test.ts +143 -0
  102. package/tests/tools.test.ts +170 -0
  103. package/tests/types/document.test.ts +181 -0
  104. package/tests/types/message.test.ts +122 -0
  105. package/tests/utils/yaml.test.ts +110 -0
  106. package/tests/utils.test.ts +74 -0
  107. package/tests/websocket/browser-client.test.ts +1 -0
  108. package/tests/websocket/websocket.test.ts +42 -0
  109. package/tests/workflow/parallel-executor.test.ts +224 -0
  110. package/tests/workflow/sequence-executor.test.ts +207 -0
  111. package/tests/workflow.test.ts +290 -0
  112. package/tsconfig.json +27 -0
  113. package/typedoc.json +25 -0
@@ -0,0 +1,114 @@
1
+ # TutorialAssistant - MetaGPT-TS
2
+
3
+ 本文档介绍了 MetaGPT TypeScript 实现中的教程助手模块,该模块可以根据简单的一句话描述生成完整的 Markdown 格式教程文档。
4
+
5
+ ## 功能概述
6
+
7
+ TutorialAssistant(教程助手)是一个专门用于生成教程文档的角色。它能够:
8
+
9
+ 1. 接收一个简单的主题句子作为输入
10
+ 2. 自动生成结构化的教程目录
11
+ 3. 为每个目录条目生成详细内容
12
+ 4. 将完整的教程以 Markdown 格式保存到文件
13
+
14
+ 该实现基于 MetaGPT 架构,使用 Actions(动作)来划分生成步骤,使用大型语言模型来生成高质量内容。
15
+
16
+ ## 实现细节
17
+
18
+ TutorialAssistant 由以下主要组件组成:
19
+
20
+ 1. **角色**:`TutorialAssistant` 类
21
+ 2. **动作**:
22
+ - `WriteDirectory` - 生成教程的目录结构
23
+ - `WriteContent` - 根据目录结构生成每个部分的详细内容
24
+
25
+ ### 目录结构
26
+
27
+ 实现代码位于以下文件中:
28
+
29
+ - `src/roles/tutorial-assistant.ts` - 教程助手角色实现
30
+ - `src/actions/write-tutorial.ts` - 教程生成相关动作
31
+ - `examples/tutorial-assistant-example.ts` - 使用示例
32
+
33
+ ## 使用方法
34
+
35
+ ### 基本用法
36
+
37
+ ```typescript
38
+ import { BailianLLMProvider } from '../src/provider/bailian-llm';
39
+ import { TutorialAssistant } from '../src/roles/tutorial-assistant';
40
+
41
+ // 初始化语言模型提供商
42
+ const llmProvider = new BailianLLMProvider({
43
+ apiKey: 'your-api-key',
44
+ secretKey: 'your-secret-key',
45
+ });
46
+
47
+ // 创建教程助手
48
+ const tutorialAssistant = new TutorialAssistant({
49
+ llm: llmProvider,
50
+ language: 'Chinese', // 或 'English'
51
+ outputDir: './tutorials', // 可选,指定输出目录
52
+ });
53
+
54
+ // 生成教程
55
+ const result = await tutorialAssistant.react({
56
+ role: 'user',
57
+ content: '如何使用TypeScript开发Node.js应用', // 你的教程主题
58
+ id: 'msg-1',
59
+ causedBy: 'user-input',
60
+ sentFrom: 'user',
61
+ sendTo: new Set(['TutorialAssistant']),
62
+ });
63
+
64
+ console.log(result.content); // 显示结果消息
65
+ ```
66
+
67
+ ### 配置选项
68
+
69
+ `TutorialAssistant` 构造函数接受以下配置选项:
70
+
71
+ | 参数 | 类型 | 必填 | 描述 |
72
+ |------|------|------|------|
73
+ | llm | LLMProvider | 是 | 语言模型提供商实例 |
74
+ | language | string | 否 | 生成文档的语言,默认为 'Chinese',也可设为 'English' |
75
+ | outputDir | string | 否 | 生成文档的输出目录,默认为 './tutorials' |
76
+
77
+ ## 输出示例
78
+
79
+ 生成的教程文档示例:
80
+
81
+ ```markdown
82
+ # TypeScript Node.js 应用开发教程
83
+
84
+ ## 1. 介绍
85
+
86
+ ### 1.1 什么是 TypeScript
87
+ TypeScript 是 JavaScript 的超集,添加了类型系统和对 ES6+ 特性的支持...
88
+
89
+ ### 1.2 为什么在 Node.js 中使用 TypeScript
90
+ 使用 TypeScript 开发 Node.js 应用有很多优势...
91
+
92
+ ## 2. 环境设置
93
+
94
+ ### 2.1 安装 Node.js 和 npm
95
+ 首先,确保你的系统已安装 Node.js...
96
+
97
+ ...(更多内容)
98
+ ```
99
+
100
+ ## 注意事项
101
+
102
+ 1. 确保使用具有足够上下文长度的大型语言模型,以便生成完整、连贯的教程
103
+ 2. 生成的文档会保存在指定的输出目录中,文件名包含教程标题和时间戳
104
+ 3. 可以通过修改 `src/actions/write-tutorial.ts` 中的提示词模板来自定义生成的内容风格和格式
105
+
106
+ ## 扩展与自定义
107
+
108
+ ### 自定义提示词
109
+
110
+ 你可以修改 `WriteDirectory` 和 `WriteContent` 动作中的 `generateDirectoryPrompt` 和 `generateContentPrompt` 方法以自定义提示词。
111
+
112
+ ### 添加更多处理步骤
113
+
114
+ 如果你想添加更多的处理步骤(如添加代码检查、图片生成等),可以创建新的 Action 类并将其添加到 TutorialAssistant 的动作列表中。
@@ -0,0 +1,164 @@
1
+ # VercelLLMProvider - 多模型提供商支持
2
+
3
+ 本文档介绍了基于 Vercel AI SDK 的通用 LLM 提供商实现,该实现支持多种模型提供商,包括 OpenAI、Qwen、Anthropic、Mistral 和 Google 等。
4
+
5
+ ## 功能概述
6
+
7
+ `VercelLLMProvider` 是一个通用的语言模型提供商实现,它:
8
+
9
+ 1. 支持多种模型提供商的统一接口
10
+ 2. 动态加载所需的提供商模块,避免不必要的依赖
11
+ 3. 允许轻松切换不同的模型提供商
12
+ 4. 提供合理的默认配置和灵活的自定义选项
13
+ 5. 实现了 MetaGPT 的 `LLMProvider` 接口
14
+
15
+ ## 支持的提供商
16
+
17
+ 目前支持以下模型提供商:
18
+
19
+ | 提供商类型 | 提供商包 | 默认模型 |
20
+ |------------|-------------------|--------------------------|
21
+ | openai | @ai-sdk/openai | gpt-3.5-turbo |
22
+ | qwen | qwen-ai-provider | qwen-plus |
23
+ | anthropic | @ai-sdk/anthropic | claude-3-sonnet-20240229 |
24
+ | mistral | @ai-sdk/mistral | mistral-large-latest |
25
+ | google | @ai-sdk/google | gemini-pro |
26
+ | custom | 自定义 | 用户指定 |
27
+
28
+ ## 使用方法
29
+
30
+ ### 基本用法
31
+
32
+ ```typescript
33
+ import { VercelLLMProvider } from '../src/provider/vercel-llm';
34
+
35
+ // 使用 OpenAI
36
+ const openaiProvider = new VercelLLMProvider({
37
+ providerType: 'openai',
38
+ apiKey: process.env.OPENAI_API_KEY,
39
+ model: 'gpt-4',
40
+ });
41
+
42
+ // 使用 Qwen (百炼大模型)
43
+ const qwenProvider = new VercelLLMProvider({
44
+ providerType: 'qwen',
45
+ apiKey: process.env.QWEN_API_KEY,
46
+ model: 'qwen-plus',
47
+ });
48
+
49
+ // 生成文本
50
+ const result = await openaiProvider.generate('Hello, world!');
51
+ console.log(result);
52
+ ```
53
+
54
+ ### 高级配置
55
+
56
+ 您可以通过 `extraConfig` 字段提供额外的配置选项:
57
+
58
+ ```typescript
59
+ const provider = new VercelLLMProvider({
60
+ providerType: 'openai',
61
+ apiKey: process.env.OPENAI_API_KEY,
62
+ model: 'gpt-4',
63
+ extraConfig: {
64
+ // 生成选项,会传递给 generateText 方法
65
+ generateOptions: {
66
+ temperature: 0.7,
67
+ maxTokens: 500,
68
+ },
69
+ // 自定义提供商的环境变量
70
+ environmentVars: {
71
+ CUSTOM_API_HOST: 'https://custom-api.example.com',
72
+ },
73
+ },
74
+ });
75
+ ```
76
+
77
+ ### 自定义提供商
78
+
79
+ 您可以使用 `custom` 提供商类型来支持其他未内置的提供商:
80
+
81
+ ```typescript
82
+ import { customProvider } from 'custom-provider-package';
83
+
84
+ const provider = new VercelLLMProvider({
85
+ providerType: 'custom',
86
+ apiKey: process.env.CUSTOM_API_KEY,
87
+ extraConfig: {
88
+ modelFunction: customProvider,
89
+ defaultModel: 'custom-model-name',
90
+ environmentVars: {
91
+ CUSTOM_API_KEY: process.env.CUSTOM_API_KEY,
92
+ },
93
+ },
94
+ });
95
+ ```
96
+
97
+ ## 安装依赖
98
+
99
+ 根据需要使用的模型提供商,您需要安装相应的依赖包:
100
+
101
+ ```bash
102
+ # 安装核心依赖
103
+ bun add ai @ai-sdk/openai
104
+
105
+ # 按需安装其他提供商
106
+ bun add qwen-ai-provider
107
+ bun add @ai-sdk/anthropic
108
+ bun add @ai-sdk/mistral
109
+ bun add @ai-sdk/google
110
+ ```
111
+
112
+ ## API 参考
113
+
114
+ ### ModelProviderConfig
115
+
116
+ 配置对象的类型定义:
117
+
118
+ ```typescript
119
+ export type ModelProviderType = 'openai' | 'qwen' | 'anthropic' | 'mistral' | 'google' | 'custom';
120
+
121
+ export type ModelProviderConfig = {
122
+ providerType: ModelProviderType;
123
+ apiKey: string;
124
+ baseURL?: string;
125
+ model?: string;
126
+ extraConfig?: Record<string, any>;
127
+ };
128
+ ```
129
+
130
+ ### 方法
131
+
132
+ `VercelLLMProvider` 实现了 `LLMProvider` 接口的以下方法:
133
+
134
+ - **generate(prompt: string, config?: Partial<LLMConfig>): Promise<string>**
135
+ 生成文本响应
136
+
137
+ - **generateStream(prompt: string, config?: Partial<LLMConfig>): AsyncGenerator<string>**
138
+ 生成文本流,适用于实时响应
139
+
140
+ - **embed(text: string): Promise<number[]>**
141
+ 生成文本嵌入向量
142
+
143
+ ## 扩展与自定义
144
+
145
+ ### 添加新的提供商支持
146
+
147
+ 要添加对新提供商的支持,您需要:
148
+
149
+ 1. 在 `ModelProviderType` 中添加新的提供商类型
150
+ 2. 在 `providerFunctions` 对象中添加新提供商的初始化
151
+ 3. 在 `setupEnvironment` 方法中添加环境变量配置
152
+ 4. 在 `loadProviderModules` 方法中添加动态导入逻辑
153
+ 5. 在 `getDefaultModel` 方法中添加默认模型选择
154
+
155
+ ## 故障排除
156
+
157
+ 如果在使用过程中遇到问题,请检查:
158
+
159
+ 1. 是否已安装所需的提供商包
160
+ 2. 环境变量是否正确设置
161
+ 3. 网络连接是否正常
162
+ 4. 提供商服务是否可用
163
+
164
+ 如果动态导入提供商失败,您会在控制台看到警告信息,提示安装相应的包。
@@ -0,0 +1,55 @@
1
+ import eslint from '@eslint/js';
2
+ import tseslint from '@typescript-eslint/eslint-plugin';
3
+ import tsParser from '@typescript-eslint/parser';
4
+
5
+ export default [
6
+ eslint.configs.recommended,
7
+ {
8
+ files: ['**/*.{ts,tsx}'],
9
+ languageOptions: {
10
+ parser: tsParser,
11
+ parserOptions: {
12
+ ecmaVersion: 'latest',
13
+ sourceType: 'module'
14
+ },
15
+ globals: {
16
+ // Add globals that are available in both Node.js and browser environments
17
+ console: 'readonly',
18
+ process: 'readonly',
19
+ setTimeout: 'readonly',
20
+ clearTimeout: 'readonly',
21
+ setInterval: 'readonly',
22
+ clearInterval: 'readonly',
23
+ // Browser globals
24
+ window: 'readonly',
25
+ document: 'readonly',
26
+ WebSocket: 'readonly',
27
+ MessageEvent: 'readonly',
28
+ Event: 'readonly',
29
+ crypto: 'readonly',
30
+ performance: 'readonly',
31
+ Console: 'readonly',
32
+ // Node.js globals
33
+ require: 'readonly',
34
+ __dirname: 'readonly',
35
+ __filename: 'readonly',
36
+ module: 'readonly',
37
+ exports: 'readonly',
38
+ Buffer: 'readonly'
39
+ }
40
+ },
41
+ plugins: {
42
+ '@typescript-eslint': tseslint,
43
+ },
44
+ rules: {
45
+ '@typescript-eslint/explicit-function-return-type': 'warn',
46
+ '@typescript-eslint/no-explicit-any': 'warn',
47
+ '@typescript-eslint/no-unused-vars': 'warn',
48
+ 'no-unused-vars': 'off', // Turn off the base rule as it can report incorrect errors with TypeScript
49
+ 'no-undef': 'error'
50
+ }
51
+ },
52
+ {
53
+ ignores: ['node_modules/**', 'dist/**', 'build/**']
54
+ }
55
+ ];
@@ -0,0 +1,173 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { VercelLLMProvider } from '../src/provider/vercel-llm';
3
+ import { DataInterpreter } from '../src/roles/data-interpreter';
4
+
5
+ /**
6
+ * 数据解释器示例
7
+ *
8
+ * 该示例演示如何使用数据解释器生成数据分析代码
9
+ */
10
+ async function main() {
11
+ console.log(`🚀 开始执行数据分析 [${new Date().toISOString()}]`);
12
+
13
+ try {
14
+ // 从环境变量获取API密钥
15
+ const apiKey = process.env.DASHSCOPE_API_KEY;
16
+ console.log('✓ 检查环境变量');
17
+
18
+ if (!apiKey) {
19
+ console.error('❌ 错误: 请设置环境变量: DASHSCOPE_API_KEY');
20
+ process.exit(1);
21
+ }
22
+ console.log('✓ 环境变量已设置');
23
+
24
+ // 初始化Vercel LLM提供商 - 使用百炼大模型(qwen)
25
+ console.log('⚙️ 配置百炼大模型...');
26
+ const llmProvider = new VercelLLMProvider({
27
+ providerType: 'qwen',
28
+ apiKey,
29
+ model: 'qwen-plus-2025-01-25',
30
+ baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1', // 自定义API端点
31
+ extraConfig: {
32
+ qwenOptions: {
33
+ debug: true, // 启用调试日志
34
+ },
35
+ generateOptions: {
36
+ system: '你是一位专业的数据科学家,擅长数据分析、可视化和机器学习。'
37
+ }
38
+ }
39
+ });
40
+ console.log(`✓ 模型配置完成: qwen - qwen-plus-2025-01-25`);
41
+
42
+ console.log('⚙️ 初始化数据解释器...');
43
+ console.time('数据解释器初始化时间');
44
+
45
+ // 创建数据解释器
46
+ const dataInterpreter = new DataInterpreter({
47
+ llm: llmProvider,
48
+ auto_run: true,
49
+ use_plan: false,
50
+ use_reflection: true,
51
+ react_mode: 'react',
52
+ max_react_loop: 2,
53
+ tools: ['pandas', 'matplotlib', 'seaborn', 'scikit-learn'],
54
+ });
55
+
56
+ console.timeEnd('数据解释器初始化时间');
57
+ console.log('✓ 数据解释器初始化完成');
58
+
59
+ // 设置要分析的数据需求
60
+ const requirement = '使用Python分析鸢尾花数据集,包括基本统计信息、相关性分析和可视化,最后使用SVM算法进行分类。';
61
+ console.log(`📝 数据分析需求: "${requirement}"`);
62
+
63
+ // 检查Python环境
64
+ console.log('🔍 检查Python环境...');
65
+ await checkPythonEnvironment();
66
+
67
+ // 执行数据分析
68
+ console.log('🔄 开始数据分析...');
69
+ console.time('数据分析总时间');
70
+
71
+ const result = await dataInterpreter.react({
72
+ id: uuidv4(),
73
+ role: 'user',
74
+ content: requirement,
75
+ causedBy: 'user-input',
76
+ sentFrom: 'user',
77
+ sendTo: new Set(['*']),
78
+ instructContent: null,
79
+ });
80
+
81
+ console.timeEnd('数据分析总时间');
82
+ console.log('✅ 数据分析完成!');
83
+
84
+ // 检查结果中是否有依赖错误
85
+ if (result.content.includes('Missing Dependencies Detected') || result.content.includes('Missing Dependency:')) {
86
+ console.log('⚠️ 检测到缺少Python依赖!');
87
+ console.log('');
88
+ console.log('请安装所需依赖:');
89
+
90
+ // 提取安装命令
91
+ const pipMatch = result.content.match(/pip install ([^`]+)/);
92
+ if (pipMatch && pipMatch[1]) {
93
+ console.log(`\n运行: pip install ${pipMatch[1].trim()}\n`);
94
+ } else {
95
+ console.log(result.content);
96
+ }
97
+ } else {
98
+ // 正常输出结果
99
+ console.log(`📄 生成结果: ${result.content.substring(0, 200)}...`);
100
+ }
101
+
102
+ console.log(`🏁 数据分析完成 [${new Date().toISOString()}]`);
103
+ } catch (error) {
104
+ console.error('❌ 数据分析时出错:', error);
105
+ if (error instanceof Error) {
106
+ console.error(`错误类型: ${error.name}`);
107
+ console.error(`错误信息: ${error.message}`);
108
+ console.error(`错误堆栈: ${error.stack}`);
109
+ }
110
+ }
111
+ }
112
+
113
+ /**
114
+ * 检查Python环境
115
+ */
116
+ async function checkPythonEnvironment(): Promise<void> {
117
+ const { exec } = require('child_process');
118
+
119
+ return new Promise((resolve, reject) => {
120
+ // 检查Python版本
121
+ exec('python --version', (error: any, stdout: string, stderr: string) => {
122
+ if (error) {
123
+ console.error('❌ 未检测到Python! 请确保Python已安装并添加到PATH中。');
124
+ reject(new Error('Python not found'));
125
+ return;
126
+ }
127
+
128
+ console.log(`✓ 检测到Python: ${stdout.trim()}`);
129
+
130
+ // 检查常用数据科学包
131
+ const packages = ['pandas', 'numpy', 'matplotlib', 'seaborn', 'scikit-learn'];
132
+ let installedCount = 0;
133
+ let missingPackages: string[] = [];
134
+
135
+ const checkPackage = (index: number) => {
136
+ if (index >= packages.length) {
137
+ // 所有包检查完毕
138
+ console.log(`✓ 已安装的包: ${installedCount}/${packages.length}`);
139
+
140
+ if (missingPackages.length > 0) {
141
+ const pipCmd = `pip install ${missingPackages.join(' ')}`;
142
+ console.log(`⚠️ 缺少以下Python包: ${missingPackages.join(', ')}`);
143
+ console.log(`💡 建议运行: ${pipCmd}`);
144
+ }
145
+
146
+ resolve();
147
+ return;
148
+ }
149
+
150
+ const pkg = packages[index];
151
+ exec(`python -c "import ${pkg}" 2>/dev/null`, (err: any) => {
152
+ if (err) {
153
+ console.log(`✗ 未安装: ${pkg}`);
154
+ missingPackages.push(pkg);
155
+ } else {
156
+ console.log(`✓ 已安装: ${pkg}`);
157
+ installedCount++;
158
+ }
159
+
160
+ // 检查下一个包
161
+ checkPackage(index + 1);
162
+ });
163
+ };
164
+
165
+ // 开始检查第一个包
166
+ checkPackage(0);
167
+ });
168
+ });
169
+ }
170
+
171
+ // 运行示例
172
+ console.log(' 数据解释器示例');
173
+ main();
@@ -0,0 +1,60 @@
1
+ /**
2
+ * 直接使用 Vercel AI SDK 调用百炼大模型(qwen-plus)的示例
3
+ *
4
+ * 运行前需要:
5
+ * 1. 安装依赖: bun add qwen-ai-provider ai
6
+ * 2. 设置环境变量: DASHSCOPE_API_KEY
7
+ */
8
+
9
+ // @ts-nocheck - 忽略类型检查,这是由于ai库和provider库之间的版本差异导致的类型不兼容
10
+ import { generateText } from 'ai';
11
+ import { createQwen } from 'qwen-ai-provider';
12
+
13
+ async function main() {
14
+ try {
15
+ // 检查环境变量
16
+ const apiKey = process.env.DASHSCOPE_API_KEY;
17
+
18
+ if (!apiKey) {
19
+ console.error('请设置环境变量: DASHSCOPE_API_KEY');
20
+ process.exit(1);
21
+ }
22
+
23
+ // 设置环境变量
24
+ process.env.DASHSCOPE_API_KEY = apiKey;
25
+
26
+ // 创建自定义配置的qwen提供商
27
+ const qwen = createQwen({
28
+ baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
29
+ debug: true, // 启用调试日志
30
+ // 其他可能的配置选项
31
+ });
32
+
33
+ console.log('初始化完成,开始生成文本...');
34
+
35
+ // 设置提示词
36
+ const prompt = '写一个4人份的素食千层面食谱。';
37
+ console.log(`提示词: "${prompt}"`);
38
+
39
+ // 生成文本
40
+ console.time('生成耗时');
41
+ const { text } = await generateText({
42
+ model: qwen('qwen-plus'),
43
+ prompt,
44
+ temperature: 0.7,
45
+ maxTokens: 1000,
46
+ system: '你是一位专业的素食厨师,擅长制作美味的素食料理。',
47
+ });
48
+ console.timeEnd('生成耗时');
49
+
50
+ console.log('\n====== 生成结果 ======\n');
51
+ console.log(text);
52
+ console.log('\n====== 结束 ======\n');
53
+
54
+ } catch (error) {
55
+ console.error('生成文本时出错:', error);
56
+ }
57
+ }
58
+
59
+ // 运行示例
60
+ main();
@@ -0,0 +1,62 @@
1
+ import { VercelLLMProvider } from '../src/provider/vercel-llm';
2
+
3
+ /**
4
+ * 百炼大模型(qwen-plus)使用示例
5
+ *
6
+ * 运行前需要:
7
+ * 1. 安装依赖: bun add qwen-ai-provider
8
+ * 2. 设置环境变量: DASHSCOPE_API_KEY
9
+ */
10
+ async function main() {
11
+ try {
12
+ // 从环境变量获取API密钥
13
+ const apiKey = process.env.DASHSCOPE_API_KEY;
14
+
15
+ if (!apiKey) {
16
+ console.error('请设置环境变量: DASHSCOPE_API_KEY');
17
+ process.exit(1);
18
+ }
19
+
20
+ // 初始化 Qwen 提供商
21
+ const qwenProvider = new VercelLLMProvider({
22
+ providerType: 'qwen',
23
+ apiKey,
24
+ model: 'qwen-plus',
25
+ baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1', // 自定义API端点
26
+ extraConfig: {
27
+ qwenOptions: {
28
+ // 可以在这里添加其他Qwen特定的配置选项
29
+ debug: true, // 启用调试日志
30
+ },
31
+ // 生成选项,会传递给generateText方法
32
+ generateOptions: {
33
+ system: '你是一位专业的素食厨师,擅长制作美味的素食料理。',
34
+ }
35
+ }
36
+ });
37
+
38
+ console.log('初始化完成,开始生成文本...');
39
+
40
+ // 设置提示词
41
+ const prompt = '写一个4人份的素食千层面食谱。';
42
+ console.log(`提示词: "${prompt}"`);
43
+
44
+ // 生成文本
45
+ console.time('生成耗时');
46
+ const result = await qwenProvider.generate(prompt, {
47
+ temperature: 0.7,
48
+ maxTokens: 1000
49
+ });
50
+ console.timeEnd('生成耗时');
51
+
52
+ console.log('\n====== 生成结果 ======\n');
53
+ console.log(result);
54
+ console.log('\n====== 结束 ======\n');
55
+
56
+ } catch (error) {
57
+ console.error('生成文本时出错:', error);
58
+ }
59
+ }
60
+
61
+ // 运行示例
62
+ main();