@3-/aiapi 0.1.52 → 0.1.54
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/fmtJson.js +5 -21
- package/fmtJsonMd.js +9 -7
- package/fmtSeg.js +1 -1
- package/gemini.js +14 -10
- package/package.json +1 -30
- package/partition.js +39 -39
- package/seg.js +2 -6
package/fmtJson.js
CHANGED
|
@@ -4,29 +4,13 @@ import fmtSeg from './fmtSeg.js';
|
|
|
4
4
|
import partition from './partition.js';
|
|
5
5
|
|
|
6
6
|
export default async(chat, txt) => {
|
|
7
|
-
var
|
|
7
|
+
var pli;
|
|
8
8
|
if (!txt) {
|
|
9
9
|
return [];
|
|
10
10
|
}
|
|
11
11
|
pli = (await partition(chat, txt));
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
result.push(fmtSeg(chat, tmp.join('\n')));
|
|
17
|
-
};
|
|
18
|
-
for (i of pli) {
|
|
19
|
-
tmp.push(i);
|
|
20
|
-
sum += i.length;
|
|
21
|
-
if (sum > 3000) {
|
|
22
|
-
console.log(sum);
|
|
23
|
-
gen();
|
|
24
|
-
sum = 0;
|
|
25
|
-
tmp = [];
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
if (tmp.length) {
|
|
29
|
-
gen();
|
|
30
|
-
}
|
|
31
|
-
return Promise.all(result);
|
|
12
|
+
return Promise.all(pli.map(async([title, li]) => {
|
|
13
|
+
console.log('\n\n---\n' + li.join('\n') + '\n\n---');
|
|
14
|
+
return [title, (await fmtSeg(chat, li.join('\n')))];
|
|
15
|
+
}));
|
|
32
16
|
};
|
package/fmtJsonMd.js
CHANGED
|
@@ -7,15 +7,17 @@ txtFmt = (txt) => {
|
|
|
7
7
|
return TxtLi(txt).join('\n\n');
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
export default (
|
|
11
|
-
var li, md_li, x, y, 答, 话题, 问, 问答, 题;
|
|
10
|
+
export default (title_json_li) => {
|
|
11
|
+
var li, md_li, title, x, y, z, 答, 话题, 问, 问答, 题;
|
|
12
12
|
md_li = [];
|
|
13
|
-
for (
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
for (x of title_json_li) {
|
|
14
|
+
[title, li] = x;
|
|
15
|
+
md_li.push('# ' + title);
|
|
16
|
+
for (y of li) {
|
|
17
|
+
({话题, 问答} = y);
|
|
16
18
|
md_li.push('## ' + 话题);
|
|
17
|
-
for (
|
|
18
|
-
({题, 问, 答} =
|
|
19
|
+
for (z of 问答) {
|
|
20
|
+
({题, 问, 答} = z);
|
|
19
21
|
md_li.push('### ' + 题 + '\n问: ' + txtFmt(问) + '\n答: ' + txtFmt(答));
|
|
20
22
|
}
|
|
21
23
|
}
|
package/fmtSeg.js
CHANGED
|
@@ -4,7 +4,7 @@ import TOPIC_SCHEMA from './TOPIC_SCHEMA.js';
|
|
|
4
4
|
import retry from '@3-/retry';
|
|
5
5
|
|
|
6
6
|
export default retry(async(chat, txt) => {
|
|
7
|
-
return (await chat(`将以下语音对话转为JSON
|
|
7
|
+
return (await chat(`将以下语音对话转为JSON数组,确保所有对话内容都必须被覆盖,不可遗漏:\n` + txt, TOPIC_SCHEMA, "你是专业资深的秘书", {
|
|
8
8
|
generationConfig: {
|
|
9
9
|
temperature: 0
|
|
10
10
|
}
|
package/gemini.js
CHANGED
|
@@ -3,7 +3,7 @@ import sleep from '@3-/sleep';
|
|
|
3
3
|
|
|
4
4
|
import merge from 'lodash-es/merge.js';
|
|
5
5
|
|
|
6
|
-
export default (token_li, model = 'gemini-
|
|
6
|
+
export default (token_li, model = 'gemini-3-pro-preview') => {
|
|
7
7
|
var _NEXT_TOKEN, _nextToken, nextToken;
|
|
8
8
|
token_li.sort(() => {
|
|
9
9
|
return Math.random() - 0.5;
|
|
@@ -21,7 +21,7 @@ export default (token_li, model = 'gemini-2.5-pro') => {
|
|
|
21
21
|
return _NEXT_TOKEN.next().value;
|
|
22
22
|
};
|
|
23
23
|
return async(text, schema, system, option) => {
|
|
24
|
-
var body, err, error, json, message, parts, r, retryed, status;
|
|
24
|
+
var body, err, error, json, message, parts, r, retryed, status, token, warn;
|
|
25
25
|
body = {
|
|
26
26
|
contents: [
|
|
27
27
|
{
|
|
@@ -51,11 +51,15 @@ export default (token_li, model = 'gemini-2.5-pro') => {
|
|
|
51
51
|
body = JSON.stringify(body);
|
|
52
52
|
retryed = token_li.length;
|
|
53
53
|
while (true) {
|
|
54
|
+
token = nextToken();
|
|
55
|
+
warn = (...args) => {
|
|
56
|
+
return console.log('\n→ ' + token + '\n', ...args, '\n');
|
|
57
|
+
};
|
|
54
58
|
try {
|
|
55
59
|
// console.log 'https://generativelanguage.googleapis.com/v1beta/models/'+model+':generateContent'
|
|
56
60
|
r = (await fetch('https://generativelanguage.googleapis.com/v1beta/models/' + model + ':generateContent', {
|
|
57
61
|
headers: {
|
|
58
|
-
'X-goog-api-key':
|
|
62
|
+
'X-goog-api-key': token,
|
|
59
63
|
'Content-Type': 'application/json'
|
|
60
64
|
},
|
|
61
65
|
method: 'POST',
|
|
@@ -64,7 +68,7 @@ export default (token_li, model = 'gemini-2.5-pro') => {
|
|
|
64
68
|
({status} = r);
|
|
65
69
|
} catch (error1) {
|
|
66
70
|
err = error1;
|
|
67
|
-
|
|
71
|
+
warn(err);
|
|
68
72
|
await sleep(1000);
|
|
69
73
|
continue;
|
|
70
74
|
}
|
|
@@ -73,9 +77,9 @@ export default (token_li, model = 'gemini-2.5-pro') => {
|
|
|
73
77
|
if (status === 429) {
|
|
74
78
|
try {
|
|
75
79
|
({error} = JSON.parse(text));
|
|
76
|
-
|
|
80
|
+
warn(error.status, error.message);
|
|
77
81
|
} catch (error1) {
|
|
78
|
-
|
|
82
|
+
warn(text);
|
|
79
83
|
}
|
|
80
84
|
continue;
|
|
81
85
|
}
|
|
@@ -84,9 +88,9 @@ export default (token_li, model = 'gemini-2.5-pro') => {
|
|
|
84
88
|
({
|
|
85
89
|
error: {message}
|
|
86
90
|
} = JSON.parse(text));
|
|
87
|
-
|
|
91
|
+
warn(status, message);
|
|
88
92
|
} catch (error1) {
|
|
89
|
-
|
|
93
|
+
warn(text);
|
|
90
94
|
}
|
|
91
95
|
if (status !== 500) {
|
|
92
96
|
await sleep(1000);
|
|
@@ -98,7 +102,7 @@ export default (token_li, model = 'gemini-2.5-pro') => {
|
|
|
98
102
|
json = (await r.json());
|
|
99
103
|
({parts} = json.candidates[0].content);
|
|
100
104
|
if (!parts) {
|
|
101
|
-
|
|
105
|
+
warn('miss parts', JSON.stringify(json, null, 2));
|
|
102
106
|
continue;
|
|
103
107
|
}
|
|
104
108
|
text = parts[0].text;
|
|
@@ -107,7 +111,7 @@ export default (token_li, model = 'gemini-2.5-pro') => {
|
|
|
107
111
|
return JSON.parse(text);
|
|
108
112
|
} catch (error1) {
|
|
109
113
|
err = error1;
|
|
110
|
-
|
|
114
|
+
warn(body, text, err);
|
|
111
115
|
if (--retryed <= 0) {
|
|
112
116
|
throw err;
|
|
113
117
|
}
|
package/package.json
CHANGED
|
@@ -1,30 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@3-/aiapi",
|
|
3
|
-
"version": "0.1.52",
|
|
4
|
-
"repository": {
|
|
5
|
-
"type": "git",
|
|
6
|
-
"url": "git+https://atomgit.com/i18n/lib.git"
|
|
7
|
-
},
|
|
8
|
-
"homepage": "https://atomgit.com/i18n/lib/tree/dev/aiapi",
|
|
9
|
-
"author": "i18n.site@gmail.com",
|
|
10
|
-
"license": "MulanPSL-2.0",
|
|
11
|
-
"exports": {
|
|
12
|
-
".": "./lib.js",
|
|
13
|
-
"./*": "./*"
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"./*"
|
|
17
|
-
],
|
|
18
|
-
"devDependencies": {
|
|
19
|
-
"@3-/read": "^0.1.4"
|
|
20
|
-
},
|
|
21
|
-
"type": "module",
|
|
22
|
-
"dependencies": {
|
|
23
|
-
"@3-/retry": "^0.0.2",
|
|
24
|
-
"@3-/sleep": "^0.0.4",
|
|
25
|
-
"@3-/txt_li": "^0.1.5",
|
|
26
|
-
"@3-/utf8": "^0.0.4",
|
|
27
|
-
"lodash-es": "^4.17.21"
|
|
28
|
-
},
|
|
29
|
-
"scripts": {}
|
|
30
|
-
}
|
|
1
|
+
{"name":"@3-/aiapi","version":"0.1.54","repository":{"type":"git","url":"git+https://atomgit.com/i18n/lib.git"},"homepage":"https://atomgit.com/i18n/lib/tree/dev/aiapi","author":"i18n.site@gmail.com","license":"MulanPSL-2.0","exports":{".":"./lib.js","./*":"./*"},"files":["./*"],"devDependencies":{"@3-/read":"^0.1.4"},"scripts":{},"type":"module","dependencies":{"@3-/retry":"^0.0.2","@3-/sleep":"^0.0.4","@3-/txt_li":"^0.1.5","@3-/utf8":"^0.0.4","lodash-es":"^4.17.21"}}
|
package/partition.js
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import seg from "./seg.js"
|
|
2
|
-
import txtLi from "@3-/txt_li"
|
|
1
|
+
import seg from "./seg.js";
|
|
2
|
+
import txtLi from "@3-/txt_li";
|
|
3
3
|
|
|
4
4
|
const partition = async (li, title_number, remain_seg) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const result = []
|
|
8
|
-
let start = 0
|
|
5
|
+
const order = title_number.sort((a, b) => a[1] - b[1]);
|
|
6
|
+
const result = [];
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
let title,
|
|
9
|
+
row,
|
|
10
|
+
pre = 0;
|
|
11
|
+
for ([title, row] of order) {
|
|
12
|
+
console.log(title);
|
|
13
|
+
result.push([title, li.slice(pre, row)]);
|
|
14
|
+
pre = row;
|
|
15
|
+
}
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
17
|
+
if (pre < li.length) {
|
|
18
|
+
li = li.slice(pre);
|
|
19
|
+
if (li.join("\n").length > 3000) {
|
|
20
|
+
return result.concat(await remain_seg(li));
|
|
21
|
+
} else {
|
|
22
|
+
result.at(-1)[1].push(...li);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
26
|
+
return result;
|
|
27
|
+
},
|
|
28
|
+
repartition = (chat, len) => async (li) => {
|
|
29
|
+
if (
|
|
30
|
+
// 这表示不可再分
|
|
31
|
+
li.length == len
|
|
32
|
+
) {
|
|
33
|
+
return li;
|
|
34
|
+
}
|
|
35
|
+
if (li.length == 1) {
|
|
36
|
+
li = li[0].split("。");
|
|
37
|
+
}
|
|
38
|
+
return partition(li, await seg(chat, li), (i) =>
|
|
39
|
+
repartition(chat, li.length)(i),
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
42
|
|
|
43
43
|
export default async (chat, txt) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
44
|
+
const li = txtLi(txt);
|
|
45
|
+
return partition(li, await seg(chat, li), repartition(chat, li.length));
|
|
46
|
+
};
|
package/seg.js
CHANGED
|
@@ -20,15 +20,11 @@ export default async(chat, txt_li) => {
|
|
|
20
20
|
type: TYPE.STRING
|
|
21
21
|
},
|
|
22
22
|
行: {
|
|
23
|
-
description: '
|
|
23
|
+
description: '该章最后一行的行号',
|
|
24
24
|
type: TYPE.INTEGER
|
|
25
|
-
},
|
|
26
|
-
文: {
|
|
27
|
-
description: '该章首行提问的原文',
|
|
28
|
-
type: TYPE.STRING
|
|
29
25
|
}
|
|
30
26
|
},
|
|
31
|
-
required: ['题', '行'
|
|
27
|
+
required: ['题', '行']
|
|
32
28
|
}
|
|
33
29
|
}, '你是专业资深的秘书'));
|
|
34
30
|
return split_li.map((i) => {
|