@polka-codes/core 0.10.11 → 0.10.16
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/Agent/backoff.d.ts +7 -0
- package/dist/Agent/backoff.js +21 -0
- package/dist/Agent/backoff.js.map +1 -0
- package/dist/Agent/index.d.ts +2 -0
- package/dist/Agent/index.js +3 -0
- package/dist/Agent/index.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.d.ts +8 -0
- package/dist/Agent/parseJsonFromMarkdown.js +34 -0
- package/dist/Agent/parseJsonFromMarkdown.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.d.ts +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js +70 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js.map +1 -0
- package/dist/Agent/prompts.d.ts +9 -0
- package/dist/Agent/prompts.js +107 -0
- package/dist/Agent/prompts.js.map +1 -0
- package/dist/UsageMeter.d.ts +101 -0
- package/dist/UsageMeter.js +299 -0
- package/dist/UsageMeter.js.map +1 -0
- package/dist/UsageMeter.test.d.ts +4 -0
- package/dist/UsageMeter.test.js +556 -0
- package/dist/UsageMeter.test.js.map +1 -0
- package/dist/config/base.d.ts +68 -0
- package/dist/config/base.js +56 -0
- package/dist/config/base.js.map +1 -0
- package/dist/config/memory.d.ts +24 -0
- package/dist/config/memory.js +36 -0
- package/dist/config/memory.js.map +1 -0
- package/dist/config.d.ts +236 -0
- package/dist/config.js +184 -0
- package/dist/config.js.map +1 -0
- package/dist/errors/base.d.ts +31 -0
- package/dist/errors/base.js +60 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/fs/index.d.ts +2 -0
- package/dist/fs/index.js +3 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/node-provider.d.ts +16 -0
- package/dist/fs/node-provider.js +47 -0
- package/dist/fs/node-provider.js.map +1 -0
- package/dist/fs/provider.d.ts +61 -0
- package/dist/fs/provider.js +3 -0
- package/dist/fs/provider.js.map +1 -0
- package/dist/index.d.ts +20 -191
- package/dist/index.js +21 -4123
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +136 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/path.d.ts +9 -0
- package/dist/path.js +68 -0
- package/dist/path.js.map +1 -0
- package/dist/path.test.d.ts +1 -0
- package/dist/path.test.js +82 -0
- package/dist/path.test.js.map +1 -0
- package/dist/pricing/converter.d.ts +6 -0
- package/dist/pricing/converter.js +13 -0
- package/dist/pricing/converter.js.map +1 -0
- package/dist/pricing/converter.test.d.ts +1 -0
- package/dist/pricing/converter.test.js +54 -0
- package/dist/pricing/converter.test.js.map +1 -0
- package/dist/pricing/index.d.ts +2 -0
- package/dist/pricing/index.js +2 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/portkey-client.d.ts +2 -0
- package/dist/pricing/portkey-client.js +57 -0
- package/dist/pricing/portkey-client.js.map +1 -0
- package/dist/pricing/pricing-service.d.ts +6 -0
- package/dist/pricing/pricing-service.js +125 -0
- package/dist/pricing/pricing-service.js.map +1 -0
- package/dist/pricing/pricing-service.test.d.ts +1 -0
- package/dist/pricing/pricing-service.test.js +141 -0
- package/dist/pricing/pricing-service.test.js.map +1 -0
- package/dist/pricing/types.d.ts +24 -0
- package/dist/pricing/types.js +2 -0
- package/dist/pricing/types.js.map +1 -0
- package/dist/skills/__tests__/discovery.test.d.ts +1 -0
- package/dist/skills/__tests__/discovery.test.js +254 -0
- package/dist/skills/__tests__/discovery.test.js.map +1 -0
- package/dist/skills/__tests__/validation.test.d.ts +1 -0
- package/dist/skills/__tests__/validation.test.js +221 -0
- package/dist/skills/__tests__/validation.test.js.map +1 -0
- package/dist/skills/constants.d.ts +32 -0
- package/dist/skills/constants.js +50 -0
- package/dist/skills/constants.js.map +1 -0
- package/dist/skills/discovery.d.ts +56 -0
- package/dist/skills/discovery.js +392 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/tools/index.d.ts +3 -0
- package/dist/skills/tools/index.js +5 -0
- package/dist/skills/tools/index.js.map +1 -0
- package/dist/skills/tools/listSkills.d.ts +54 -0
- package/dist/skills/tools/listSkills.js +52 -0
- package/dist/skills/tools/listSkills.js.map +1 -0
- package/dist/skills/tools/loadSkill.d.ts +52 -0
- package/dist/skills/tools/loadSkill.js +86 -0
- package/dist/skills/tools/loadSkill.js.map +1 -0
- package/dist/skills/tools/readSkillFile.d.ts +43 -0
- package/dist/skills/tools/readSkillFile.js +68 -0
- package/dist/skills/tools/readSkillFile.js.map +1 -0
- package/dist/skills/types.d.ts +83 -0
- package/dist/skills/types.js +42 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validation.d.ts +30 -0
- package/dist/skills/validation.js +133 -0
- package/dist/skills/validation.js.map +1 -0
- package/dist/tool.d.ts +51 -0
- package/dist/tool.js +2 -0
- package/dist/tool.js.map +1 -0
- package/dist/tools/askFollowupQuestion.d.ts +35 -0
- package/dist/tools/askFollowupQuestion.js +105 -0
- package/dist/tools/askFollowupQuestion.js.map +1 -0
- package/dist/tools/askFollowupQuestion.test.d.ts +1 -0
- package/dist/tools/askFollowupQuestion.test.js +80 -0
- package/dist/tools/askFollowupQuestion.test.js.map +1 -0
- package/dist/tools/executeCommand.d.ts +29 -0
- package/dist/tools/executeCommand.js +82 -0
- package/dist/tools/executeCommand.js.map +1 -0
- package/dist/tools/executeCommand.test.d.ts +1 -0
- package/dist/tools/executeCommand.test.js +60 -0
- package/dist/tools/executeCommand.test.js.map +1 -0
- package/dist/tools/fetchUrl.d.ts +26 -0
- package/dist/tools/fetchUrl.js +85 -0
- package/dist/tools/fetchUrl.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listFiles.d.ts +35 -0
- package/dist/tools/listFiles.js +61 -0
- package/dist/tools/listFiles.js.map +1 -0
- package/dist/tools/listFiles.test.d.ts +1 -0
- package/dist/tools/listFiles.test.js +59 -0
- package/dist/tools/listFiles.test.js.map +1 -0
- package/dist/tools/provider.d.ts +76 -0
- package/dist/tools/provider.js +60 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/readBinaryFile.d.ts +26 -0
- package/dist/tools/readBinaryFile.js +52 -0
- package/dist/tools/readBinaryFile.js.map +1 -0
- package/dist/tools/readFile.d.ts +35 -0
- package/dist/tools/readFile.js +128 -0
- package/dist/tools/readFile.js.map +1 -0
- package/dist/tools/readFile.test.d.ts +1 -0
- package/dist/tools/readFile.test.js +37 -0
- package/dist/tools/readFile.test.js.map +1 -0
- package/dist/tools/removeFile.d.ts +26 -0
- package/dist/tools/removeFile.js +49 -0
- package/dist/tools/removeFile.js.map +1 -0
- package/dist/tools/removeFile.test.d.ts +1 -0
- package/dist/tools/removeFile.test.js +32 -0
- package/dist/tools/removeFile.test.js.map +1 -0
- package/dist/tools/renameFile.d.ts +29 -0
- package/dist/tools/renameFile.js +48 -0
- package/dist/tools/renameFile.js.map +1 -0
- package/dist/tools/renameFile.test.d.ts +1 -0
- package/dist/tools/renameFile.test.js +53 -0
- package/dist/tools/renameFile.test.js.map +1 -0
- package/dist/tools/replaceInFile.d.ts +29 -0
- package/dist/tools/replaceInFile.js +233 -0
- package/dist/tools/replaceInFile.js.map +1 -0
- package/dist/tools/replaceInFile.test.d.ts +1 -0
- package/dist/tools/replaceInFile.test.js +79 -0
- package/dist/tools/replaceInFile.test.js.map +1 -0
- package/dist/tools/response-builders.d.ts +64 -0
- package/dist/tools/response-builders.js +88 -0
- package/dist/tools/response-builders.js.map +1 -0
- package/dist/tools/search.d.ts +26 -0
- package/dist/tools/search.js +56 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/search.test.d.ts +1 -0
- package/dist/tools/search.test.js +22 -0
- package/dist/tools/search.test.js.map +1 -0
- package/dist/tools/searchFiles.d.ts +32 -0
- package/dist/tools/searchFiles.js +86 -0
- package/dist/tools/searchFiles.js.map +1 -0
- package/dist/tools/todo.d.ts +37 -0
- package/dist/tools/todo.js +41 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/utils/index.d.ts +1 -0
- package/dist/tools/utils/index.js +2 -0
- package/dist/tools/utils/index.js.map +1 -0
- package/dist/tools/utils/replaceInFile.d.ts +7 -0
- package/dist/tools/utils/replaceInFile.js +133 -0
- package/dist/tools/utils/replaceInFile.js.map +1 -0
- package/dist/tools/utils/replaceInFile.test.d.ts +1 -0
- package/dist/tools/utils/replaceInFile.test.js +308 -0
- package/dist/tools/utils/replaceInFile.test.js.map +1 -0
- package/dist/tools/utils.d.ts +10 -0
- package/dist/tools/utils.js +27 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/writeToFile.d.ts +29 -0
- package/dist/tools/writeToFile.js +85 -0
- package/dist/tools/writeToFile.js.map +1 -0
- package/dist/tools/writeToFile.test.d.ts +1 -0
- package/dist/tools/writeToFile.test.js +46 -0
- package/dist/tools/writeToFile.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge.d.ts +26 -0
- package/dist/utils/merge.js +45 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/workflow/agent.workflow.d.ts +39 -0
- package/dist/workflow/agent.workflow.js +166 -0
- package/dist/workflow/agent.workflow.js.map +1 -0
- package/dist/workflow/agent.workflow.test.d.ts +1 -0
- package/dist/workflow/agent.workflow.test.js +175 -0
- package/dist/workflow/agent.workflow.test.js.map +1 -0
- package/dist/workflow/control-flow.test.d.ts +1 -0
- package/dist/workflow/control-flow.test.js +323 -0
- package/dist/workflow/control-flow.test.js.map +1 -0
- package/dist/workflow/dynamic-edge-cases.test.d.ts +1 -0
- package/dist/workflow/dynamic-edge-cases.test.js +486 -0
- package/dist/workflow/dynamic-edge-cases.test.js.map +1 -0
- package/dist/workflow/dynamic-types.d.ts +124 -0
- package/dist/workflow/dynamic-types.js +105 -0
- package/dist/workflow/dynamic-types.js.map +1 -0
- package/dist/workflow/dynamic.d.ts +118 -0
- package/dist/workflow/dynamic.js +999 -0
- package/dist/workflow/dynamic.js.map +1 -0
- package/dist/workflow/index.d.ts +6 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/json-ai-types.d.ts +122 -0
- package/dist/workflow/json-ai-types.js +144 -0
- package/dist/workflow/json-ai-types.js.map +1 -0
- package/dist/workflow/json-schema-conversion.test.d.ts +1 -0
- package/dist/workflow/json-schema-conversion.test.js +371 -0
- package/dist/workflow/json-schema-conversion.test.js.map +1 -0
- package/dist/workflow/try-catch.test.d.ts +1 -0
- package/dist/workflow/try-catch.test.js +443 -0
- package/dist/workflow/try-catch.test.js.map +1 -0
- package/dist/workflow/types.d.ts +103 -0
- package/dist/workflow/types.js +17 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/workflow.d.ts +29 -0
- package/dist/workflow/workflow.js +57 -0
- package/dist/workflow/workflow.js.map +1 -0
- package/dist/workflow/workflow.test.d.ts +1 -0
- package/dist/workflow/workflow.test.js +189 -0
- package/dist/workflow/workflow.test.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility to compute exponential backoff delays for rate-limit handling. generated by polka.codes
|
|
3
|
+
*
|
|
4
|
+
* The backoff starts at baseSeconds and doubles each time, capped at capSeconds.
|
|
5
|
+
* Example with base=2, cap=60: 2, 4, 8, 16, 32, 60, 60, ...
|
|
6
|
+
*/
|
|
7
|
+
export declare function computeRateLimitBackoffSeconds(count: number, baseSeconds?: number, capSeconds?: number): number;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility to compute exponential backoff delays for rate-limit handling. generated by polka.codes
|
|
3
|
+
*
|
|
4
|
+
* The backoff starts at baseSeconds and doubles each time, capped at capSeconds.
|
|
5
|
+
* Example with base=2, cap=60: 2, 4, 8, 16, 32, 60, 60, ...
|
|
6
|
+
*/
|
|
7
|
+
export function computeRateLimitBackoffSeconds(count, baseSeconds = 2, capSeconds = 60) {
|
|
8
|
+
if (!Number.isFinite(count) || count <= 0) {
|
|
9
|
+
// Treat non-positive or invalid counts as first occurrence
|
|
10
|
+
count = 1;
|
|
11
|
+
}
|
|
12
|
+
if (!Number.isFinite(baseSeconds) || baseSeconds <= 0) {
|
|
13
|
+
baseSeconds = 2;
|
|
14
|
+
}
|
|
15
|
+
if (!Number.isFinite(capSeconds) || capSeconds <= 0) {
|
|
16
|
+
capSeconds = 60;
|
|
17
|
+
}
|
|
18
|
+
const delay = baseSeconds * 2 ** (count - 1);
|
|
19
|
+
return Math.min(delay, capSeconds);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/Agent/backoff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAAC,KAAa,EAAE,WAAW,GAAG,CAAC,EAAE,UAAU,GAAG,EAAE;IAC5F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,2DAA2D;QAC3D,KAAK,GAAG,CAAC,CAAA;IACX,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACtD,WAAW,GAAG,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpD,UAAU,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Agent/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const parseJsonFromMarkdown = (markdown) => {
|
|
2
|
+
const jsonRegex = /```(?:json)?\n([\s\S]*?)\n```/;
|
|
3
|
+
const match = markdown.match(jsonRegex);
|
|
4
|
+
const tryParse = (str) => {
|
|
5
|
+
try {
|
|
6
|
+
let parsed = JSON.parse(str);
|
|
7
|
+
// The model sometimes returns a stringified JSON object within the JSON.
|
|
8
|
+
if (typeof parsed === 'string') {
|
|
9
|
+
try {
|
|
10
|
+
parsed = JSON.parse(parsed);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// ignore if the inner string is not a valid JSON
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return { success: true, data: parsed };
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
const error = e instanceof Error ? e.message : String(e);
|
|
20
|
+
return { success: false, error: `Failed to parse JSON: ${error}` };
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
if (match?.[1]) {
|
|
24
|
+
const content = match[1].trim();
|
|
25
|
+
return tryParse(content);
|
|
26
|
+
}
|
|
27
|
+
// Fallback for cases where the output is just the JSON string without markdown fences
|
|
28
|
+
const parseResult = tryParse(markdown);
|
|
29
|
+
if (parseResult.success) {
|
|
30
|
+
return parseResult;
|
|
31
|
+
}
|
|
32
|
+
return { success: false, error: 'No JSON object found in the string.' };
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=parseJsonFromMarkdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseJsonFromMarkdown.js","sourceRoot":"","sources":["../../src/Agent/parseJsonFromMarkdown.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAA0B,EAAE;IAChF,MAAM,SAAS,GAAG,+BAA+B,CAAA;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEvC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC5B,yEAAyE;YACzE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,iDAAiD;gBACnD,CAAC;YACH,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAW,CAAA;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,KAAK,EAAE,EAAW,CAAA;QAC7E,CAAC;IACH,CAAC,CAAA;IAED,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,sFAAsF;IACtF,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACtC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAW,CAAA;AAClF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// generated by polka.codes
|
|
2
|
+
import { describe, expect, it } from 'bun:test';
|
|
3
|
+
import { parseJsonFromMarkdown } from './parseJsonFromMarkdown';
|
|
4
|
+
describe('parseJsonFromMarkdown', () => {
|
|
5
|
+
it('should parse JSON from a markdown code block', () => {
|
|
6
|
+
const markdown = 'Here is the JSON:\n\n```json\n{"key":"value"}\n```';
|
|
7
|
+
expect(parseJsonFromMarkdown(markdown)).toEqual({
|
|
8
|
+
success: true,
|
|
9
|
+
data: { key: 'value' },
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
it('should return an error if no JSON object is found', () => {
|
|
13
|
+
const markdown = 'This is just a string.';
|
|
14
|
+
expect(parseJsonFromMarkdown(markdown)).toEqual({
|
|
15
|
+
success: false,
|
|
16
|
+
error: 'No JSON object found in the string.',
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
it('should handle JSON without markdown fences', () => {
|
|
20
|
+
const json = '{"key":"value"}';
|
|
21
|
+
expect(parseJsonFromMarkdown(json)).toEqual({
|
|
22
|
+
success: true,
|
|
23
|
+
data: { key: 'value' },
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it('should return an error for malformed JSON in a code block', () => {
|
|
27
|
+
const markdown = '```json\n{"key":"value",,}\n```';
|
|
28
|
+
const result = parseJsonFromMarkdown(markdown);
|
|
29
|
+
expect(result.success).toBe(false);
|
|
30
|
+
if (!result.success) {
|
|
31
|
+
expect(result.error).toMatch(/Failed to parse JSON/);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it('should parse JSON from a markdown code block without the json identifier', () => {
|
|
35
|
+
const markdown = 'Here is the JSON:\n\n```\n{"key":"value"}\n```';
|
|
36
|
+
expect(parseJsonFromMarkdown(markdown)).toEqual({
|
|
37
|
+
success: true,
|
|
38
|
+
data: { key: 'value' },
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it('should parse an escaped JSON string from a markdown code block', () => {
|
|
42
|
+
const markdown = '```json\n"{\\"key\\":\\"value\\"}"\n```';
|
|
43
|
+
expect(parseJsonFromMarkdown(markdown)).toEqual({
|
|
44
|
+
success: true,
|
|
45
|
+
data: { key: 'value' },
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
it('should parse an escaped JSON string from a markdown code block without the json identifier', () => {
|
|
49
|
+
const markdown = '```\n"{\\"key\\":\\"value\\"}"\n```';
|
|
50
|
+
expect(parseJsonFromMarkdown(markdown)).toEqual({
|
|
51
|
+
success: true,
|
|
52
|
+
data: { key: 'value' },
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
it('should parse a JSON array from a markdown code block', () => {
|
|
56
|
+
const markdown = '```json\n[{"key":"value"}]\n```';
|
|
57
|
+
expect(parseJsonFromMarkdown(markdown)).toEqual({
|
|
58
|
+
success: true,
|
|
59
|
+
data: [{ key: 'value' }],
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
it('should parse a JSON array from a markdown code block without the json identifier', () => {
|
|
63
|
+
const markdown = '```\n[{"key":"value"}]\n```';
|
|
64
|
+
expect(parseJsonFromMarkdown(markdown)).toEqual({
|
|
65
|
+
success: true,
|
|
66
|
+
data: [{ key: 'value' }],
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=parseJsonFromMarkdown.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseJsonFromMarkdown.test.js","sourceRoot":"","sources":["../../src/Agent/parseJsonFromMarkdown.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LanguageModelV3ToolResultOutput } from '@ai-sdk/provider';
|
|
2
|
+
import type { FilePart, ImagePart, TextPart } from 'ai';
|
|
3
|
+
export declare const responsePrompts: {
|
|
4
|
+
readonly errorInvokeTool: (tool: string, error: unknown) => string;
|
|
5
|
+
readonly requireUseTool: "Error: No tool use detected. You MUST use a tool before proceeding.\ne.g. <tool_tool_name>tool_name</tool_tool_name>\n\nEnsure the opening and closing tags are correctly nested and closed, and that you are using the correct tool name.\nAvoid unnecessary text or symbols before or after the tool use.\nAvoid unnecessary escape characters or special characters.\n";
|
|
6
|
+
readonly requireUseToolNative: "Error: No tool use detected. You MUST use a tool before proceeding.\n";
|
|
7
|
+
readonly toolResults: (tool: string, result: LanguageModelV3ToolResultOutput) => Array<TextPart | ImagePart | FilePart>;
|
|
8
|
+
readonly commandResult: (command: string, exitCode: number, stdout: string, stderr: string) => string;
|
|
9
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const NO_REASON_PROVIDED = 'No reason provided';
|
|
2
|
+
export const responsePrompts = {
|
|
3
|
+
errorInvokeTool: (tool, error) => `An error occurred while invoking the tool "${tool}": ${error}`,
|
|
4
|
+
requireUseTool: `Error: No tool use detected. You MUST use a tool before proceeding.
|
|
5
|
+
e.g. <tool_tool_name>tool_name</tool_tool_name>
|
|
6
|
+
|
|
7
|
+
Ensure the opening and closing tags are correctly nested and closed, and that you are using the correct tool name.
|
|
8
|
+
Avoid unnecessary text or symbols before or after the tool use.
|
|
9
|
+
Avoid unnecessary escape characters or special characters.
|
|
10
|
+
`,
|
|
11
|
+
requireUseToolNative: `Error: No tool use detected. You MUST use a tool before proceeding.
|
|
12
|
+
`,
|
|
13
|
+
toolResults: (tool, result) => {
|
|
14
|
+
switch (result.type) {
|
|
15
|
+
case 'text':
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
type: 'text',
|
|
19
|
+
text: `<tool_response name=${tool}>${result.value}</tool_response>`,
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
case 'error-text':
|
|
23
|
+
return [
|
|
24
|
+
{
|
|
25
|
+
type: 'text',
|
|
26
|
+
text: `<tool_response_error name=${tool}>${result.value}</tool_response_error>`,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
case 'json':
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
type: 'text',
|
|
33
|
+
text: `<tool_response_json name=${tool}>${JSON.stringify(result.value)}</tool_response_json>`,
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
case 'error-json':
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
type: 'text',
|
|
40
|
+
text: `<tool_response_error_json name=${tool}>${JSON.stringify(result.value)}</tool_response_error_json>`,
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
case 'content':
|
|
44
|
+
return [
|
|
45
|
+
{
|
|
46
|
+
type: 'text',
|
|
47
|
+
text: `<tool_response name=${tool}>`,
|
|
48
|
+
},
|
|
49
|
+
...result.value.map((part) => {
|
|
50
|
+
// Handle text parts directly
|
|
51
|
+
if (part.type === 'text') {
|
|
52
|
+
return part;
|
|
53
|
+
}
|
|
54
|
+
// Handle image-data parts
|
|
55
|
+
if ('mediaType' in part && 'data' in part && part.mediaType.startsWith('image/')) {
|
|
56
|
+
return {
|
|
57
|
+
type: 'image',
|
|
58
|
+
mediaType: part.mediaType,
|
|
59
|
+
image: part.data,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Handle file-data parts
|
|
63
|
+
if ('mediaType' in part && 'data' in part) {
|
|
64
|
+
return {
|
|
65
|
+
type: 'file',
|
|
66
|
+
mediaType: part.mediaType,
|
|
67
|
+
data: part.data,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Fallback for URL-based and other part types
|
|
71
|
+
return {
|
|
72
|
+
type: 'text',
|
|
73
|
+
text: JSON.stringify(part),
|
|
74
|
+
};
|
|
75
|
+
}),
|
|
76
|
+
{
|
|
77
|
+
type: 'text',
|
|
78
|
+
text: '</tool_response>',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
case 'execution-denied':
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: `<tool_response_error name=${tool}>Execution denied: ${result.reason ?? NO_REASON_PROVIDED}</tool_response_error>`,
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
default: {
|
|
89
|
+
return [
|
|
90
|
+
{
|
|
91
|
+
type: 'text',
|
|
92
|
+
text: `<tool_response_error name=${tool}>Unknown result type: ${JSON.stringify(result)}</tool_response_error>`,
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
commandResult: (command, exitCode, stdout, stderr) => `<command>${command}</command>
|
|
99
|
+
<command_exit_code>${exitCode}</command_exit_code>
|
|
100
|
+
<command_stdout>
|
|
101
|
+
${stdout}
|
|
102
|
+
</command_stdout>
|
|
103
|
+
<command_stderr>
|
|
104
|
+
${stderr}
|
|
105
|
+
</command_stderr>`,
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/Agent/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UsageMeter class for tracking API usage metrics
|
|
3
|
+
* Generated by polka.codes
|
|
4
|
+
*/
|
|
5
|
+
import type { LanguageModelV3, LanguageModelV3Usage } from '@ai-sdk/provider';
|
|
6
|
+
import type { LanguageModelUsage } from 'ai';
|
|
7
|
+
import type { PricingService } from './pricing/index';
|
|
8
|
+
export type ModelInfo = {
|
|
9
|
+
inputPrice: number;
|
|
10
|
+
outputPrice: number;
|
|
11
|
+
cacheWritesPrice: number;
|
|
12
|
+
cacheReadsPrice: number;
|
|
13
|
+
};
|
|
14
|
+
type Totals = {
|
|
15
|
+
input: number;
|
|
16
|
+
output: number;
|
|
17
|
+
cachedRead: number;
|
|
18
|
+
cost: number;
|
|
19
|
+
messageCount: number;
|
|
20
|
+
};
|
|
21
|
+
type ProviderMetadataEntry = {
|
|
22
|
+
provider: string;
|
|
23
|
+
model: string;
|
|
24
|
+
metadata: Record<string, unknown>;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Tracks token / cost usage across any mix of LLM models.
|
|
29
|
+
* Supports optional caps on total messages and total cost.
|
|
30
|
+
*/
|
|
31
|
+
export declare class UsageMeter {
|
|
32
|
+
#private;
|
|
33
|
+
constructor(modelInfos?: Record<string, Record<string, Partial<ModelInfo>>>, opts?: {
|
|
34
|
+
maxMessages?: number;
|
|
35
|
+
maxCost?: number;
|
|
36
|
+
pricingService?: PricingService;
|
|
37
|
+
});
|
|
38
|
+
addUsage(llm: LanguageModelV3, resp: {
|
|
39
|
+
usage: LanguageModelV3Usage;
|
|
40
|
+
providerMetadata?: Record<string, unknown>;
|
|
41
|
+
} | {
|
|
42
|
+
totalUsage: LanguageModelV3Usage;
|
|
43
|
+
providerMetadata?: Record<string, unknown>;
|
|
44
|
+
} | {
|
|
45
|
+
totalUsage: LanguageModelUsage;
|
|
46
|
+
providerMetadata?: Record<string, unknown>;
|
|
47
|
+
}, options?: {
|
|
48
|
+
modelInfo?: ModelInfo;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
/** Override the running totals (e.g., restore from saved state). */
|
|
51
|
+
setUsage(newUsage: Partial<Totals>, options?: {
|
|
52
|
+
clearMetadata?: boolean;
|
|
53
|
+
}): void;
|
|
54
|
+
/** Manually bump the message count (useful if you record some messages without token info). */
|
|
55
|
+
incrementMessageCount(n?: number): void;
|
|
56
|
+
/** Reset the running totals. */
|
|
57
|
+
resetUsage(): void;
|
|
58
|
+
/** Return true once either messages or cost exceed the configured caps. */
|
|
59
|
+
isLimitExceeded(): {
|
|
60
|
+
messageCount: boolean;
|
|
61
|
+
maxMessages: number;
|
|
62
|
+
cost: boolean;
|
|
63
|
+
maxCost: number;
|
|
64
|
+
result: boolean;
|
|
65
|
+
};
|
|
66
|
+
/** Same as isLimitExceeded but throws an error if a limit is hit. */
|
|
67
|
+
checkLimit(): void;
|
|
68
|
+
/** Getter for the aggregated totals (immutable copy). */
|
|
69
|
+
get usage(): {
|
|
70
|
+
input: number;
|
|
71
|
+
output: number;
|
|
72
|
+
cachedRead: number;
|
|
73
|
+
cost: number;
|
|
74
|
+
messageCount: number;
|
|
75
|
+
};
|
|
76
|
+
/** Getter for provider metadata entries (immutable copy). */
|
|
77
|
+
get providerMetadata(): ProviderMetadataEntry[];
|
|
78
|
+
/** Calculate cache statistics from stored metadata entries. */
|
|
79
|
+
get cacheStats(): {
|
|
80
|
+
totalCachedTokens: number;
|
|
81
|
+
totalRequests: number;
|
|
82
|
+
requestsWithCache: number;
|
|
83
|
+
cacheHitRate: number;
|
|
84
|
+
entries: ProviderMetadataEntry[];
|
|
85
|
+
};
|
|
86
|
+
/** Clear stored provider metadata entries. */
|
|
87
|
+
clearProviderMetadata(): void;
|
|
88
|
+
/** Merge another UsageMeter's totals into this one. */
|
|
89
|
+
merge(other: UsageMeter): void;
|
|
90
|
+
/** Wait for all pending usage updates to complete. */
|
|
91
|
+
waitForPending(): Promise<void>;
|
|
92
|
+
getUsageText(): string;
|
|
93
|
+
onFinishHandler(llm: LanguageModelV3): (evt: {
|
|
94
|
+
totalUsage: LanguageModelUsage;
|
|
95
|
+
providerMetadata?: Record<string, unknown>;
|
|
96
|
+
} | {
|
|
97
|
+
totalUsage: LanguageModelV3Usage;
|
|
98
|
+
providerMetadata?: Record<string, unknown>;
|
|
99
|
+
}) => Promise<void>;
|
|
100
|
+
}
|
|
101
|
+
export {};
|