@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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=templateParser.test.d.ts.map
@@ -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;AAE3D,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;IA2G5C,OAAO,CAAC,cAAc;CAQvB"}
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"}
@@ -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 = this.findAllIndexes(template, "{{");
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] + 2;
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 args = content.split(" ");
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 + 2;
159
+ nextTemplateIndexForPrompt = end;
171
160
  }
172
161
  });
173
162
  }
@@ -0,0 +1,6 @@
1
+ export default function templateParser(template: string): {
2
+ type: string;
3
+ name: string;
4
+ params: Record<string, number | string | string[]>;
5
+ };
6
+ //# sourceMappingURL=templateParser.d.ts.map
@@ -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,GAC9B,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,CAAC,GAC9B,cAAc,CAAC,MAAM,CAAC;CAkB1B"}
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, _b;
83
+ var _a;
84
84
  return __asyncGenerator(this, arguments, function* generateString_1() {
85
- var _c, e_1, _d, _e;
86
- const stream = yield __await(this.openai.completions.create(Object.assign(Object.assign(Object.assign({}, this.defaultCompletionParams), options), { stop: [
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 _f = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield __await(stream_1.next()), _c = stream_1_1.done, !_c; _f = true) {
93
- _e = stream_1_1.value;
94
- _f = false;
95
- const chunk = _e;
96
- result += (_b = chunk.choices[0]) === null || _b === void 0 ? void 0 : _b.text;
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 (!_f && !_c && (_d = stream_1.return)) yield __await(_d.call(stream_1));
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.10.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": "73073416020c05b15d4f58805fe914743e7ffd6e"
42
+ "gitHead": "9395167ca79f0cdc5394fbb037f4354fafb5357d"
43
43
  }