@lmliheng/agent 1.0.0 → 1.0.2

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
@@ -1 +1,33 @@
1
- 26-8-27: 做了prompts里的JSON,表格,拒绝回答等格式的prompt函数
1
+ 26-8-27: 做了prompts里的JSON,表格,拒绝回答等格式的prompt函数
2
+
3
+ 用法如下,参考test目录案例:
4
+ ```js
5
+ message = new Message(answer, p.refuse('强化学习/华为/许家印'))
6
+ ```
7
+ ```json
8
+ user: 说说RL
9
+ 抱歉,关于强化学习(RL)这个话题,我暂时无法为您提供详细信息。建议您查阅相关学术资料或咨询专业领域人士。如有其他问题,欢迎继续提问。
10
+ user: 还是说说恒大吧
11
+ 抱歉,关于恒大集团及许家印相关的话题,我暂时无法为您提供详细信息。建议您通过官方渠道或权威新闻平台了解公开信息。如有其他问题,欢迎继续提问。
12
+ user: 好吧
13
+ 感谢您的理解!如果之后有任何其他问题,比如技术、生活、学习或其他我能协助的领域,随时欢迎提问。祝您今天一切顺利! 😊
14
+ ```
15
+
16
+ json回答:
17
+ ```js
18
+ let answer_diff = new Prompts(answer)
19
+ message = new Message(answer_diff.json())
20
+ ```
21
+
22
+ ```json
23
+ user: 感谢您的理解!如果之后有任何其他问题,比如技术、生活、学习或其他我能协助的领域,随时欢迎提问。祝您今天一切顺利
24
+ {
25
+ "name": "友好告别信息",
26
+ "features": [
27
+ "表达感谢与理解",
28
+ "主动提供后续帮助领域",
29
+ "传递美好祝愿"
30
+ ],
31
+ "rating": 9
32
+ }
33
+ ```
package/dist/index.mjs CHANGED
@@ -4,6 +4,8 @@
4
4
  * let message=new Message('说说KV cache')
5
5
  * let message=new Message('说说KV cache','${prompt.JSON}')
6
6
  *
7
+ * 增加对话:
8
+ * MessageAdd(message,role)
7
9
  */
8
10
  class Message {
9
11
 
@@ -13,7 +15,7 @@ class Message {
13
15
  * SystemMessage默认为空
14
16
  */
15
17
  constructor(text, SystemMessage = '') {
16
- this.message = [
18
+ this.content = [
17
19
  { "role": "system", "content": `${SystemMessage}` },
18
20
  { "role": "user", "content": `${text}` }
19
21
  ];
@@ -23,10 +25,16 @@ class Message {
23
25
  * role可以选择system,assistant,tool,user
24
26
  */
25
27
  MessageAdd(message, role) {
26
- this.message.push({ "role": role, "content": message });
28
+ this.content.push({ "role": role, "content": message });
27
29
  }
28
30
  }
29
31
 
32
+ /**
33
+ * @propmts对象
34
+ *
35
+ *
36
+ */
37
+
30
38
  class Prompts {
31
39
 
32
40
  constructor(text) {
@@ -123,4 +131,55 @@ class Prompts {
123
131
  }
124
132
  }
125
133
 
126
- export { Message, Prompts };
134
+ /**
135
+ * @ds单多轮对话调用
136
+ */
137
+ async function callDeepSeek(messages, options = {}) {
138
+ const API_URL = process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/chat/completions';
139
+ const MODEL = process.env.DEEPSEEK_MODEL || 'deepseek-v4-flash';
140
+ // 调用模型前先检查 API Key,避免发送无效请求。
141
+ if (!process.env.DEEPSEEK_API_KEY) {
142
+ throw new Error('缺少 DEEPSEEK_API_KEY,请先在 .env 中完成配置。')
143
+ }
144
+ const startedAt = Date.now();
145
+ const response = await fetch(API_URL, {
146
+ method: 'POST',
147
+ headers: {
148
+ Authorization: `Bearer ${process.env.DEEPSEEK_API_KEY}`,
149
+ 'Content-Type': 'application/json'
150
+ },
151
+ body: JSON.stringify({
152
+ model: MODEL,
153
+ messages,
154
+ ...options,
155
+ })
156
+ });
157
+
158
+ /**
159
+ * 无论 HTTP 状态码是否成功,都先解析响应体。
160
+ *
161
+ * 这样接口失败时,也可以将服务端返回的错误信息
162
+ * 一起放入异常中,方便定位问题。
163
+ */
164
+ const data = await response.json();
165
+
166
+ if (!response.ok) {
167
+ throw new Error(
168
+ `DeepSeek 调用失败:${response.status} ${JSON.stringify(data)}`
169
+ )
170
+ }
171
+
172
+ const choice = data.choices?.[0];
173
+ if (!choice?.message) {
174
+ throw new Error(`DeepSeek 没有返回有效消息:${JSON.stringify(data)}`)
175
+ }
176
+
177
+ return {
178
+ message: choice.message,
179
+ finishReason: choice.finish_reason,
180
+ latencyMs: Date.now() - startedAt,
181
+ usage: data.usage
182
+ }
183
+ }
184
+
185
+ export { Message, Prompts, callDeepSeek };
package/index.js CHANGED
@@ -1,2 +1,5 @@
1
1
  export { default as Message } from './message/index.js'
2
- export { default as Prompts } from './prompts/index.js'
2
+ export { default as Prompts } from './prompts/index.js'
3
+
4
+
5
+ export { callDeepSeek } from './llm/deepseek_client.js'
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @ds单多轮对话调用
3
+ */
4
+ export async function callDeepSeek(messages, options = {}) {
5
+ const API_URL = process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/chat/completions'
6
+ const MODEL = process.env.DEEPSEEK_MODEL || 'deepseek-v4-flash'
7
+ // 调用模型前先检查 API Key,避免发送无效请求。
8
+ if (!process.env.DEEPSEEK_API_KEY) {
9
+ throw new Error('缺少 DEEPSEEK_API_KEY,请先在 .env 中完成配置。')
10
+ }
11
+ const startedAt = Date.now()
12
+ const response = await fetch(API_URL, {
13
+ method: 'POST',
14
+ headers: {
15
+ Authorization: `Bearer ${process.env.DEEPSEEK_API_KEY}`,
16
+ 'Content-Type': 'application/json'
17
+ },
18
+ body: JSON.stringify({
19
+ model: MODEL,
20
+ messages,
21
+ ...options,
22
+ })
23
+ })
24
+
25
+ /**
26
+ * 无论 HTTP 状态码是否成功,都先解析响应体。
27
+ *
28
+ * 这样接口失败时,也可以将服务端返回的错误信息
29
+ * 一起放入异常中,方便定位问题。
30
+ */
31
+ const data = await response.json()
32
+
33
+ if (!response.ok) {
34
+ throw new Error(
35
+ `DeepSeek 调用失败:${response.status} ${JSON.stringify(data)}`
36
+ )
37
+ }
38
+
39
+ const choice = data.choices?.[0]
40
+ if (!choice?.message) {
41
+ throw new Error(`DeepSeek 没有返回有效消息:${JSON.stringify(data)}`)
42
+ }
43
+
44
+ return {
45
+ message: choice.message,
46
+ finishReason: choice.finish_reason,
47
+ latencyMs: Date.now() - startedAt,
48
+ usage: data.usage
49
+ }
50
+ }
51
+
52
+ /**
53
+ * @余额查询
54
+ */
55
+ export async function getDeepseekBalance() {
56
+ const token = process.env.DEEPSEEK_API_KEY
57
+ if (!token) {
58
+ throw new Error('DEEPSEEK_API_KEY 未设置,检查 .env 和 dotenv 加载顺序')
59
+ }
60
+ try {
61
+ const response = await fetch('https://api.deepseek.com/user/balance', {
62
+ method: 'GET',
63
+ headers: {
64
+ 'Accept': 'application/json',
65
+ 'Authorization': `Bearer ${process.env.DEEPSEEK_API_KEY}`
66
+ }
67
+ })
68
+ if (!response.ok) {
69
+ throw new Error(`HTTP error! status: ${response.status}`)
70
+ }
71
+ // console.log(response)
72
+ const data = await response.json()
73
+ return data
74
+
75
+ } catch (error) {
76
+ console.error('请求失败:', error.message)
77
+ }
78
+ }
79
+
80
+
package/message/index.js CHANGED
@@ -6,6 +6,8 @@
6
6
  * let message=new Message('说说KV cache')
7
7
  * let message=new Message('说说KV cache','${prompt.JSON}')
8
8
  *
9
+ * 增加对话:
10
+ * MessageAdd(message,role)
9
11
  */
10
12
  export default class Message {
11
13
 
@@ -15,7 +17,7 @@ export default class Message {
15
17
  * SystemMessage默认为空
16
18
  */
17
19
  constructor(text, SystemMessage = '') {
18
- this.message = [
20
+ this.content = [
19
21
  { "role": "system", "content": `${SystemMessage}` },
20
22
  { "role": "user", "content": `${text}` }
21
23
  ]
@@ -25,7 +27,7 @@ export default class Message {
25
27
  * role可以选择system,assistant,tool,user
26
28
  */
27
29
  MessageAdd(message, role) {
28
- this.message.push({ "role": role, "content": message })
30
+ this.content.push({ "role": role, "content": message })
29
31
  }
30
32
  }
31
33
 
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "name": "@lmliheng/agent",
7
- "version": "1.0.0",
7
+ "version": "1.0.2",
8
8
  "description": "agent包,目前有message,prompts模块,最近一次更新是26-8-27",
9
9
  "keywords": [
10
10
  "prompt",
@@ -14,9 +14,7 @@
14
14
  "license": "MIT",
15
15
  "main": "index.js",
16
16
  "scripts": {
17
- "test": "node --test",
18
- "mcp": "node index.mjs --server",
19
- "disk": "node src/Disk/disk.js",
17
+ "llm": "node --env-file=.env ./test/llm.test.js",
20
18
  "build": "rollup -c",
21
19
  "p": "npm version patch && npm publish --registry=https://registry.npmjs.org/"
22
20
  },
@@ -27,4 +25,4 @@
27
25
  "devDependencies": {
28
26
  "rollup": "^4.62.4"
29
27
  }
30
- }
28
+ }
package/prompts/index.js CHANGED
@@ -1,3 +1,10 @@
1
+
2
+ /**
3
+ * @propmts对象
4
+ *
5
+ *
6
+ */
7
+
1
8
  export default class Prompts {
2
9
 
3
10
  constructor(text) {
package/test/.env ADDED
@@ -0,0 +1 @@
1
+ DEEPSEEK_API_KEY='sk-67cc769fcef146819f6aaedcc0716f74'
@@ -0,0 +1,42 @@
1
+ import { callDeepSeek, Message, Prompts } from '../index.js'
2
+ import * as readline from 'readline'
3
+
4
+
5
+ // node --env-file=.env llm.test.js chat
6
+
7
+ if (process.argv[2] === 'chat') {
8
+ const rl = readline.createInterface({
9
+ input: process.stdin,
10
+ output: process.stdout,
11
+ })
12
+
13
+ let p = new Prompts()
14
+ let message
15
+ function ask() {
16
+ rl.question('user: ', async (answer) => {
17
+ if (answer.toLowerCase() === 'stop') {
18
+ rl.close()
19
+ return
20
+ }
21
+ let answer_diff = new Prompts(answer)
22
+ if (message === undefined) {
23
+ message = new Message(answer_diff.json(), p.refuse('强化学习/华为/许家印'))
24
+ } else {
25
+ message.MessageAdd(answer, 'user')
26
+ }
27
+
28
+ let res = await callDeepSeek(message.content, {
29
+ temperature: 0.9
30
+ })
31
+ console.log(res.message.content)
32
+ message.MessageAdd(res.message.content, 'assistant')
33
+ ask()
34
+ })
35
+ }
36
+ ask()
37
+ }
38
+
39
+ if (process.argv[2] === 'balance') {
40
+ let balance = await getDeepseekBalance()
41
+ console.table(balance.balance_infos)
42
+ }