@mikugg/guidance 0.10.0 → 0.12.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/dist/lib/__test__/templateParser.test.d.ts +2 -0
- package/dist/lib/__test__/templateParser.test.d.ts.map +1 -0
- package/dist/lib/__test__/templateParser.test.js +73 -0
- package/dist/lib/template.d.ts.map +1 -1
- package/dist/lib/template.js +10 -21
- package/dist/lib/templateParser.d.ts +6 -0
- package/dist/lib/templateParser.d.ts.map +1 -0
- package/dist/lib/templateParser.js +43 -0
- package/dist/lib/token-generator.d.ts +2 -2
- package/dist/lib/token-generator.d.ts.map +1 -1
- package/dist/lib/token-generator.js +9 -12
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateParser.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__test__/templateParser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const templateParser_1 = __importDefault(require("../templateParser")); // Adjust the import path as needed
|
|
7
|
+
describe("extractGenParams", () => {
|
|
8
|
+
it("extracts simple parameters correctly", () => {
|
|
9
|
+
const template = `some text{{GEN example max_tokens=2000 stop=["End"]}}some other text`;
|
|
10
|
+
expect((0, templateParser_1.default)(template)).toEqual({
|
|
11
|
+
name: "example",
|
|
12
|
+
params: {
|
|
13
|
+
max_tokens: 2000,
|
|
14
|
+
stop: ["End"],
|
|
15
|
+
},
|
|
16
|
+
type: "GEN",
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
it("handles multiple parameters and array values", () => {
|
|
20
|
+
const template = `{{GEN complex max_tokens=3000 stop=["\\nExit:", "\\nAnon:"]}}`;
|
|
21
|
+
console.log((0, templateParser_1.default)(template));
|
|
22
|
+
expect((0, templateParser_1.default)(template)).toEqual({
|
|
23
|
+
type: "GEN",
|
|
24
|
+
name: "complex",
|
|
25
|
+
params: {
|
|
26
|
+
max_tokens: 3000,
|
|
27
|
+
stop: ["\nExit:", "\nAnon:"],
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it("returns null for a string without GEN pattern", () => {
|
|
32
|
+
const template = `some regular text without GEN`;
|
|
33
|
+
expect((0, templateParser_1.default)(template)).toEqual({
|
|
34
|
+
type: "",
|
|
35
|
+
name: "",
|
|
36
|
+
params: {},
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it("handles the SEL pattern with options parameter", () => {
|
|
40
|
+
const template = `{{SEL choice options=SomeConstantName}}`;
|
|
41
|
+
expect((0, templateParser_1.default)(template)).toEqual({
|
|
42
|
+
type: "SEL",
|
|
43
|
+
name: "choice",
|
|
44
|
+
params: {
|
|
45
|
+
options: "SomeConstantName",
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it("extracts multiple parameters including strings, numbers, and arrays", () => {
|
|
50
|
+
const template = `{{GEN multiParam type="stringType" count=10 flags=["flag1", "flag2"]}}`;
|
|
51
|
+
expect((0, templateParser_1.default)(template)).toEqual({
|
|
52
|
+
type: "GEN",
|
|
53
|
+
name: "multiParam",
|
|
54
|
+
params: {
|
|
55
|
+
type: "stringType",
|
|
56
|
+
count: 10,
|
|
57
|
+
flags: ["flag1", "flag2"],
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
it("handles complex parameters in SEL pattern", () => {
|
|
62
|
+
const template = `{{SEL complexChoice options=ComplexOptions max_selections=3 custom_flag="enabled"}}`;
|
|
63
|
+
expect((0, templateParser_1.default)(template)).toEqual({
|
|
64
|
+
type: "SEL",
|
|
65
|
+
name: "complexChoice",
|
|
66
|
+
params: {
|
|
67
|
+
options: "ComplexOptions",
|
|
68
|
+
max_selections: 3,
|
|
69
|
+
custom_flag: "enabled",
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/lib/template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/lib/template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,oBAAY,gBAAgB;IAC1B,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,SAAS,CAAyB;gBAE9B,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,sBAAsB;IAKpE,YAAY,CAAC,SAAS,EAAE,iBAAiB;IAIzC,YAAY,CAAC,SAAS,EAAE,sBAAsB;IAIxC,eAAe,CAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACxC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAYjB,qBAAqB,CACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACxC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;IAkG5C,OAAO,CAAC,cAAc;CAQvB"}
|
package/dist/lib/template.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
33
33
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
34
|
exports.TemplateProcessor = exports.TEMPLATE_METHODS = void 0;
|
|
35
35
|
const _trie_1 = __importDefault(require("./_trie"));
|
|
36
|
+
const templateParser_1 = __importDefault(require("./templateParser"));
|
|
36
37
|
var TEMPLATE_METHODS;
|
|
37
38
|
(function (TEMPLATE_METHODS) {
|
|
38
39
|
TEMPLATE_METHODS["SEL"] = "SEL";
|
|
@@ -80,24 +81,18 @@ class TemplateProcessor {
|
|
|
80
81
|
template = template.replace(new RegExp(`{{${key}}}`, "g"), value.toString());
|
|
81
82
|
});
|
|
82
83
|
// Replace {{method variableName methodArg1=methodArg1Value methodArg2=methodArg2Value}} in template
|
|
83
|
-
const indexes =
|
|
84
|
+
const indexes = [
|
|
85
|
+
...this.findAllIndexes(template, "{{GEN"),
|
|
86
|
+
...this.findAllIndexes(template, "{{SEL"),
|
|
87
|
+
].sort((a, b) => a - b);
|
|
84
88
|
let nextTemplateIndexForPrompt = 0;
|
|
85
89
|
let prompt = "";
|
|
86
90
|
for (let i = 0; i < indexes.length; i++) {
|
|
87
91
|
prompt += template.substring(nextTemplateIndexForPrompt, indexes[i]);
|
|
88
|
-
const start = indexes[i]
|
|
89
|
-
const end = template.substring(start).indexOf("}}") + start;
|
|
92
|
+
const start = indexes[i];
|
|
93
|
+
const end = template.substring(start).indexOf("}}") + 2 + start;
|
|
90
94
|
const content = template.substring(start, end);
|
|
91
|
-
const
|
|
92
|
-
const method = args[0];
|
|
93
|
-
const variableName = args[1];
|
|
94
|
-
const methodArgs = args
|
|
95
|
-
.slice(2)
|
|
96
|
-
.reduce((acc, arg) => {
|
|
97
|
-
const [key, value] = arg.split("=");
|
|
98
|
-
acc[key] = value;
|
|
99
|
-
return acc;
|
|
100
|
-
}, {});
|
|
95
|
+
const { type: method, name: variableName, params: methodArgs, } = (0, templateParser_1.default)(content);
|
|
101
96
|
let completion = "";
|
|
102
97
|
switch (method) {
|
|
103
98
|
case TEMPLATE_METHODS.GEN:
|
|
@@ -108,12 +103,6 @@ class TemplateProcessor {
|
|
|
108
103
|
_d = false;
|
|
109
104
|
const chunk = _c;
|
|
110
105
|
completion = chunk;
|
|
111
|
-
// Remove string after stop
|
|
112
|
-
if (methodArgs["stop"]) {
|
|
113
|
-
if (completion.indexOf(methodArgs["stop"]) >= 0) {
|
|
114
|
-
completion = completion.substring(0, completion.indexOf(methodArgs["stop"]));
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
106
|
result.set(variableName, completion);
|
|
118
107
|
yield yield __await(result);
|
|
119
108
|
}
|
|
@@ -129,7 +118,7 @@ class TemplateProcessor {
|
|
|
129
118
|
case TEMPLATE_METHODS.SEL:
|
|
130
119
|
const trie = new _trie_1.default();
|
|
131
120
|
// Get options from variables
|
|
132
|
-
const options = variables.get(methodArgs["options"]);
|
|
121
|
+
const options = variables.get(String(methodArgs["options"]));
|
|
133
122
|
if (!options) {
|
|
134
123
|
throw new Error(`${methodArgs["options"]} variable not found`);
|
|
135
124
|
}
|
|
@@ -167,7 +156,7 @@ class TemplateProcessor {
|
|
|
167
156
|
throw new Error(`Invalid method ${method} in template`);
|
|
168
157
|
}
|
|
169
158
|
prompt += completion;
|
|
170
|
-
nextTemplateIndexForPrompt = end
|
|
159
|
+
nextTemplateIndexForPrompt = end;
|
|
171
160
|
}
|
|
172
161
|
});
|
|
173
162
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateParser.d.ts","sourceRoot":"","sources":["../../src/lib/templateParser.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACpD,CAyCA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function templateParser(template) {
|
|
4
|
+
const patternRegex = /{{(GEN|SEL)\s+(\w+)\s+([^}]+)}}/;
|
|
5
|
+
const match = template.match(patternRegex);
|
|
6
|
+
if (!match) {
|
|
7
|
+
return { type: "", name: "", params: {} };
|
|
8
|
+
}
|
|
9
|
+
const type = match[1];
|
|
10
|
+
const name = match[2];
|
|
11
|
+
const paramsString = match[3];
|
|
12
|
+
// Updated regex to handle complex array values
|
|
13
|
+
const paramsRegex = /(\w+)=((?:"(?:\\"|[^"])*"|\[(?:\\.|[^\]])*\]|\w+)(?:,\s*)?)/g;
|
|
14
|
+
let paramMatch;
|
|
15
|
+
const params = {};
|
|
16
|
+
while ((paramMatch = paramsRegex.exec(paramsString)) !== null) {
|
|
17
|
+
const key = paramMatch[1];
|
|
18
|
+
const value = paramMatch[2].trim();
|
|
19
|
+
if (type === "SEL" && key === "options") {
|
|
20
|
+
params[key] = value;
|
|
21
|
+
}
|
|
22
|
+
else if (!isNaN(Number(value))) {
|
|
23
|
+
params[key] = Number(value);
|
|
24
|
+
}
|
|
25
|
+
else if (value.startsWith('["')) {
|
|
26
|
+
try {
|
|
27
|
+
params[key] = JSON.parse(value);
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
console.error("Error parsing JSON:", e);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
params[key] = value.replace(/^"|"$/g, "");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
type,
|
|
39
|
+
name,
|
|
40
|
+
params,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
exports.default = templateParser;
|
|
@@ -2,7 +2,7 @@ import { ClientOptions } from "openai";
|
|
|
2
2
|
import { CompletionCreateParams } from "openai/resources/completions.mjs";
|
|
3
3
|
export declare abstract class AbstractTokenGenerator {
|
|
4
4
|
abstract generateToken(prompt: string, logit_bias: Record<string, number>): Promise<string>;
|
|
5
|
-
abstract generateString(prompt: string, options: Record<string, string>): AsyncGenerator<string>;
|
|
5
|
+
abstract generateString(prompt: string, options: Record<string, number | string | string[]>): AsyncGenerator<string>;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* OpenAI Token Generator
|
|
@@ -18,6 +18,6 @@ export declare class OpenAITokenGenerator extends AbstractTokenGenerator {
|
|
|
18
18
|
baseURL?: string;
|
|
19
19
|
}, options?: ClientOptions, defaultCompletionParams?: CompletionCreateParams);
|
|
20
20
|
generateToken(prompt: string, logit_bias: Record<string, number>): Promise<string>;
|
|
21
|
-
generateString(prompt: string, options: Record<string, string>): AsyncGenerator<string>;
|
|
21
|
+
generateString(prompt: string, options: Record<string, string | number | string[]>): AsyncGenerator<string>;
|
|
22
22
|
}
|
|
23
23
|
//# sourceMappingURL=token-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-generator.d.ts","sourceRoot":"","sources":["../../src/lib/token-generator.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,8BAAsB,sBAAsB;IAC1C,QAAQ,CAAC,aAAa,CACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAClB,QAAQ,CAAC,cAAc,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"token-generator.d.ts","sourceRoot":"","sources":["../../src/lib/token-generator.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,8BAAsB,sBAAsB;IAC1C,QAAQ,CAAC,aAAa,CACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAClB,QAAQ,CAAC,cAAc,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,GAClD,cAAc,CAAC,MAAM,CAAC;CAC1B;AACD;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,uBAAuB,CAAC,CAAyB;gBAGvD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,EACD,OAAO,CAAC,EAAE,aAAa,EACvB,uBAAuB,CAAC,EAAE,sBAAsB;IAYnC,aAAa,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAwCF,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,GAClD,cAAc,CAAC,MAAM,CAAC;CAc1B"}
|
|
@@ -80,27 +80,24 @@ class OpenAITokenGenerator extends AbstractTokenGenerator {
|
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
generateString(prompt, options) {
|
|
83
|
-
var _a
|
|
83
|
+
var _a;
|
|
84
84
|
return __asyncGenerator(this, arguments, function* generateString_1() {
|
|
85
|
-
var
|
|
86
|
-
const stream = yield __await(this.openai.completions.create(Object.assign(Object.assign(Object.assign({}, this.defaultCompletionParams), options), {
|
|
87
|
-
...(((_a = this.defaultCompletionParams) === null || _a === void 0 ? void 0 : _a.stop) || []),
|
|
88
|
-
...(options.stop ? options.stop.split(",") : []),
|
|
89
|
-
], model: this.model, prompt, stream: true })));
|
|
85
|
+
var _b, e_1, _c, _d;
|
|
86
|
+
const stream = yield __await(this.openai.completions.create(Object.assign(Object.assign(Object.assign({}, this.defaultCompletionParams), options), { model: this.model, prompt, stream: true })));
|
|
90
87
|
let result = "";
|
|
91
88
|
try {
|
|
92
|
-
for (var
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const chunk =
|
|
96
|
-
result += (
|
|
89
|
+
for (var _e = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield __await(stream_1.next()), _b = stream_1_1.done, !_b; _e = true) {
|
|
90
|
+
_d = stream_1_1.value;
|
|
91
|
+
_e = false;
|
|
92
|
+
const chunk = _d;
|
|
93
|
+
result += (_a = chunk.choices[0]) === null || _a === void 0 ? void 0 : _a.text;
|
|
97
94
|
yield yield __await(result);
|
|
98
95
|
}
|
|
99
96
|
}
|
|
100
97
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
101
98
|
finally {
|
|
102
99
|
try {
|
|
103
|
-
if (!
|
|
100
|
+
if (!_e && !_b && (_c = stream_1.return)) yield __await(_c.call(stream_1));
|
|
104
101
|
}
|
|
105
102
|
finally { if (e_1) throw e_1.error; }
|
|
106
103
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikugg/guidance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -39,5 +39,5 @@
|
|
|
39
39
|
"ts-node": "^10.9.1",
|
|
40
40
|
"typescript": "^5.2.2"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "9395167ca79f0cdc5394fbb037f4354fafb5357d"
|
|
43
43
|
}
|