@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,MAAM,CAAA;AACpB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAClF,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './types';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory entry types
|
|
3
|
+
*/
|
|
4
|
+
export type MemoryEntry = {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
scope: string;
|
|
8
|
+
content: string;
|
|
9
|
+
entry_type: string;
|
|
10
|
+
status?: string;
|
|
11
|
+
priority?: 'low' | 'medium' | 'high' | 'critical';
|
|
12
|
+
tags?: string;
|
|
13
|
+
metadata?: string;
|
|
14
|
+
created_at: number;
|
|
15
|
+
updated_at: number;
|
|
16
|
+
last_accessed: number;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Memory query filters
|
|
20
|
+
*/
|
|
21
|
+
export type MemoryQuery = {
|
|
22
|
+
scope?: 'global' | 'project' | 'auto';
|
|
23
|
+
name?: string;
|
|
24
|
+
type?: string;
|
|
25
|
+
status?: string;
|
|
26
|
+
priority?: string;
|
|
27
|
+
tags?: string | string[];
|
|
28
|
+
search?: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
offset?: number;
|
|
31
|
+
sortBy?: 'created' | 'updated' | 'accessed' | 'name';
|
|
32
|
+
sortOrder?: 'asc' | 'desc';
|
|
33
|
+
createdAfter?: number;
|
|
34
|
+
createdBefore?: number;
|
|
35
|
+
updatedAfter?: number;
|
|
36
|
+
updatedBefore?: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Query options
|
|
40
|
+
*/
|
|
41
|
+
export type QueryOptions = {
|
|
42
|
+
operation?: 'select' | 'delete' | 'count';
|
|
43
|
+
includeMetadata?: boolean;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Memory operation for batch updates
|
|
47
|
+
*/
|
|
48
|
+
export type MemoryOperation = {
|
|
49
|
+
operation: 'append' | 'replace' | 'remove';
|
|
50
|
+
name: string;
|
|
51
|
+
content?: string;
|
|
52
|
+
metadata?: {
|
|
53
|
+
entry_type?: string;
|
|
54
|
+
status?: string;
|
|
55
|
+
priority?: string;
|
|
56
|
+
tags?: string;
|
|
57
|
+
metadata?: string;
|
|
58
|
+
created_at?: number;
|
|
59
|
+
updated_at?: number;
|
|
60
|
+
last_accessed?: number;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Database statistics
|
|
65
|
+
*/
|
|
66
|
+
export type DatabaseStats = {
|
|
67
|
+
totalEntries: number;
|
|
68
|
+
entriesByType: Record<string, number>;
|
|
69
|
+
databaseSize: number;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Memory Store Interface
|
|
73
|
+
*
|
|
74
|
+
* This interface defines the contract for memory store implementations.
|
|
75
|
+
* Implementations can use different storage backends (SQLite, PostgreSQL, Redis, etc.)
|
|
76
|
+
* while maintaining the same API for the core memory logic.
|
|
77
|
+
*/
|
|
78
|
+
export interface IMemoryStore {
|
|
79
|
+
/**
|
|
80
|
+
* Read memory by topic name
|
|
81
|
+
*
|
|
82
|
+
* @param topic - The topic name
|
|
83
|
+
* @returns The content, or undefined if not found
|
|
84
|
+
*/
|
|
85
|
+
readMemory(topic: string): Promise<string | undefined>;
|
|
86
|
+
/**
|
|
87
|
+
* Update memory with operation
|
|
88
|
+
*
|
|
89
|
+
* @param operation - The operation to perform ('append', 'replace', 'remove')
|
|
90
|
+
* @param topic - The topic name
|
|
91
|
+
* @param content - The content (required for append/replace)
|
|
92
|
+
* @param metadata - Optional metadata (entry_type, status, priority, tags, timestamps)
|
|
93
|
+
*/
|
|
94
|
+
updateMemory(operation: 'append' | 'replace' | 'remove', topic: string, content: string | undefined, metadata?: {
|
|
95
|
+
entry_type?: string;
|
|
96
|
+
status?: string;
|
|
97
|
+
priority?: string;
|
|
98
|
+
tags?: string;
|
|
99
|
+
created_at?: number;
|
|
100
|
+
updated_at?: number;
|
|
101
|
+
last_accessed?: number;
|
|
102
|
+
}): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Query memory with filters
|
|
105
|
+
*
|
|
106
|
+
* @param query - The query filters
|
|
107
|
+
* @param options - Query options (operation, includeMetadata)
|
|
108
|
+
* @returns Array of entries or count
|
|
109
|
+
*/
|
|
110
|
+
queryMemory(query: MemoryQuery, options?: QueryOptions): Promise<MemoryEntry[] | number>;
|
|
111
|
+
/**
|
|
112
|
+
* Batch update memory
|
|
113
|
+
*
|
|
114
|
+
* @param operations - Array of memory operations
|
|
115
|
+
*/
|
|
116
|
+
batchUpdateMemory(operations: MemoryOperation[]): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Get database statistics
|
|
119
|
+
*
|
|
120
|
+
* @returns Database statistics
|
|
121
|
+
*/
|
|
122
|
+
getStats(): Promise<DatabaseStats>;
|
|
123
|
+
/**
|
|
124
|
+
* Close the memory store and release resources
|
|
125
|
+
*/
|
|
126
|
+
close(): Promise<void>;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Memory Store Configuration
|
|
130
|
+
*/
|
|
131
|
+
export type MemoryStoreConfig = {
|
|
132
|
+
enabled: boolean;
|
|
133
|
+
type: 'sqlite' | 'memory' | string;
|
|
134
|
+
path?: string;
|
|
135
|
+
[key: string]: any;
|
|
136
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":""}
|
package/dist/path.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the directory portion of a path string.
|
|
3
|
+
* Strips trailing slashes, then takes everything up to the last slash.
|
|
4
|
+
*/
|
|
5
|
+
export declare function dirname(path: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Joins all given path segments, then normalizes the result.
|
|
8
|
+
*/
|
|
9
|
+
export declare function join(...parts: string[]): string;
|
package/dist/path.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the directory portion of a path string.
|
|
3
|
+
* Strips trailing slashes, then takes everything up to the last slash.
|
|
4
|
+
*/
|
|
5
|
+
export function dirname(path) {
|
|
6
|
+
if (path.length === 0)
|
|
7
|
+
return '.';
|
|
8
|
+
const isRooted = path[0] === '/';
|
|
9
|
+
// Trim trailing slashes (but leave root "/")
|
|
10
|
+
let end = path.length - 1;
|
|
11
|
+
while (end > 0 && path[end] === '/')
|
|
12
|
+
end--;
|
|
13
|
+
const idx = path.lastIndexOf('/', end);
|
|
14
|
+
if (idx < 0) {
|
|
15
|
+
return isRooted ? '/' : '.';
|
|
16
|
+
}
|
|
17
|
+
if (isRooted && idx === 0) {
|
|
18
|
+
return '/';
|
|
19
|
+
}
|
|
20
|
+
return path.slice(0, idx);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Normalizes a path by resolving "." and ".." segments.
|
|
24
|
+
*/
|
|
25
|
+
function normalize(path) {
|
|
26
|
+
const isAbsolute = path.startsWith('/');
|
|
27
|
+
const segments = path.split('/').filter(Boolean);
|
|
28
|
+
const stack = [];
|
|
29
|
+
for (const seg of segments) {
|
|
30
|
+
if (seg === '.')
|
|
31
|
+
continue;
|
|
32
|
+
if (seg === '..') {
|
|
33
|
+
if (stack.length && stack[stack.length - 1] !== '..') {
|
|
34
|
+
stack.pop();
|
|
35
|
+
}
|
|
36
|
+
else if (!isAbsolute) {
|
|
37
|
+
stack.push('..');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
stack.push(seg);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let result = stack.join('/');
|
|
45
|
+
if (!result && !isAbsolute)
|
|
46
|
+
return '.';
|
|
47
|
+
if (result && path.endsWith('/'))
|
|
48
|
+
result += '/';
|
|
49
|
+
return (isAbsolute ? '/' : '') + result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Joins all given path segments, then normalizes the result.
|
|
53
|
+
*/
|
|
54
|
+
export function join(...parts) {
|
|
55
|
+
if (parts.length === 0)
|
|
56
|
+
return '.';
|
|
57
|
+
let combined = '';
|
|
58
|
+
for (const p of parts) {
|
|
59
|
+
if (typeof p !== 'string') {
|
|
60
|
+
throw new TypeError('Arguments to join must be strings');
|
|
61
|
+
}
|
|
62
|
+
if (p) {
|
|
63
|
+
combined = combined ? `${combined}/${p}` : p;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return normalize(combined);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=path.js.map
|
package/dist/path.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAA;IAChC,6CAA6C;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACzB,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG;QAAE,GAAG,EAAE,CAAA;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IAC7B,CAAC;IACD,IAAI,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,KAAK,GAAG;YAAE,SAAQ;QACzB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACrD,KAAK,CAAC,GAAG,EAAE,CAAA;YACb,CAAC;iBAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO,GAAG,CAAA;IACtC,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,GAAG,CAAA;IAC/C,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAA;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,GAAG,KAAe;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA;IAClC,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAA;QAC1D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC;YACN,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// generated by polka.codes
|
|
2
|
+
import { describe, expect, it } from 'bun:test';
|
|
3
|
+
import { dirname, join } from './path';
|
|
4
|
+
describe('dirname', () => {
|
|
5
|
+
it('should return dot for empty string', () => {
|
|
6
|
+
expect(dirname('')).toBe('.');
|
|
7
|
+
});
|
|
8
|
+
it('should return dot for simple filename', () => {
|
|
9
|
+
expect(dirname('file.txt')).toBe('.');
|
|
10
|
+
});
|
|
11
|
+
it('should return directory for simple path', () => {
|
|
12
|
+
expect(dirname('dir/file.txt')).toBe('dir');
|
|
13
|
+
});
|
|
14
|
+
it('should handle nested paths', () => {
|
|
15
|
+
expect(dirname('a/b/c/file.txt')).toBe('a/b/c');
|
|
16
|
+
});
|
|
17
|
+
it('should return root for file at root', () => {
|
|
18
|
+
expect(dirname('/file.txt')).toBe('/');
|
|
19
|
+
});
|
|
20
|
+
it('should handle root directory', () => {
|
|
21
|
+
expect(dirname('/')).toBe('/');
|
|
22
|
+
});
|
|
23
|
+
it('should handle absolute paths', () => {
|
|
24
|
+
expect(dirname('/home/user/file.txt')).toBe('/home/user');
|
|
25
|
+
});
|
|
26
|
+
it('should strip trailing slashes', () => {
|
|
27
|
+
expect(dirname('dir/')).toBe('.');
|
|
28
|
+
expect(dirname('dir/subdir/')).toBe('dir');
|
|
29
|
+
expect(dirname('/dir/subdir/')).toBe('/dir');
|
|
30
|
+
});
|
|
31
|
+
it('should handle multiple trailing slashes', () => {
|
|
32
|
+
expect(dirname('dir///')).toBe('.');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('join', () => {
|
|
36
|
+
it('should return dot for no arguments', () => {
|
|
37
|
+
expect(join()).toBe('.');
|
|
38
|
+
});
|
|
39
|
+
it('should return single argument as-is', () => {
|
|
40
|
+
expect(join('file.txt')).toBe('file.txt');
|
|
41
|
+
});
|
|
42
|
+
it('should join two parts', () => {
|
|
43
|
+
expect(join('dir', 'file.txt')).toBe('dir/file.txt');
|
|
44
|
+
});
|
|
45
|
+
it('should join multiple parts', () => {
|
|
46
|
+
expect(join('a', 'b', 'c')).toBe('a/b/c');
|
|
47
|
+
});
|
|
48
|
+
it('should handle absolute paths', () => {
|
|
49
|
+
expect(join('/home', 'user')).toBe('/home/user');
|
|
50
|
+
});
|
|
51
|
+
it('should normalize dots', () => {
|
|
52
|
+
expect(join('a', '.', 'b')).toBe('a/b');
|
|
53
|
+
});
|
|
54
|
+
it('should normalize double dots', () => {
|
|
55
|
+
expect(join('a', 'b', '..', 'c')).toBe('a/c');
|
|
56
|
+
});
|
|
57
|
+
it('should handle double dots at start', () => {
|
|
58
|
+
expect(join('..', 'a')).toBe('../a');
|
|
59
|
+
});
|
|
60
|
+
it('should handle empty segments', () => {
|
|
61
|
+
expect(join('a', '', 'b')).toBe('a/b');
|
|
62
|
+
});
|
|
63
|
+
it('should throw for non-string arguments', () => {
|
|
64
|
+
expect(() => join(123)).toThrow('Arguments to join must be strings');
|
|
65
|
+
});
|
|
66
|
+
it('should handle leading slashes in non-first parts', () => {
|
|
67
|
+
expect(join('/home', '/user')).toBe('/home/user');
|
|
68
|
+
});
|
|
69
|
+
it('should handle trailing slashes', () => {
|
|
70
|
+
expect(join('a/', 'b')).toBe('a/b');
|
|
71
|
+
});
|
|
72
|
+
it('should handle complex normalization', () => {
|
|
73
|
+
expect(join('a', '../b', './c')).toBe('b/c');
|
|
74
|
+
});
|
|
75
|
+
it('should handle absolute path with parent references', () => {
|
|
76
|
+
expect(join('/a/b', '../c')).toBe('/a/c');
|
|
77
|
+
});
|
|
78
|
+
it('should not go above root for absolute paths', () => {
|
|
79
|
+
expect(join('/', '..')).toBe('/');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=path.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.test.js","sourceRoot":"","sources":["../src/path.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ModelInfo, PortkeyPricingResponse } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Convert Portkey pricing (cents per token) to ModelInfo (USD per 1M tokens)
|
|
4
|
+
* Formula: cents_per_token * 10 = usd_per_1M_tokens
|
|
5
|
+
*/
|
|
6
|
+
export declare function convertPortkeyToModelInfo(portkey: PortkeyPricingResponse): ModelInfo;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Portkey pricing (cents per token) to ModelInfo (USD per 1M tokens)
|
|
3
|
+
* Formula: cents_per_token * 10 = usd_per_1M_tokens
|
|
4
|
+
*/
|
|
5
|
+
export function convertPortkeyToModelInfo(portkey) {
|
|
6
|
+
return {
|
|
7
|
+
inputPrice: (portkey.request_token?.price ?? 0) * 10,
|
|
8
|
+
outputPrice: (portkey.response_token?.price ?? 0) * 10,
|
|
9
|
+
cacheWritesPrice: (portkey.cache_write_input_token?.price ?? 0) * 10,
|
|
10
|
+
cacheReadsPrice: (portkey.cache_read_input_token?.price ?? 0) * 10,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../../src/pricing/converter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAA+B;IACvE,OAAO;QACL,UAAU,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE;QACpD,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE;QACtD,gBAAgB,EAAE,CAAC,OAAO,CAAC,uBAAuB,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE;QACpE,eAAe,EAAE,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE;KACnE,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
import { convertPortkeyToModelInfo } from './converter';
|
|
3
|
+
describe('convertPortkeyToModelInfo', () => {
|
|
4
|
+
test('converts full pricing data correctly', () => {
|
|
5
|
+
const portkey = {
|
|
6
|
+
request_token: { price: 0.3 }, // 0.3 cents/token = 3 USD/1M tokens
|
|
7
|
+
response_token: { price: 1.5 }, // 1.5 cents/token = 15 USD/1M tokens
|
|
8
|
+
cache_write_input_token: { price: 0.375 }, // 0.375 cents/token = 3.75 USD/1M tokens
|
|
9
|
+
cache_read_input_token: { price: 0.03 }, // 0.03 cents/token = 0.3 USD/1M tokens
|
|
10
|
+
};
|
|
11
|
+
const result = convertPortkeyToModelInfo(portkey);
|
|
12
|
+
expect(result).toEqual({
|
|
13
|
+
inputPrice: 3,
|
|
14
|
+
outputPrice: 15,
|
|
15
|
+
cacheWritesPrice: 3.75,
|
|
16
|
+
cacheReadsPrice: 0.3,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
test('handles missing fields with zero defaults', () => {
|
|
20
|
+
const portkey = {
|
|
21
|
+
request_token: { price: 0.3 },
|
|
22
|
+
response_token: { price: 1.5 },
|
|
23
|
+
};
|
|
24
|
+
const result = convertPortkeyToModelInfo(portkey);
|
|
25
|
+
expect(result).toEqual({
|
|
26
|
+
inputPrice: 3,
|
|
27
|
+
outputPrice: 15,
|
|
28
|
+
cacheWritesPrice: 0,
|
|
29
|
+
cacheReadsPrice: 0,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
test('handles completely empty pricing', () => {
|
|
33
|
+
const portkey = {};
|
|
34
|
+
const result = convertPortkeyToModelInfo(portkey);
|
|
35
|
+
expect(result).toEqual({
|
|
36
|
+
inputPrice: 0,
|
|
37
|
+
outputPrice: 0,
|
|
38
|
+
cacheWritesPrice: 0,
|
|
39
|
+
cacheReadsPrice: 0,
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
test('conversion formula is correct', () => {
|
|
43
|
+
// Verify: cents_per_token * 10 = usd_per_1M_tokens
|
|
44
|
+
// Example: 0.1 cents/token * 10 = 1 USD/1M tokens
|
|
45
|
+
const portkey = {
|
|
46
|
+
request_token: { price: 0.1 },
|
|
47
|
+
response_token: { price: 0.4 },
|
|
48
|
+
};
|
|
49
|
+
const result = convertPortkeyToModelInfo(portkey);
|
|
50
|
+
expect(result.inputPrice).toBe(1);
|
|
51
|
+
expect(result.outputPrice).toBe(4);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=converter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converter.test.js","sourceRoot":"","sources":["../../src/pricing/converter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAGvD,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,oCAAoC;YACnE,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,qCAAqC;YACrE,uBAAuB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,yCAAyC;YACpF,sBAAsB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,uCAAuC;SACjF,CAAA;QAED,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,IAAI;YACtB,eAAe,EAAE,GAAG;SACrB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;YAC7B,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SAC/B,CAAA;QAED,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,CAAC;YACnB,eAAe,EAAE,CAAC;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,OAAO,GAA2B,EAAE,CAAA;QAE1C,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,gBAAgB,EAAE,CAAC;YACnB,eAAe,EAAE,CAAC;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,mDAAmD;QACnD,kDAAkD;QAClD,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;YAC7B,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SAC/B,CAAA;QAED,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;QAEjD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const PORTKEY_BASE_URL = 'https://api.portkey.ai/model-configs/pricing';
|
|
2
|
+
const TIMEOUT_MS = 5000;
|
|
3
|
+
const MAX_RETRIES = 2;
|
|
4
|
+
async function fetchWithTimeout(url, timeoutMs) {
|
|
5
|
+
const controller = new AbortController();
|
|
6
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
7
|
+
try {
|
|
8
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
9
|
+
return response;
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
clearTimeout(timeout);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function sleep(ms) {
|
|
16
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
17
|
+
}
|
|
18
|
+
function shouldRetry(response, error) {
|
|
19
|
+
// Retry on network errors or 5xx server errors
|
|
20
|
+
if (error)
|
|
21
|
+
return true;
|
|
22
|
+
if (response.status >= 500)
|
|
23
|
+
return true;
|
|
24
|
+
// Don't retry on 4xx client errors (including 404 not found)
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
export async function fetchPricing(provider, model) {
|
|
28
|
+
const url = `${PORTKEY_BASE_URL}/${provider}/${model}`;
|
|
29
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
30
|
+
try {
|
|
31
|
+
const response = await fetchWithTimeout(url, TIMEOUT_MS);
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
// Don't retry on 4xx errors (client errors like 404)
|
|
34
|
+
if (!shouldRetry(response, null)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (attempt < MAX_RETRIES) {
|
|
38
|
+
await sleep(2 ** attempt * 1000);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const data = await response.json();
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Retry on network errors
|
|
48
|
+
if (attempt < MAX_RETRIES && shouldRetry(new Response(null, { status: 500 }), error)) {
|
|
49
|
+
await sleep(2 ** attempt * 1000);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=portkey-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portkey-client.js","sourceRoot":"","sources":["../../src/pricing/portkey-client.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,8CAA8C,CAAA;AACvE,MAAM,UAAU,GAAG,IAAI,CAAA;AACvB,MAAM,WAAW,GAAG,CAAC,CAAA;AAErB,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,SAAiB;IAC5D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAE/D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QAChE,OAAO,QAAQ,CAAA;IACjB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,EAAU;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,QAAkB,EAAE,KAAc;IACrD,+CAA+C;IAC/C,IAAI,KAAK;QAAE,OAAO,IAAI,CAAA;IACtB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IACvC,6DAA6D;IAC7D,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAa;IAChE,MAAM,GAAG,GAAG,GAAG,gBAAgB,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAA;IAEtD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;YAExD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,qDAAqD;gBACrD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;oBACjC,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBAC1B,MAAM,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,CAAA;oBAChC,SAAQ;gBACV,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,OAAO,IAA8B,CAAA;QACvC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0BAA0B;YAC1B,IAAI,OAAO,GAAG,WAAW,IAAI,WAAW,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;gBACrF,MAAM,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,CAAA;gBAChC,SAAQ;YACV,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { convertPortkeyToModelInfo } from './converter';
|
|
6
|
+
import { fetchPricing } from './portkey-client';
|
|
7
|
+
const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
8
|
+
export class PricingService {
|
|
9
|
+
#fallbackPrices;
|
|
10
|
+
#cacheFile;
|
|
11
|
+
#cache = null;
|
|
12
|
+
#loadPromise = null;
|
|
13
|
+
constructor(fallbackPrices = {}) {
|
|
14
|
+
// Normalize fallback price keys (remove dots and dashes) to match lookup behavior
|
|
15
|
+
const normalized = {};
|
|
16
|
+
for (const [provider, providerInfo] of Object.entries(fallbackPrices)) {
|
|
17
|
+
const normalizedProvider = provider.split('-')[0];
|
|
18
|
+
normalized[normalizedProvider] = {};
|
|
19
|
+
for (const [model, modelInfo] of Object.entries(providerInfo)) {
|
|
20
|
+
const normalizedModel = model.replace(/[.-]/g, '');
|
|
21
|
+
normalized[normalizedProvider][normalizedModel] = {
|
|
22
|
+
inputPrice: modelInfo.inputPrice ?? 0,
|
|
23
|
+
outputPrice: modelInfo.outputPrice ?? 0,
|
|
24
|
+
cacheWritesPrice: modelInfo.cacheWritesPrice ?? 0,
|
|
25
|
+
cacheReadsPrice: modelInfo.cacheReadsPrice ?? 0,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
this.#fallbackPrices = normalized;
|
|
30
|
+
this.#cacheFile = join(homedir(), '.config', 'polkacodes', 'pricing-cache.json');
|
|
31
|
+
}
|
|
32
|
+
async #load() {
|
|
33
|
+
// Use promise to avoid race condition
|
|
34
|
+
if (this.#loadPromise) {
|
|
35
|
+
return this.#loadPromise;
|
|
36
|
+
}
|
|
37
|
+
this.#loadPromise = (async () => {
|
|
38
|
+
this.#cache = new Map();
|
|
39
|
+
try {
|
|
40
|
+
const content = await readFile(this.#cacheFile, 'utf-8');
|
|
41
|
+
const data = JSON.parse(content);
|
|
42
|
+
for (const [key, value] of Object.entries(data)) {
|
|
43
|
+
this.#cache.set(key, value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Ignore errors (file doesn't exist or invalid JSON), start with empty cache
|
|
48
|
+
}
|
|
49
|
+
})();
|
|
50
|
+
return this.#loadPromise;
|
|
51
|
+
}
|
|
52
|
+
async #get(provider, model) {
|
|
53
|
+
await this.#load();
|
|
54
|
+
const key = `${provider}:${model}`;
|
|
55
|
+
const entry = this.#cache?.get(key);
|
|
56
|
+
if (!entry) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
if (Date.now() - entry.timestamp > CACHE_TTL_MS) {
|
|
60
|
+
this.#cache?.delete(key);
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return entry.pricing;
|
|
64
|
+
}
|
|
65
|
+
async #set(provider, model, pricing) {
|
|
66
|
+
await this.#load();
|
|
67
|
+
const key = `${provider}:${model}`;
|
|
68
|
+
this.#cache?.set(key, {
|
|
69
|
+
pricing,
|
|
70
|
+
timestamp: Date.now(),
|
|
71
|
+
});
|
|
72
|
+
await this.#save();
|
|
73
|
+
}
|
|
74
|
+
async #save() {
|
|
75
|
+
if (!this.#cache) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const dir = dirname(this.#cacheFile);
|
|
80
|
+
await mkdir(dir, { recursive: true });
|
|
81
|
+
const data = {};
|
|
82
|
+
for (const [key, value] of this.#cache.entries()) {
|
|
83
|
+
data[key] = value;
|
|
84
|
+
}
|
|
85
|
+
// Write to temp file first, then rename for atomic update
|
|
86
|
+
const tempFile = `${this.#cacheFile}.${randomUUID()}.tmp`;
|
|
87
|
+
await writeFile(tempFile, JSON.stringify(data, null, 2), 'utf-8');
|
|
88
|
+
await rename(tempFile, this.#cacheFile);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Ignore save errors
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async getPricing(provider, model) {
|
|
95
|
+
// Normalize provider (e.g., google-vertex -> google)
|
|
96
|
+
const normalizedProvider = provider.split('-')[0];
|
|
97
|
+
// Normalize model for cache key and fallback lookup (remove dots and dashes to match UsageMeter behavior)
|
|
98
|
+
const normalizedModel = model.replace(/[.-]/g, '');
|
|
99
|
+
// Try cache first (using normalized model)
|
|
100
|
+
const cached = await this.#get(normalizedProvider, normalizedModel);
|
|
101
|
+
if (cached) {
|
|
102
|
+
return cached;
|
|
103
|
+
}
|
|
104
|
+
// Try fallback prices (config + hardcoded) using normalized model
|
|
105
|
+
const fallbackPrice = this.#fallbackPrices[normalizedProvider]?.[normalizedModel];
|
|
106
|
+
if (fallbackPrice) {
|
|
107
|
+
return fallbackPrice;
|
|
108
|
+
}
|
|
109
|
+
// Try Portkey API as last resort (using original model ID)
|
|
110
|
+
const portkeyPricing = await fetchPricing(normalizedProvider, model);
|
|
111
|
+
if (portkeyPricing) {
|
|
112
|
+
const modelInfo = convertPortkeyToModelInfo(portkeyPricing);
|
|
113
|
+
await this.#set(normalizedProvider, normalizedModel, modelInfo);
|
|
114
|
+
return modelInfo;
|
|
115
|
+
}
|
|
116
|
+
// Return zero pricing as absolute last resort
|
|
117
|
+
return {
|
|
118
|
+
inputPrice: 0,
|
|
119
|
+
outputPrice: 0,
|
|
120
|
+
cacheWritesPrice: 0,
|
|
121
|
+
cacheReadsPrice: 0,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=pricing-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing-service.js","sourceRoot":"","sources":["../../src/pricing/pricing-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|