openvibe 0.60.0 → 0.60.2
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/CHANGELOG.md +11 -0
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/core/accelerated-client.d.ts.map +1 -1
- package/dist/core/accelerated-client.js.map +1 -1
- package/dist/core/accelerated-stream.d.ts.map +1 -1
- package/dist/core/accelerated-stream.js +2 -2
- package/dist/core/accelerated-stream.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +2 -11
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/api-concurrency.d.ts.map +1 -1
- package/dist/core/api-concurrency.js +3 -3
- package/dist/core/api-concurrency.js.map +1 -1
- package/dist/core/branded-ai.d.ts.map +1 -1
- package/dist/core/branded-ai.js +1 -1
- package/dist/core/branded-ai.js.map +1 -1
- package/dist/core/context-architecture.d.ts +4 -5
- package/dist/core/context-architecture.d.ts.map +1 -1
- package/dist/core/context-architecture.js +4 -5
- package/dist/core/context-architecture.js.map +1 -1
- package/dist/core/context-manager.d.ts.map +1 -1
- package/dist/core/context-manager.js.map +1 -1
- package/dist/core/context-provider-registry.d.ts +1 -1
- package/dist/core/context-provider-registry.d.ts.map +1 -1
- package/dist/core/context-provider-registry.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/index.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/multi-gpu-executor.d.ts.map +1 -1
- package/dist/core/multi-gpu-executor.js.map +1 -1
- package/dist/core/response-accelerator.d.ts +0 -1
- package/dist/core/response-accelerator.d.ts.map +1 -1
- package/dist/core/response-accelerator.js +0 -1
- package/dist/core/response-accelerator.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +6 -4
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/fast-executor.d.ts.map +1 -1
- package/dist/core/tools/fast-executor.js +2 -1
- package/dist/core/tools/fast-executor.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/local-accelerator.d.ts.map +1 -1
- package/dist/core/tools/local-accelerator.js +1 -1
- package/dist/core/tools/local-accelerator.js.map +1 -1
- package/dist/core/tools/parallel-executor.d.ts.map +1 -1
- package/dist/core/tools/parallel-executor.js +4 -9
- package/dist/core/tools/parallel-executor.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +3 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/onboarding-wizard.d.ts +1 -2
- package/dist/modes/interactive/components/onboarding-wizard.d.ts.map +1 -1
- package/dist/modes/interactive/components/onboarding-wizard.js +2 -4
- package/dist/modes/interactive/components/onboarding-wizard.js.map +1 -1
- package/dist/modes/interactive/components/skills-selector.d.ts +1 -1
- package/dist/modes/interactive/components/skills-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/skills-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +0 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +2 -11
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.61.0] - 2025-03-13
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Fixed CI failures: resolved biome lint errors and TypeScript compilation issues
|
|
13
|
+
- Fixed vitest configuration: added `passWithNoTests: true` to prevent test failures when no test files exist
|
|
14
|
+
- Removed unused imports and variables across multiple files
|
|
15
|
+
- Fixed TypeScript errors in `footer.ts` and `onboarding-wizard.ts`
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
8
19
|
## [0.60.0] - 2025-03-13
|
|
9
20
|
|
|
10
21
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-models.d.ts","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-models.d.ts","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAe/D,wBAAsB,UAAU,CAAC,aAAa,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrG","sourcesContent":["import type { ModelRegistry } from \"../core/model-registry.js\";\nimport { loadUserConfig } from \"../core/user-config.js\";\n\nfunction formatTokenCount(count: number): string {\n\tif (count >= 1_000_000) {\n\t\tconst millions = count / 1_000_000;\n\t\treturn millions % 1 === 0 ? `${millions}M` : `${millions.toFixed(1)}M`;\n\t}\n\tif (count >= 1_000) {\n\t\tconst thousands = count / 1_000;\n\t\treturn thousands % 1 === 0 ? `${thousands}K` : `${thousands.toFixed(1)}K`;\n\t}\n\treturn count.toString();\n}\n\nexport async function listModels(modelRegistry: ModelRegistry, _searchPattern?: string): Promise<void> {\n\tconst config = loadUserConfig();\n\tconst model = modelRegistry.getModel();\n\n\tif (!model || !config.model) {\n\t\tconsole.log(\"No model configured. Please run onboarding first.\");\n\t\treturn;\n\t}\n\n\tconsole.log(\"Configured Model:\");\n\tconsole.log(` ID: ${model.id}`);\n\tconsole.log(` Name: ${model.name}`);\n\tconsole.log(` Provider: ${model.provider}`);\n\tconsole.log(` Base URL: ${config.model.baseUrl}`);\n\tconsole.log(` Context: ${formatTokenCount(model.contextWindow)}`);\n\tconsole.log(` Max Output: ${formatTokenCount(model.maxTokens)}`);\n\tconsole.log(` Reasoning: ${model.reasoning ? \"yes\" : \"no\"}`);\n\tconsole.log(` Images: ${model.input.includes(\"image\") ? \"yes\" : \"no\"}`);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,SAAS,gBAAgB,CAAC,KAAa,EAAU;IAChD,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;QACnC,OAAO,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;QAChC,OAAO,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAAA,CACxB;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAA4B,EAAE,cAAuB,EAAiB;IACtG,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IAEvC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,kBAAkB,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,kBAAkB,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,CAC9E","sourcesContent":["import type { ModelRegistry } from \"../core/model-registry.js\";\nimport { loadUserConfig } from \"../core/user-config.js\";\n\nfunction formatTokenCount(count: number): string {\n\tif (count >= 1_000_000) {\n\t\tconst millions = count / 1_000_000;\n\t\treturn millions % 1 === 0 ? `${millions}M` : `${millions.toFixed(1)}M`;\n\t}\n\tif (count >= 1_000) {\n\t\tconst thousands = count / 1_000;\n\t\treturn thousands % 1 === 0 ? `${thousands}K` : `${thousands.toFixed(1)}K`;\n\t}\n\treturn count.toString();\n}\n\nexport async function listModels(modelRegistry: ModelRegistry, _searchPattern?: string): Promise<void> {\n\tconst config = loadUserConfig();\n\tconst model = modelRegistry.getModel();\n\n\tif (!model || !config.model) {\n\t\tconsole.log(\"No model configured. Please run onboarding first.\");\n\t\treturn;\n\t}\n\n\tconsole.log(\"Configured Model:\");\n\tconsole.log(` ID: ${model.id}`);\n\tconsole.log(` Name: ${model.name}`);\n\tconsole.log(` Provider: ${model.provider}`);\n\tconsole.log(` Base URL: ${config.model.baseUrl}`);\n\tconsole.log(` Context: ${formatTokenCount(model.contextWindow)}`);\n\tconsole.log(` Max Output: ${formatTokenCount(model.maxTokens)}`);\n\tconsole.log(` Reasoning: ${model.reasoning ? \"yes\" : \"no\"}`);\n\tconsole.log(` Images: ${model.input.includes(\"image\") ? \"yes\" : \"no\"}`);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accelerated-client.d.ts","sourceRoot":"","sources":["../../src/core/accelerated-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"accelerated-client.d.ts","sourceRoot":"","sources":["../../src/core/accelerated-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAI5E,UAAU,mBAAmB;IAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,GAAG,CAAC;CACd;AACD,UAAU,iBAAiB;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAkCD,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,WAAW,CAAc;IACjC,YAAY,OAAO,CAAC,EAAE;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,iBAAiB,CAAC;KAChC,EAGA;IACK,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAKjG;IACM,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAK9G;IACK,YAAY,CACjB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAK7B;IACM,WAAW,CACjB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChC,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAKzE;IACK,cAAc,CAAC,QAAQ,EAAE,mBAAmB,EAAE,EAAE,iBAAiB,SAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAezG;IACD,QAAQ;;;;;;MAKP;IACD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IACD,KAAK,IAAI,IAAI,CAEZ;CACD;AACD,eAAO,MAAM,uBAAuB,sBAA6B,CAAC","sourcesContent":["import type { AssistantMessage, Context, Model } from \"@mariozechner/pi-ai\";\nimport { APIParallelExecutor } from \"./api-concurrency.js\";\nimport { accelerateStream } from \"./response-accelerator.js\";\n\ninterface BatchRequestOptions {\n\tmodel: Model<any>;\n\tcontext: Context;\n\toptions?: any;\n}\ninterface RateLimiterConfig {\n\tmaxRequestsPerSecond?: number;\n\tmaxRequestsPerMinute?: number;\n}\nclass RateLimiter {\n\tprivate requests: number[] = [];\n\tprivate maxPerSecond: number;\n\tprivate maxPerMinute: number;\n\tconstructor(config: RateLimiterConfig = {}) {\n\t\tthis.maxPerSecond = config.maxRequestsPerSecond ?? 60;\n\t\tthis.maxPerMinute = (config as any).maxRequestsPerMinute ?? 600;\n\t}\n\tasync acquire(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tthis.requests = this.requests.filter((timestamp) => now - timestamp < 60000);\n\t\tif (this.requests.length >= this.maxPerMinute) {\n\t\t\tconst oldestRequest = this.requests[0];\n\t\t\tconst waitTime = 60000 - (now - oldestRequest) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tconst recentRequests = this.requests.filter((timestamp) => now - timestamp < 1000);\n\t\tif (recentRequests.length >= this.maxPerSecond) {\n\t\t\tconst oldestRecent = recentRequests[0];\n\t\t\tconst waitTime = 1000 - (now - oldestRecent) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tthis.requests.push(now);\n\t}\n\tgetStats(): { requestsThisSecond: number; requestsThisMinute: number } {\n\t\tconst now = Date.now();\n\t\tconst requestsThisSecond = this.requests.filter((timestamp) => now - timestamp < 1000).length;\n\t\tconst requestsThisMinute = this.requests.length;\n\t\treturn { requestsThisSecond, requestsThisMinute };\n\t}\n}\nexport class AcceleratedAPIClient {\n\tprivate executor: APIParallelExecutor;\n\tprivate rateLimiter: RateLimiter;\n\tconstructor(options?: {\n\t\tconcurrency?: number;\n\t\trateLimiter?: RateLimiterConfig;\n\t}) {\n\t\tthis.executor = new APIParallelExecutor(options?.concurrency);\n\t\tthis.rateLimiter = new RateLimiter(options?.rateLimiter);\n\t}\n\tasync singleRequest(model: Model<any>, context: Context, options?: any): Promise<AssistantMessage> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\treturn response.result();\n\t}\n\tasync *singleStreamRequest(model: Model<any>, context: Context, options?: any): AsyncGenerator<any, void, void> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\tyield* accelerateStream(response as any, { priority: \"speed\" });\n\t}\n\tasync batchRequest(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): Promise<AssistantMessage[]> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\treturn this.executor.batchRequest(requests, options);\n\t}\n\tasync *streamBatch(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): AsyncGenerator<{ index: number; result: AssistantMessage }, void, void> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\tyield* this.executor.streamBatch(requests, options);\n\t}\n\tasync throttledBatch(requests: BatchRequestOptions[], requestsPerSecond = 10): Promise<AssistantMessage[]> {\n\t\tconst delay = 1000 / requestsPerSecond;\n\t\tconst results: AssistantMessage[] = [];\n\t\tconst concurrency = this.executor.getOptimalConcurrency();\n\t\tfor (let i = 0; i < requests.length; i += concurrency) {\n\t\t\tconst batch = requests.slice(i, i + concurrency);\n\t\t\tawait this.rateLimiter.acquire();\n\t\t\tconst batchPromises = batch.map((req) => this.singleRequest(req.model, req.context, req.options));\n\t\t\tconst batchResults = await Promise.all(batchPromises);\n\t\t\tresults.push(...batchResults);\n\t\t\tif (i + concurrency < requests.length) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\tgetStats() {\n\t\treturn {\n\t\t\tconcurrency: this.executor.getStats(),\n\t\t\trateLimiter: this.rateLimiter.getStats(),\n\t\t};\n\t}\n\tsetConcurrency(concurrency: number): void {\n\t\tthis.executor.setConcurrency(concurrency);\n\t}\n\tclear(): void {\n\t\tthis.executor.clear();\n\t}\n}\nexport const globalAcceleratedClient = new AcceleratedAPIClient();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accelerated-client.js","sourceRoot":"","sources":["../../src/core/accelerated-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"accelerated-client.js","sourceRoot":"","sources":["../../src/core/accelerated-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, Context, Model } from \"@mariozechner/pi-ai\";\nimport { APIParallelExecutor } from \"./api-concurrency.js\";\nimport { accelerateStream } from \"./response-accelerator.js\";\n\ninterface BatchRequestOptions {\n\tmodel: Model<any>;\n\tcontext: Context;\n\toptions?: any;\n}\ninterface RateLimiterConfig {\n\tmaxRequestsPerSecond?: number;\n\tmaxRequestsPerMinute?: number;\n}\nclass RateLimiter {\n\tprivate requests: number[] = [];\n\tprivate maxPerSecond: number;\n\tprivate maxPerMinute: number;\n\tconstructor(config: RateLimiterConfig = {}) {\n\t\tthis.maxPerSecond = config.maxRequestsPerSecond ?? 60;\n\t\tthis.maxPerMinute = (config as any).maxRequestsPerMinute ?? 600;\n\t}\n\tasync acquire(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tthis.requests = this.requests.filter((timestamp) => now - timestamp < 60000);\n\t\tif (this.requests.length >= this.maxPerMinute) {\n\t\t\tconst oldestRequest = this.requests[0];\n\t\t\tconst waitTime = 60000 - (now - oldestRequest) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tconst recentRequests = this.requests.filter((timestamp) => now - timestamp < 1000);\n\t\tif (recentRequests.length >= this.maxPerSecond) {\n\t\t\tconst oldestRecent = recentRequests[0];\n\t\t\tconst waitTime = 1000 - (now - oldestRecent) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tthis.requests.push(now);\n\t}\n\tgetStats(): { requestsThisSecond: number; requestsThisMinute: number } {\n\t\tconst now = Date.now();\n\t\tconst requestsThisSecond = this.requests.filter((timestamp) => now - timestamp < 1000).length;\n\t\tconst requestsThisMinute = this.requests.length;\n\t\treturn { requestsThisSecond, requestsThisMinute };\n\t}\n}\nexport class AcceleratedAPIClient {\n\tprivate executor: APIParallelExecutor;\n\tprivate rateLimiter: RateLimiter;\n\tconstructor(options?: {\n\t\tconcurrency?: number;\n\t\trateLimiter?: RateLimiterConfig;\n\t}) {\n\t\tthis.executor = new APIParallelExecutor(options?.concurrency);\n\t\tthis.rateLimiter = new RateLimiter(options?.rateLimiter);\n\t}\n\tasync singleRequest(model: Model<any>, context: Context, options?: any): Promise<AssistantMessage> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\treturn response.result();\n\t}\n\tasync *singleStreamRequest(model: Model<any>, context: Context, options?: any): AsyncGenerator<any, void, void> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\tyield* accelerateStream(response as any, { priority: \"speed\" });\n\t}\n\tasync batchRequest(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): Promise<AssistantMessage[]> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\treturn this.executor.batchRequest(requests, options);\n\t}\n\tasync *streamBatch(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): AsyncGenerator<{ index: number; result: AssistantMessage }, void, void> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\tyield* this.executor.streamBatch(requests, options);\n\t}\n\tasync throttledBatch(requests: BatchRequestOptions[], requestsPerSecond = 10): Promise<AssistantMessage[]> {\n\t\tconst delay = 1000 / requestsPerSecond;\n\t\tconst results: AssistantMessage[] = [];\n\t\tconst concurrency = this.executor.getOptimalConcurrency();\n\t\tfor (let i = 0; i < requests.length; i += concurrency) {\n\t\t\tconst batch = requests.slice(i, i + concurrency);\n\t\t\tawait this.rateLimiter.acquire();\n\t\t\tconst batchPromises = batch.map((req) => this.singleRequest(req.model, req.context, req.options));\n\t\t\tconst batchResults = await Promise.all(batchPromises);\n\t\t\tresults.push(...batchResults);\n\t\t\tif (i + concurrency < requests.length) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\tgetStats() {\n\t\treturn {\n\t\t\tconcurrency: this.executor.getStats(),\n\t\t\trateLimiter: this.rateLimiter.getStats(),\n\t\t};\n\t}\n\tsetConcurrency(concurrency: number): void {\n\t\tthis.executor.setConcurrency(concurrency);\n\t}\n\tclear(): void {\n\t\tthis.executor.clear();\n\t}\n}\nexport const globalAcceleratedClient = new AcceleratedAPIClient();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accelerated-stream.d.ts","sourceRoot":"","sources":["../../src/core/accelerated-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGnF,UAAU,qBAAqB;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,UAAU,eAAe;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACvB;AACD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,KAAK,CAKX;IACF,YAAY,MAAM,GAAE,qBAA0B,EAM7C;IACM,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAyBlH;IACM,kBAAkB,CACxB,MAAM,EAAE,cAAc,CAAC,qBAAqB,CAAC,EAC7C,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;QACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,qBAAqB,CAAC;KACzE,GACC,cAAc,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAgC/D;YACa,eAAe;IAGvB,sBAAsB,CAAC,CAAC,EAC7B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAC3B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAE9B;IACD,QAAQ,IAAI,eAAe,CAE1B;IACD,UAAU,IAAI,IAAI,CAOjB;CACD;AACD,qBAAa,YAAY;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,gBAAgB,CAA0B;IAC3C,KAAK,CAAC,CAAC,EACb,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAyBzD;YACa,YAAY;CAM1B;AACD,eAAO,MAAM,uBAAuB,mBAA0B,CAAC;AAC/D,eAAO,MAAM,kBAAkB,cAAqB,CAAC","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"@mariozechner/pi-ai\";\nimport { globalMultiGPUExecutor } from \"./multi-gpu-executor.js\";\n\ninterface StreamProcessorConfig {\n\tenableParallelProcessing?: boolean;\n\tbufferSize?: number;\n\tworkerCount?: number;\n}\ninterface ProcessingStats {\n\ttotalChunks: number;\n\tprocessedChunks: number;\n\tbufferedChunks: number;\n\tprocessingTime: number;\n}\nexport class AcceleratedStream {\n\tprivate config: Required<StreamProcessorConfig>;\n\tprivate stats: ProcessingStats = {\n\t\ttotalChunks: 0,\n\t\tprocessedChunks: 0,\n\t\tbufferedChunks: 0,\n\t\tprocessingTime: 0,\n\t};\n\tconstructor(config: StreamProcessorConfig = {}) {\n\t\tthis.config = {\n\t\t\tenableParallelProcessing: config.enableParallelProcessing ?? true,\n\t\t\tbufferSize: config.bufferSize ?? 20,\n\t\t\tworkerCount: config.workerCount ?? 4,\n\t\t};\n\t}\n\tasync *process<T>(source: AsyncIterable<T>, processor: (chunk: T) => T | Promise<T>): AsyncGenerator<T, void, void> {\n\t\tif (!this.config.enableParallelProcessing) {\n\t\t\tfor await (const chunk of source) {\n\t\t\t\tyield await processor(chunk);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst buffer: Promise<T>[] = [];\n\t\tconst startTime = Date.now();\n\t\tfor await (const chunk of source) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedPromise = globalMultiGPUExecutor.compute(chunk, processor);\n\t\t\tbuffer.push(processedPromise);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst result = await buffer.shift()!;\n\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\tyield result;\n\t\t\t}\n\t\t}\n\t\twhile (buffer.length > 0) {\n\t\t\tconst result = await buffer.shift()!;\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield result;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t}\n\tasync *accelerateResponse(\n\t\tstream: AsyncGenerator<AssistantMessageEvent>,\n\t\toptions?: {\n\t\t\tonChunk?: (chunk: AssistantMessageEvent) => void;\n\t\t\ttransformChunk?: (chunk: AssistantMessageEvent) => AssistantMessageEvent;\n\t\t},\n\t): AsyncGenerator<AssistantMessageEvent, AssistantMessage, void> {\n\t\tconst buffer: AssistantMessageEvent[] = [];\n\t\tlet finalMessage: AssistantMessage | null = null;\n\t\tconst startTime = Date.now();\n\t\tfor await (const event of stream) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedEvent = options?.transformChunk\n\t\t\t\t? await globalMultiGPUExecutor.compute(event, options.transformChunk)\n\t\t\t\t: event;\n\t\t\toptions?.onChunk?.(processedEvent);\n\t\t\tbuffer.push(processedEvent);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst toYield = buffer.splice(0, buffer.length - Math.floor(this.config.bufferSize / 2));\n\t\t\t\tfor (const e of toYield) {\n\t\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\t\tyield e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\tfinalMessage = await this.getFinalMessage(stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfor (const event of buffer) {\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield event;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t\tif (!finalMessage) {\n\t\t\tthrow new Error(\"Stream ended without final message\");\n\t\t}\n\t\treturn finalMessage;\n\t}\n\tprivate async getFinalMessage(
|
|
1
|
+
{"version":3,"file":"accelerated-stream.d.ts","sourceRoot":"","sources":["../../src/core/accelerated-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGnF,UAAU,qBAAqB;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,UAAU,eAAe;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACvB;AACD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,KAAK,CAKX;IACF,YAAY,MAAM,GAAE,qBAA0B,EAM7C;IACM,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAyBlH;IACM,kBAAkB,CACxB,MAAM,EAAE,cAAc,CAAC,qBAAqB,CAAC,EAC7C,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;QACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,qBAAqB,CAAC;KACzE,GACC,cAAc,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAgC/D;YACa,eAAe;IAGvB,sBAAsB,CAAC,CAAC,EAC7B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAC3B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAE9B;IACD,QAAQ,IAAI,eAAe,CAE1B;IACD,UAAU,IAAI,IAAI,CAOjB;CACD;AACD,qBAAa,YAAY;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,gBAAgB,CAA0B;IAC3C,KAAK,CAAC,CAAC,EACb,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAyBzD;YACa,YAAY;CAM1B;AACD,eAAO,MAAM,uBAAuB,mBAA0B,CAAC;AAC/D,eAAO,MAAM,kBAAkB,cAAqB,CAAC","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"@mariozechner/pi-ai\";\nimport { globalMultiGPUExecutor } from \"./multi-gpu-executor.js\";\n\ninterface StreamProcessorConfig {\n\tenableParallelProcessing?: boolean;\n\tbufferSize?: number;\n\tworkerCount?: number;\n}\ninterface ProcessingStats {\n\ttotalChunks: number;\n\tprocessedChunks: number;\n\tbufferedChunks: number;\n\tprocessingTime: number;\n}\nexport class AcceleratedStream {\n\tprivate config: Required<StreamProcessorConfig>;\n\tprivate stats: ProcessingStats = {\n\t\ttotalChunks: 0,\n\t\tprocessedChunks: 0,\n\t\tbufferedChunks: 0,\n\t\tprocessingTime: 0,\n\t};\n\tconstructor(config: StreamProcessorConfig = {}) {\n\t\tthis.config = {\n\t\t\tenableParallelProcessing: config.enableParallelProcessing ?? true,\n\t\t\tbufferSize: config.bufferSize ?? 20,\n\t\t\tworkerCount: config.workerCount ?? 4,\n\t\t};\n\t}\n\tasync *process<T>(source: AsyncIterable<T>, processor: (chunk: T) => T | Promise<T>): AsyncGenerator<T, void, void> {\n\t\tif (!this.config.enableParallelProcessing) {\n\t\t\tfor await (const chunk of source) {\n\t\t\t\tyield await processor(chunk);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst buffer: Promise<T>[] = [];\n\t\tconst startTime = Date.now();\n\t\tfor await (const chunk of source) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedPromise = globalMultiGPUExecutor.compute(chunk, processor);\n\t\t\tbuffer.push(processedPromise);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst result = await buffer.shift()!;\n\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\tyield result;\n\t\t\t}\n\t\t}\n\t\twhile (buffer.length > 0) {\n\t\t\tconst result = await buffer.shift()!;\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield result;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t}\n\tasync *accelerateResponse(\n\t\tstream: AsyncGenerator<AssistantMessageEvent>,\n\t\toptions?: {\n\t\t\tonChunk?: (chunk: AssistantMessageEvent) => void;\n\t\t\ttransformChunk?: (chunk: AssistantMessageEvent) => AssistantMessageEvent;\n\t\t},\n\t): AsyncGenerator<AssistantMessageEvent, AssistantMessage, void> {\n\t\tconst buffer: AssistantMessageEvent[] = [];\n\t\tlet finalMessage: AssistantMessage | null = null;\n\t\tconst startTime = Date.now();\n\t\tfor await (const event of stream) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedEvent = options?.transformChunk\n\t\t\t\t? await globalMultiGPUExecutor.compute(event, options.transformChunk)\n\t\t\t\t: event;\n\t\t\toptions?.onChunk?.(processedEvent);\n\t\t\tbuffer.push(processedEvent);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst toYield = buffer.splice(0, buffer.length - Math.floor(this.config.bufferSize / 2));\n\t\t\t\tfor (const e of toYield) {\n\t\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\t\tyield e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\tfinalMessage = await this.getFinalMessage(stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfor (const event of buffer) {\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield event;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t\tif (!finalMessage) {\n\t\t\tthrow new Error(\"Stream ended without final message\");\n\t\t}\n\t\treturn finalMessage;\n\t}\n\tprivate async getFinalMessage(_stream: AsyncGenerator<AssistantMessageEvent>): Promise<AssistantMessage> {\n\t\treturn {} as AssistantMessage;\n\t}\n\tasync processMultipleStreams<T>(\n\t\tstreams: AsyncIterable<T>[],\n\t\tprocessor: (chunk: T) => T | Promise<T>,\n\t): Promise<AsyncGenerator<T>[]> {\n\t\treturn streams.map((stream) => this.process(stream, processor));\n\t}\n\tgetStats(): ProcessingStats {\n\t\treturn { ...this.stats };\n\t}\n\tresetStats(): void {\n\t\tthis.stats = {\n\t\t\ttotalChunks: 0,\n\t\t\tprocessedChunks: 0,\n\t\t\tbufferedChunks: 0,\n\t\t\tprocessingTime: 0,\n\t\t};\n\t}\n}\nexport class StreamMerger {\n\tprivate buffer: Map<string, any[]> = new Map();\n\tprivate completedStreams: Set<string> = new Set();\n\tasync *merge<T>(\n\t\tstreams: Map<string, AsyncIterable<T>>,\n\t\toptions?: { bufferSize?: number },\n\t): AsyncGenerator<{ source: string; data: T }, void, void> {\n\t\tconst _bufferSize = options?.bufferSize ?? 100;\n\t\tconst iterators = new Map<string, AsyncIterator<T>>();\n\t\tfor (const [name, stream] of streams) {\n\t\t\titerators.set(name, stream[Symbol.asyncIterator]());\n\t\t\tthis.buffer.set(name, []);\n\t\t}\n\t\tconst pendingReads = new Map<string, Promise<IteratorResult<T>>>();\n\t\tfor (const [name, iterator] of iterators) {\n\t\t\tpendingReads.set(name, iterator.next());\n\t\t}\n\t\twhile (pendingReads.size > 0) {\n\t\t\tconst [name, result] = await this.racePromises(pendingReads);\n\t\t\tif (result.done) {\n\t\t\t\tthis.completedStreams.add(name);\n\t\t\t\tpendingReads.delete(name);\n\t\t\t\titerators.delete(name);\n\t\t\t} else {\n\t\t\t\tyield { source: name, data: result.value };\n\t\t\t\tconst iterator = iterators.get(name);\n\t\t\t\tif (iterator) {\n\t\t\t\t\tpendingReads.set(name, iterator.next());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async racePromises<T>(promises: Map<string, Promise<T>>): Promise<[string, T]> {\n\t\tconst entries = Array.from(promises.entries());\n\t\tconst racing = entries.map(([name, promise]) => promise.then((result) => ({ name, result })));\n\t\tconst winner = await Promise.race(racing);\n\t\treturn [winner.name, winner.result];\n\t}\n}\nexport const globalAcceleratedStream = new AcceleratedStream();\nexport const globalStreamMerger = new StreamMerger();\n"]}
|
|
@@ -73,7 +73,7 @@ export class AcceleratedStream {
|
|
|
73
73
|
}
|
|
74
74
|
return finalMessage;
|
|
75
75
|
}
|
|
76
|
-
async getFinalMessage(
|
|
76
|
+
async getFinalMessage(_stream) {
|
|
77
77
|
return {};
|
|
78
78
|
}
|
|
79
79
|
async processMultipleStreams(streams, processor) {
|
|
@@ -95,7 +95,7 @@ export class StreamMerger {
|
|
|
95
95
|
buffer = new Map();
|
|
96
96
|
completedStreams = new Set();
|
|
97
97
|
async *merge(streams, options) {
|
|
98
|
-
const
|
|
98
|
+
const _bufferSize = options?.bufferSize ?? 100;
|
|
99
99
|
const iterators = new Map();
|
|
100
100
|
for (const [name, stream] of streams) {
|
|
101
101
|
iterators.set(name, stream[Symbol.asyncIterator]());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accelerated-stream.js","sourceRoot":"","sources":["../../src/core/accelerated-stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"@mariozechner/pi-ai\";\nimport { globalMultiGPUExecutor } from \"./multi-gpu-executor.js\";\n\ninterface StreamProcessorConfig {\n\tenableParallelProcessing?: boolean;\n\tbufferSize?: number;\n\tworkerCount?: number;\n}\ninterface ProcessingStats {\n\ttotalChunks: number;\n\tprocessedChunks: number;\n\tbufferedChunks: number;\n\tprocessingTime: number;\n}\nexport class AcceleratedStream {\n\tprivate config: Required<StreamProcessorConfig>;\n\tprivate stats: ProcessingStats = {\n\t\ttotalChunks: 0,\n\t\tprocessedChunks: 0,\n\t\tbufferedChunks: 0,\n\t\tprocessingTime: 0,\n\t};\n\tconstructor(config: StreamProcessorConfig = {}) {\n\t\tthis.config = {\n\t\t\tenableParallelProcessing: config.enableParallelProcessing ?? true,\n\t\t\tbufferSize: config.bufferSize ?? 20,\n\t\t\tworkerCount: config.workerCount ?? 4,\n\t\t};\n\t}\n\tasync *process<T>(source: AsyncIterable<T>, processor: (chunk: T) => T | Promise<T>): AsyncGenerator<T, void, void> {\n\t\tif (!this.config.enableParallelProcessing) {\n\t\t\tfor await (const chunk of source) {\n\t\t\t\tyield await processor(chunk);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst buffer: Promise<T>[] = [];\n\t\tconst startTime = Date.now();\n\t\tfor await (const chunk of source) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedPromise = globalMultiGPUExecutor.compute(chunk, processor);\n\t\t\tbuffer.push(processedPromise);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst result = await buffer.shift()!;\n\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\tyield result;\n\t\t\t}\n\t\t}\n\t\twhile (buffer.length > 0) {\n\t\t\tconst result = await buffer.shift()!;\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield result;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t}\n\tasync *accelerateResponse(\n\t\tstream: AsyncGenerator<AssistantMessageEvent>,\n\t\toptions?: {\n\t\t\tonChunk?: (chunk: AssistantMessageEvent) => void;\n\t\t\ttransformChunk?: (chunk: AssistantMessageEvent) => AssistantMessageEvent;\n\t\t},\n\t): AsyncGenerator<AssistantMessageEvent, AssistantMessage, void> {\n\t\tconst buffer: AssistantMessageEvent[] = [];\n\t\tlet finalMessage: AssistantMessage | null = null;\n\t\tconst startTime = Date.now();\n\t\tfor await (const event of stream) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedEvent = options?.transformChunk\n\t\t\t\t? await globalMultiGPUExecutor.compute(event, options.transformChunk)\n\t\t\t\t: event;\n\t\t\toptions?.onChunk?.(processedEvent);\n\t\t\tbuffer.push(processedEvent);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst toYield = buffer.splice(0, buffer.length - Math.floor(this.config.bufferSize / 2));\n\t\t\t\tfor (const e of toYield) {\n\t\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\t\tyield e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\tfinalMessage = await this.getFinalMessage(stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfor (const event of buffer) {\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield event;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t\tif (!finalMessage) {\n\t\t\tthrow new Error(\"Stream ended without final message\");\n\t\t}\n\t\treturn finalMessage;\n\t}\n\tprivate async getFinalMessage(stream: AsyncGenerator<AssistantMessageEvent>): Promise<AssistantMessage> {\n\t\treturn {} as AssistantMessage;\n\t}\n\tasync processMultipleStreams<T>(\n\t\tstreams: AsyncIterable<T>[],\n\t\tprocessor: (chunk: T) => T | Promise<T>,\n\t): Promise<AsyncGenerator<T>[]> {\n\t\treturn streams.map((stream) => this.process(stream, processor));\n\t}\n\tgetStats(): ProcessingStats {\n\t\treturn { ...this.stats };\n\t}\n\tresetStats(): void {\n\t\tthis.stats = {\n\t\t\ttotalChunks: 0,\n\t\t\tprocessedChunks: 0,\n\t\t\tbufferedChunks: 0,\n\t\t\tprocessingTime: 0,\n\t\t};\n\t}\n}\nexport class StreamMerger {\n\tprivate buffer: Map<string, any[]> = new Map();\n\tprivate completedStreams: Set<string> = new Set();\n\tasync *merge<T>(\n\t\tstreams: Map<string, AsyncIterable<T>>,\n\t\toptions?: { bufferSize?: number },\n\t): AsyncGenerator<{ source: string; data: T }, void, void> {\n\t\tconst bufferSize = options?.bufferSize ?? 100;\n\t\tconst iterators = new Map<string, AsyncIterator<T>>();\n\t\tfor (const [name, stream] of streams) {\n\t\t\titerators.set(name, stream[Symbol.asyncIterator]());\n\t\t\tthis.buffer.set(name, []);\n\t\t}\n\t\tconst pendingReads = new Map<string, Promise<IteratorResult<T>>>();\n\t\tfor (const [name, iterator] of iterators) {\n\t\t\tpendingReads.set(name, iterator.next());\n\t\t}\n\t\twhile (pendingReads.size > 0) {\n\t\t\tconst [name, result] = await this.racePromises(pendingReads);\n\t\t\tif (result.done) {\n\t\t\t\tthis.completedStreams.add(name);\n\t\t\t\tpendingReads.delete(name);\n\t\t\t\titerators.delete(name);\n\t\t\t} else {\n\t\t\t\tyield { source: name, data: result.value };\n\t\t\t\tconst iterator = iterators.get(name);\n\t\t\t\tif (iterator) {\n\t\t\t\t\tpendingReads.set(name, iterator.next());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async racePromises<T>(promises: Map<string, Promise<T>>): Promise<[string, T]> {\n\t\tconst entries = Array.from(promises.entries());\n\t\tconst racing = entries.map(([name, promise]) => promise.then((result) => ({ name, result })));\n\t\tconst winner = await Promise.race(racing);\n\t\treturn [winner.name, winner.result];\n\t}\n}\nexport const globalAcceleratedStream = new AcceleratedStream();\nexport const globalStreamMerger = new StreamMerger();\n"]}
|
|
1
|
+
{"version":3,"file":"accelerated-stream.js","sourceRoot":"","sources":["../../src/core/accelerated-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAajE,MAAM,OAAO,iBAAiB;IACrB,MAAM,CAAkC;IACxC,KAAK,GAAoB;QAChC,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,CAAC;KACjB,CAAC;IACF,YAAY,MAAM,GAA0B,EAAE,EAAE;QAC/C,IAAI,CAAC,MAAM,GAAG;YACb,wBAAwB,EAAE,MAAM,CAAC,wBAAwB,IAAI,IAAI;YACjE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;SACpC,CAAC;IAAA,CACF;IACD,KAAK,CAAC,CAAC,OAAO,CAAI,MAAwB,EAAE,SAAuC,EAAiC;QACnH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC;YAC3C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAClC,MAAM,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO;QACR,CAAC;QACD,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAG,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC;YACd,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAG,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC7B,MAAM,MAAM,CAAC;QACd,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAAA,CACpD;IACD,KAAK,CAAC,CAAC,kBAAkB,CACxB,MAA6C,EAC7C,OAGC,EAC+D;QAChE,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc;gBAC7C,CAAC,CAAC,MAAM,sBAAsB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;gBACrE,CAAC,CAAC,KAAK,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;oBAC7B,MAAM,CAAC,CAAC;gBACT,CAAC;YACF,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrD,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM;YACP,CAAC;QACF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC7B,MAAM,KAAK,CAAC;QACb,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACpD,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,YAAY,CAAC;IAAA,CACpB;IACO,KAAK,CAAC,eAAe,CAAC,OAA8C,EAA6B;QACxG,OAAO,EAAsB,CAAC;IAAA,CAC9B;IACD,KAAK,CAAC,sBAAsB,CAC3B,OAA2B,EAC3B,SAAuC,EACR;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAAA,CAChE;IACD,QAAQ,GAAoB;QAC3B,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACzB;IACD,UAAU,GAAS;QAClB,IAAI,CAAC,KAAK,GAAG;YACZ,WAAW,EAAE,CAAC;YACd,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;SACjB,CAAC;IAAA,CACF;CACD;AACD,MAAM,OAAO,YAAY;IAChB,MAAM,GAAuB,IAAI,GAAG,EAAE,CAAC;IACvC,gBAAgB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAClD,KAAK,CAAC,CAAC,KAAK,CACX,OAAsC,EACtC,OAAiC,EACyB;QAC1D,MAAM,WAAW,GAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsC,CAAC;QACnE,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1C,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACP,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,QAAQ,EAAE,CAAC;oBACd,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzC,CAAC;YACF,CAAC;QACF,CAAC;IAAA,CACD;IACO,KAAK,CAAC,YAAY,CAAI,QAAiC,EAAwB;QACtF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAAA,CACpC;CACD;AACD,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"@mariozechner/pi-ai\";\nimport { globalMultiGPUExecutor } from \"./multi-gpu-executor.js\";\n\ninterface StreamProcessorConfig {\n\tenableParallelProcessing?: boolean;\n\tbufferSize?: number;\n\tworkerCount?: number;\n}\ninterface ProcessingStats {\n\ttotalChunks: number;\n\tprocessedChunks: number;\n\tbufferedChunks: number;\n\tprocessingTime: number;\n}\nexport class AcceleratedStream {\n\tprivate config: Required<StreamProcessorConfig>;\n\tprivate stats: ProcessingStats = {\n\t\ttotalChunks: 0,\n\t\tprocessedChunks: 0,\n\t\tbufferedChunks: 0,\n\t\tprocessingTime: 0,\n\t};\n\tconstructor(config: StreamProcessorConfig = {}) {\n\t\tthis.config = {\n\t\t\tenableParallelProcessing: config.enableParallelProcessing ?? true,\n\t\t\tbufferSize: config.bufferSize ?? 20,\n\t\t\tworkerCount: config.workerCount ?? 4,\n\t\t};\n\t}\n\tasync *process<T>(source: AsyncIterable<T>, processor: (chunk: T) => T | Promise<T>): AsyncGenerator<T, void, void> {\n\t\tif (!this.config.enableParallelProcessing) {\n\t\t\tfor await (const chunk of source) {\n\t\t\t\tyield await processor(chunk);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst buffer: Promise<T>[] = [];\n\t\tconst startTime = Date.now();\n\t\tfor await (const chunk of source) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedPromise = globalMultiGPUExecutor.compute(chunk, processor);\n\t\t\tbuffer.push(processedPromise);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst result = await buffer.shift()!;\n\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\tyield result;\n\t\t\t}\n\t\t}\n\t\twhile (buffer.length > 0) {\n\t\t\tconst result = await buffer.shift()!;\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield result;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t}\n\tasync *accelerateResponse(\n\t\tstream: AsyncGenerator<AssistantMessageEvent>,\n\t\toptions?: {\n\t\t\tonChunk?: (chunk: AssistantMessageEvent) => void;\n\t\t\ttransformChunk?: (chunk: AssistantMessageEvent) => AssistantMessageEvent;\n\t\t},\n\t): AsyncGenerator<AssistantMessageEvent, AssistantMessage, void> {\n\t\tconst buffer: AssistantMessageEvent[] = [];\n\t\tlet finalMessage: AssistantMessage | null = null;\n\t\tconst startTime = Date.now();\n\t\tfor await (const event of stream) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedEvent = options?.transformChunk\n\t\t\t\t? await globalMultiGPUExecutor.compute(event, options.transformChunk)\n\t\t\t\t: event;\n\t\t\toptions?.onChunk?.(processedEvent);\n\t\t\tbuffer.push(processedEvent);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst toYield = buffer.splice(0, buffer.length - Math.floor(this.config.bufferSize / 2));\n\t\t\t\tfor (const e of toYield) {\n\t\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\t\tyield e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\tfinalMessage = await this.getFinalMessage(stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfor (const event of buffer) {\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield event;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t\tif (!finalMessage) {\n\t\t\tthrow new Error(\"Stream ended without final message\");\n\t\t}\n\t\treturn finalMessage;\n\t}\n\tprivate async getFinalMessage(_stream: AsyncGenerator<AssistantMessageEvent>): Promise<AssistantMessage> {\n\t\treturn {} as AssistantMessage;\n\t}\n\tasync processMultipleStreams<T>(\n\t\tstreams: AsyncIterable<T>[],\n\t\tprocessor: (chunk: T) => T | Promise<T>,\n\t): Promise<AsyncGenerator<T>[]> {\n\t\treturn streams.map((stream) => this.process(stream, processor));\n\t}\n\tgetStats(): ProcessingStats {\n\t\treturn { ...this.stats };\n\t}\n\tresetStats(): void {\n\t\tthis.stats = {\n\t\t\ttotalChunks: 0,\n\t\t\tprocessedChunks: 0,\n\t\t\tbufferedChunks: 0,\n\t\t\tprocessingTime: 0,\n\t\t};\n\t}\n}\nexport class StreamMerger {\n\tprivate buffer: Map<string, any[]> = new Map();\n\tprivate completedStreams: Set<string> = new Set();\n\tasync *merge<T>(\n\t\tstreams: Map<string, AsyncIterable<T>>,\n\t\toptions?: { bufferSize?: number },\n\t): AsyncGenerator<{ source: string; data: T }, void, void> {\n\t\tconst _bufferSize = options?.bufferSize ?? 100;\n\t\tconst iterators = new Map<string, AsyncIterator<T>>();\n\t\tfor (const [name, stream] of streams) {\n\t\t\titerators.set(name, stream[Symbol.asyncIterator]());\n\t\t\tthis.buffer.set(name, []);\n\t\t}\n\t\tconst pendingReads = new Map<string, Promise<IteratorResult<T>>>();\n\t\tfor (const [name, iterator] of iterators) {\n\t\t\tpendingReads.set(name, iterator.next());\n\t\t}\n\t\twhile (pendingReads.size > 0) {\n\t\t\tconst [name, result] = await this.racePromises(pendingReads);\n\t\t\tif (result.done) {\n\t\t\t\tthis.completedStreams.add(name);\n\t\t\t\tpendingReads.delete(name);\n\t\t\t\titerators.delete(name);\n\t\t\t} else {\n\t\t\t\tyield { source: name, data: result.value };\n\t\t\t\tconst iterator = iterators.get(name);\n\t\t\t\tif (iterator) {\n\t\t\t\t\tpendingReads.set(name, iterator.next());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async racePromises<T>(promises: Map<string, Promise<T>>): Promise<[string, T]> {\n\t\tconst entries = Array.from(promises.entries());\n\t\tconst racing = entries.map(([name, promise]) => promise.then((result) => ({ name, result })));\n\t\tconst winner = await Promise.race(racing);\n\t\treturn [winner.name, winner.result];\n\t}\n}\nexport const globalAcceleratedStream = new AcceleratedStream();\nexport const globalStreamMerger = new StreamMerger();\n"]}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import type { Agent, AgentEvent, AgentMessage, AgentState, AgentTool, ThinkingLevel } from "@mariozechner/pi-agent-core";
|
|
16
16
|
import type { ImageContent, Model, TextContent } from "@mariozechner/pi-ai";
|
|
17
|
+
import type { AgentMode } from "./agent-modes.js";
|
|
17
18
|
import { type BashResult } from "./bash-executor.js";
|
|
18
19
|
import { type CompactionResult } from "./compaction/index.js";
|
|
19
20
|
import { type ContextUsage, type ExtensionCommandContextActions, type ExtensionErrorListener, ExtensionRunner, type ExtensionUIContext, type InputSource, type ShutdownHandler, type ToolDefinition, type ToolInfo } from "./extensions/index.js";
|
|
@@ -24,7 +25,6 @@ import type { ResourceLoader } from "./resource-loader.js";
|
|
|
24
25
|
import type { BranchSummaryEntry, SessionManager } from "./session-manager.js";
|
|
25
26
|
import type { SettingsManager } from "./settings-manager.js";
|
|
26
27
|
import type { BashOperations } from "./tools/bash.js";
|
|
27
|
-
import type { AgentMode } from "./agent-modes.js";
|
|
28
28
|
/** Parsed skill block from a user message */
|
|
29
29
|
export interface ParsedSkillBlock {
|
|
30
30
|
name: string;
|
|
@@ -415,7 +415,6 @@ export declare class AgentSession {
|
|
|
415
415
|
* Check if current model supports thinking/reasoning.
|
|
416
416
|
*/
|
|
417
417
|
supportsThinking(): boolean;
|
|
418
|
-
private _getThinkingLevelForModelSwitch;
|
|
419
418
|
private _clampThinkingLevel;
|
|
420
419
|
/**
|
|
421
420
|
* Set steering message mode.
|