One endpoint in front of every free LLM tier, with automatic failover and no provider key ever leaving the box. Providers are data, not code: adding one is a JSON file plus an env var, never a TypeScript change. Ships 12 providers pre-written; `verify-provider --apply` derives the live model list from your own key. - core: registry, bucketed quota meter (rolling + UTC-calendar windows), key-pool store, 6-step model router with diagnostic rejection reasons - gateway: node:http, failover that commits to a stream only after 200 headers, SSE passthrough with usage sniffing, virtual keys with admin/inference roles - context engine: sqlite sessions and a 5-rung refit ladder, so a 128k thread keeps working when it fails over to an 8k model - cache: exact (sha256, safe-by-default) + opt-in semantic (flat Float32Array) - guard: inbound limits, quota forecasting, limit calibration from upstream headers, key health, secret/PII/injection scanning - dashboard: one self-contained HTML file, live SSE request log, token usage - sdk: zero-dep typed client, drop-in for the OpenAI SDK Zero runtime dependencies. 326 tests, 27-check smoke suite against a scripted mock upstream so routing is testable without spending quota. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
83 lines
2.1 KiB
JSON
83 lines
2.1 KiB
JSON
{
|
|
"name": "freeway",
|
|
"version": "0.1.0",
|
|
"lockfileVersion": 3,
|
|
"requires": true,
|
|
"packages": {
|
|
"": {
|
|
"name": "freeway",
|
|
"version": "0.1.0",
|
|
"workspaces": [
|
|
"packages/core",
|
|
"packages/gateway",
|
|
"packages/sdk"
|
|
],
|
|
"devDependencies": {
|
|
"@types/node": "^22.10.0",
|
|
"typescript": "^5.9.0"
|
|
},
|
|
"engines": {
|
|
"node": ">=22"
|
|
}
|
|
},
|
|
"node_modules/@freeway/core": {
|
|
"resolved": "packages/core",
|
|
"link": true
|
|
},
|
|
"node_modules/@freeway/gateway": {
|
|
"resolved": "packages/gateway",
|
|
"link": true
|
|
},
|
|
"node_modules/@freeway/sdk": {
|
|
"resolved": "packages/sdk",
|
|
"link": true
|
|
},
|
|
"node_modules/@types/node": {
|
|
"version": "22.20.1",
|
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz",
|
|
"integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==",
|
|
"dev": true,
|
|
"license": "MIT",
|
|
"dependencies": {
|
|
"undici-types": "~6.21.0"
|
|
}
|
|
},
|
|
"node_modules/typescript": {
|
|
"version": "5.9.3",
|
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
|
"dev": true,
|
|
"license": "Apache-2.0",
|
|
"bin": {
|
|
"tsc": "bin/tsc",
|
|
"tsserver": "bin/tsserver"
|
|
},
|
|
"engines": {
|
|
"node": ">=14.17"
|
|
}
|
|
},
|
|
"node_modules/undici-types": {
|
|
"version": "6.21.0",
|
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
|
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
|
"dev": true,
|
|
"license": "MIT"
|
|
},
|
|
"packages/core": {
|
|
"name": "@freeway/core",
|
|
"version": "0.1.0"
|
|
},
|
|
"packages/gateway": {
|
|
"name": "@freeway/gateway",
|
|
"version": "0.1.0",
|
|
"dependencies": {
|
|
"@freeway/core": "*"
|
|
}
|
|
},
|
|
"packages/sdk": {
|
|
"name": "@freeway/sdk",
|
|
"version": "0.1.0"
|
|
}
|
|
}
|
|
}
|