modelinfo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +130 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/caps.d.ts +5 -0
- package/dist/commands/caps.js +37 -0
- package/dist/commands/caps.js.map +1 -0
- package/dist/commands/cost.d.ts +5 -0
- package/dist/commands/cost.js +37 -0
- package/dist/commands/cost.js.map +1 -0
- package/dist/commands/diff.d.ts +6 -0
- package/dist/commands/diff.js +62 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.js +38 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/limit.d.ts +5 -0
- package/dist/commands/limit.js +37 -0
- package/dist/commands/limit.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.js +46 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/providers.d.ts +4 -0
- package/dist/commands/providers.js +20 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/search.d.ts +6 -0
- package/dist/commands/search.js +24 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/shared.d.ts +15 -0
- package/dist/commands/shared.js +40 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/show.d.ts +5 -0
- package/dist/commands/show.js +35 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.js +22 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/config.d.ts +21 -0
- package/dist/core/config.js +29 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.js +18 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.js +10 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/data/cache.d.ts +9 -0
- package/dist/data/cache.js +66 -0
- package/dist/data/cache.js.map +1 -0
- package/dist/data/index.d.ts +13 -0
- package/dist/data/index.js +275 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/normalize.d.ts +2 -0
- package/dist/data/normalize.js +157 -0
- package/dist/data/normalize.js.map +1 -0
- package/dist/data/remote.d.ts +11 -0
- package/dist/data/remote.js +160 -0
- package/dist/data/remote.js.map +1 -0
- package/dist/data/schema.d.ts +12 -0
- package/dist/data/schema.js +44 -0
- package/dist/data/schema.js.map +1 -0
- package/dist/data/types.d.ts +142 -0
- package/dist/data/types.js +2 -0
- package/dist/data/types.js.map +1 -0
- package/dist/data/version.d.ts +5 -0
- package/dist/data/version.js +28 -0
- package/dist/data/version.js.map +1 -0
- package/dist/format/detail.d.ts +11 -0
- package/dist/format/detail.js +139 -0
- package/dist/format/detail.js.map +1 -0
- package/dist/format/json.d.ts +258 -0
- package/dist/format/json.js +174 -0
- package/dist/format/json.js.map +1 -0
- package/dist/format/table.d.ts +7 -0
- package/dist/format/table.js +120 -0
- package/dist/format/table.js.map +1 -0
- package/dist/format/value.d.ts +8 -0
- package/dist/format/value.js +47 -0
- package/dist/format/value.js.map +1 -0
- package/dist/search/fuzzy.d.ts +3 -0
- package/dist/search/fuzzy.js +20 -0
- package/dist/search/fuzzy.js.map +1 -0
- package/dist/search/rank.d.ts +5 -0
- package/dist/search/rank.js +47 -0
- package/dist/search/rank.js.map +1 -0
- package/dist/utils/fs.d.ts +5 -0
- package/dist/utils/fs.js +31 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/numbers.d.ts +3 -0
- package/dist/utils/numbers.js +40 -0
- package/dist/utils/numbers.js.map +1 -0
- package/dist/utils/strings.d.ts +6 -0
- package/dist/utils/strings.js +34 -0
- package/dist/utils/strings.js.map +1 -0
- package/dist/utils/time.d.ts +3 -0
- package/dist/utils/time.js +36 -0
- package/dist/utils/time.js.map +1 -0
- package/package.json +76 -0
- package/seed/all.json +166975 -0
- package/seed/index.json +576348 -0
- package/seed/version.json +8 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 duskzhen
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# modelinfo — a fast CLI to explore AI model capabilities, pricing, limits, and provider metadata.
|
|
2
|
+
|
|
3
|
+
`modelinfo` is a Bun-first TypeScript CLI for exploring AI model metadata from [PublicProviderConf](https://github.com/ThinkInAIXYZ/PublicProviderConf). It keeps a local normalized index for fast lookups, ships with a bundled seed dataset so a fresh install can work offline, and refreshes from upstream when the version file changes.
|
|
4
|
+
|
|
5
|
+
Same dataset, web version: [models.anya2a.com](https://models.anya2a.com/).
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- Fast default lookup with local normalized index
|
|
10
|
+
- Fuzzy search across models and providers
|
|
11
|
+
- Provider listing and per-provider model listing
|
|
12
|
+
- Side-by-side model diff
|
|
13
|
+
- Focused capability, cost, and limit views
|
|
14
|
+
- Local cache with bundled seed files
|
|
15
|
+
- Auto refresh using the upstream version file
|
|
16
|
+
|
|
17
|
+
## Requirements
|
|
18
|
+
|
|
19
|
+
- Bun 1.0+
|
|
20
|
+
- Node.js 20+ for running the published CLI package
|
|
21
|
+
|
|
22
|
+
## Install
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
bun install
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Development
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
bun run build:seed
|
|
32
|
+
bun run build
|
|
33
|
+
bun run dev -- --help
|
|
34
|
+
bun run test
|
|
35
|
+
bun run lint
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The first local cache is copied from the packaged `seed/` directory into `~/.modelinfo/`. After that, `modelinfo` uses `~/.modelinfo/index.json` for normal reads and checks the remote version file periodically.
|
|
39
|
+
|
|
40
|
+
## Usage
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
modelinfo gpt-4o
|
|
44
|
+
modelinfo search qwen
|
|
45
|
+
modelinfo providers
|
|
46
|
+
modelinfo list 302ai
|
|
47
|
+
modelinfo diff gpt-4o gpt-4
|
|
48
|
+
modelinfo caps gpt-4o
|
|
49
|
+
modelinfo cost gpt-4o
|
|
50
|
+
modelinfo limit gpt-4o
|
|
51
|
+
modelinfo update
|
|
52
|
+
modelinfo doctor
|
|
53
|
+
modelinfo gpt-4o --output json
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Provider filters
|
|
57
|
+
|
|
58
|
+
Most model commands accept `--provider` to narrow duplicate model ids:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
modelinfo gpt-4o --provider openai
|
|
62
|
+
modelinfo search gpt --provider openrouter
|
|
63
|
+
modelinfo cost gpt-4o --provider openai
|
|
64
|
+
modelinfo diff gpt-4o gpt-4.1 --provider-a openai --provider-b openai
|
|
65
|
+
modelinfo search qwen --provider openrouter --output json
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Cache layout
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
~/.modelinfo/
|
|
72
|
+
all.json
|
|
73
|
+
version.json
|
|
74
|
+
index.json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Bundled seed files are published inside the npm package:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
seed/
|
|
81
|
+
all.json
|
|
82
|
+
version.json
|
|
83
|
+
index.json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Commands
|
|
87
|
+
|
|
88
|
+
- `modelinfo <model>`: resolve and show a model
|
|
89
|
+
- `modelinfo search <keyword>`: fuzzy search models
|
|
90
|
+
- `modelinfo providers`: list providers
|
|
91
|
+
- `modelinfo list <provider>`: list models under a provider
|
|
92
|
+
- `modelinfo update`: refresh local cache if upstream changed
|
|
93
|
+
- `modelinfo diff <modelA> <modelB>`: compare two models
|
|
94
|
+
- `modelinfo caps <model>`: show capabilities only
|
|
95
|
+
- `modelinfo cost <model>`: show pricing only
|
|
96
|
+
- `modelinfo limit <model>`: show token limits only
|
|
97
|
+
- `modelinfo doctor`: show cache and version status
|
|
98
|
+
|
|
99
|
+
## Publish
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
bun run build:seed
|
|
103
|
+
bun run build
|
|
104
|
+
npm publish
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`prepack` already runs the seed build and TypeScript build, so a regular `npm publish` includes `dist/` and `seed/`.
|
|
108
|
+
|
|
109
|
+
## Release automation
|
|
110
|
+
|
|
111
|
+
This repository includes GitHub Actions for CI and automated releases:
|
|
112
|
+
|
|
113
|
+
- `CI`: runs format check, lint, test, and build on pushes and pull requests
|
|
114
|
+
- `Release Please`: watches commits on `master`, opens or updates a release PR, and automatically bumps the version once the release PR is merged
|
|
115
|
+
- npm publish runs automatically after a release is created
|
|
116
|
+
|
|
117
|
+
Required GitHub secret:
|
|
118
|
+
|
|
119
|
+
- `NPM_TOKEN`: npm automation token with publish permission for `modelinfo`
|
|
120
|
+
|
|
121
|
+
Recommended commit style:
|
|
122
|
+
|
|
123
|
+
- `feat: add provider aliases`
|
|
124
|
+
- `fix: handle missing cache version`
|
|
125
|
+
- `chore: update dependencies`
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command, Option } from "commander";
|
|
3
|
+
import { APP_NAME, APP_VERSION } from "./core/config.js";
|
|
4
|
+
import { isErrorWithMessage } from "./core/errors.js";
|
|
5
|
+
import { logError } from "./core/logger.js";
|
|
6
|
+
import { runCapsCommand } from "./commands/caps.js";
|
|
7
|
+
import { runCostCommand } from "./commands/cost.js";
|
|
8
|
+
import { runDiffCommand } from "./commands/diff.js";
|
|
9
|
+
import { runDoctorCommand } from "./commands/doctor.js";
|
|
10
|
+
import { runLimitCommand } from "./commands/limit.js";
|
|
11
|
+
import { runListCommand } from "./commands/list.js";
|
|
12
|
+
import { runProvidersCommand } from "./commands/providers.js";
|
|
13
|
+
import { runSearchCommand } from "./commands/search.js";
|
|
14
|
+
import { runShowCommand } from "./commands/show.js";
|
|
15
|
+
import { runUpdateCommand } from "./commands/update.js";
|
|
16
|
+
const program = new Command();
|
|
17
|
+
const knownCommands = new Set([
|
|
18
|
+
"show",
|
|
19
|
+
"search",
|
|
20
|
+
"providers",
|
|
21
|
+
"list",
|
|
22
|
+
"update",
|
|
23
|
+
"diff",
|
|
24
|
+
"caps",
|
|
25
|
+
"cost",
|
|
26
|
+
"limit",
|
|
27
|
+
"doctor",
|
|
28
|
+
"help",
|
|
29
|
+
]);
|
|
30
|
+
function outputOption() {
|
|
31
|
+
return new Option("-o, --output <format>", "Output format")
|
|
32
|
+
.choices(["table", "json"])
|
|
33
|
+
.default("table");
|
|
34
|
+
}
|
|
35
|
+
program
|
|
36
|
+
.name(APP_NAME)
|
|
37
|
+
.description("Explore AI model capabilities, pricing, limits, and provider metadata.")
|
|
38
|
+
.version(APP_VERSION)
|
|
39
|
+
.showHelpAfterError();
|
|
40
|
+
program
|
|
41
|
+
.command("show")
|
|
42
|
+
.argument("<model>", "Model id or name")
|
|
43
|
+
.option("-p, --provider <provider>", "Filter by provider id/name/display_name")
|
|
44
|
+
.addOption(outputOption())
|
|
45
|
+
.action(async (model, options) => {
|
|
46
|
+
await runShowCommand(model, options);
|
|
47
|
+
});
|
|
48
|
+
program
|
|
49
|
+
.command("search")
|
|
50
|
+
.argument("<keyword>", "Keyword to search")
|
|
51
|
+
.option("-p, --provider <provider>", "Filter by provider id/name/display_name")
|
|
52
|
+
.addOption(outputOption())
|
|
53
|
+
.addOption(new Option("--limit <number>", "Limit the number of rows").argParser((value) => Number.parseInt(value, 10)))
|
|
54
|
+
.action(async (keyword, options) => {
|
|
55
|
+
await runSearchCommand(keyword, options);
|
|
56
|
+
});
|
|
57
|
+
program
|
|
58
|
+
.command("providers")
|
|
59
|
+
.addOption(outputOption())
|
|
60
|
+
.action(async (options) => {
|
|
61
|
+
await runProvidersCommand(options);
|
|
62
|
+
});
|
|
63
|
+
program
|
|
64
|
+
.command("list")
|
|
65
|
+
.argument("<provider>", "Provider id or name")
|
|
66
|
+
.addOption(outputOption())
|
|
67
|
+
.action(async (provider, options) => {
|
|
68
|
+
await runListCommand(provider, options);
|
|
69
|
+
});
|
|
70
|
+
program
|
|
71
|
+
.command("update")
|
|
72
|
+
.addOption(outputOption())
|
|
73
|
+
.action(async (options) => {
|
|
74
|
+
await runUpdateCommand(options);
|
|
75
|
+
});
|
|
76
|
+
program
|
|
77
|
+
.command("diff")
|
|
78
|
+
.argument("<modelA>", "Left model")
|
|
79
|
+
.argument("<modelB>", "Right model")
|
|
80
|
+
.option("--provider-a <provider>", "Provider filter for the left model")
|
|
81
|
+
.option("--provider-b <provider>", "Provider filter for the right model")
|
|
82
|
+
.addOption(outputOption())
|
|
83
|
+
.action(async (modelA, modelB, options) => {
|
|
84
|
+
await runDiffCommand(modelA, modelB, options);
|
|
85
|
+
});
|
|
86
|
+
program
|
|
87
|
+
.command("caps")
|
|
88
|
+
.argument("<model>", "Model id or name")
|
|
89
|
+
.option("-p, --provider <provider>", "Filter by provider id/name/display_name")
|
|
90
|
+
.addOption(outputOption())
|
|
91
|
+
.action(async (model, options) => {
|
|
92
|
+
await runCapsCommand(model, options);
|
|
93
|
+
});
|
|
94
|
+
program
|
|
95
|
+
.command("cost")
|
|
96
|
+
.argument("<model>", "Model id or name")
|
|
97
|
+
.option("-p, --provider <provider>", "Filter by provider id/name/display_name")
|
|
98
|
+
.addOption(outputOption())
|
|
99
|
+
.action(async (model, options) => {
|
|
100
|
+
await runCostCommand(model, options);
|
|
101
|
+
});
|
|
102
|
+
program
|
|
103
|
+
.command("limit")
|
|
104
|
+
.argument("<model>", "Model id or name")
|
|
105
|
+
.option("-p, --provider <provider>", "Filter by provider id/name/display_name")
|
|
106
|
+
.addOption(outputOption())
|
|
107
|
+
.action(async (model, options) => {
|
|
108
|
+
await runLimitCommand(model, options);
|
|
109
|
+
});
|
|
110
|
+
program
|
|
111
|
+
.command("doctor")
|
|
112
|
+
.addOption(outputOption())
|
|
113
|
+
.action(async (options) => {
|
|
114
|
+
await runDoctorCommand(options);
|
|
115
|
+
});
|
|
116
|
+
try {
|
|
117
|
+
const rawArgs = process.argv.slice(2);
|
|
118
|
+
if (rawArgs.length === 0) {
|
|
119
|
+
program.help();
|
|
120
|
+
}
|
|
121
|
+
const argv = rawArgs[0] && !rawArgs[0].startsWith("-") && !knownCommands.has(rawArgs[0])
|
|
122
|
+
? [...process.argv.slice(0, 2), "show", ...rawArgs]
|
|
123
|
+
: process.argv;
|
|
124
|
+
await program.parseAsync(argv);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
logError(isErrorWithMessage(error) ? error.message : String(error));
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ModelinfoError } from "../core/errors.js";
|
|
2
|
+
import { renderCapsDetail } from "../format/detail.js";
|
|
3
|
+
import { capsToJson, modelMatchToJson, writeJson } from "../format/json.js";
|
|
4
|
+
import { renderModelMatchesTable } from "../format/table.js";
|
|
5
|
+
import { requireSingleModel, resolveModelQuery } from "./shared.js";
|
|
6
|
+
export async function runCapsCommand(modelQuery, options) {
|
|
7
|
+
const resolution = await resolveModelQuery(modelQuery, options?.provider);
|
|
8
|
+
const model = requireSingleModel(resolution);
|
|
9
|
+
if (!model) {
|
|
10
|
+
if (resolution.matches.length === 0) {
|
|
11
|
+
if (options?.output === "json") {
|
|
12
|
+
writeJson({ error: "MODEL_NOT_FOUND", query: modelQuery });
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
throw new ModelinfoError(`No model matched "${modelQuery}".`, "MODEL_NOT_FOUND");
|
|
17
|
+
}
|
|
18
|
+
if (options?.output === "json") {
|
|
19
|
+
writeJson({
|
|
20
|
+
query: modelQuery,
|
|
21
|
+
count: resolution.matches.length,
|
|
22
|
+
results: resolution.matches.map(modelMatchToJson),
|
|
23
|
+
});
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
process.stdout.write(`${renderModelMatchesTable(resolution.matches, { includeReason: true })}\n`);
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (options?.output === "json") {
|
|
32
|
+
writeJson(capsToJson(model));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
process.stdout.write(`${renderCapsDetail(model)}\n`);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=caps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caps.js","sourceRoot":"","sources":["../../src/commands/caps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,OAAsD;IAEtD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC/B,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,cAAc,CAAC,qBAAqB,UAAU,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,CAAC;gBACR,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;gBAChC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;aAClD,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,uBAAuB,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,IAAI,CAC5E,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ModelinfoError } from "../core/errors.js";
|
|
2
|
+
import { renderCostDetail } from "../format/detail.js";
|
|
3
|
+
import { costToJson, modelMatchToJson, writeJson } from "../format/json.js";
|
|
4
|
+
import { renderModelMatchesTable } from "../format/table.js";
|
|
5
|
+
import { requireSingleModel, resolveModelQuery } from "./shared.js";
|
|
6
|
+
export async function runCostCommand(modelQuery, options) {
|
|
7
|
+
const resolution = await resolveModelQuery(modelQuery, options?.provider);
|
|
8
|
+
const model = requireSingleModel(resolution);
|
|
9
|
+
if (!model) {
|
|
10
|
+
if (resolution.matches.length === 0) {
|
|
11
|
+
if (options?.output === "json") {
|
|
12
|
+
writeJson({ error: "MODEL_NOT_FOUND", query: modelQuery });
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
throw new ModelinfoError(`No model matched "${modelQuery}".`, "MODEL_NOT_FOUND");
|
|
17
|
+
}
|
|
18
|
+
if (options?.output === "json") {
|
|
19
|
+
writeJson({
|
|
20
|
+
query: modelQuery,
|
|
21
|
+
count: resolution.matches.length,
|
|
22
|
+
results: resolution.matches.map(modelMatchToJson),
|
|
23
|
+
});
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
process.stdout.write(`${renderModelMatchesTable(resolution.matches, { includeReason: true })}\n`);
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (options?.output === "json") {
|
|
32
|
+
writeJson(costToJson(model));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
process.stdout.write(`${renderCostDetail(model)}\n`);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,OAAsD;IAEtD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC/B,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,cAAc,CAAC,qBAAqB,UAAU,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,CAAC;gBACR,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;gBAChC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;aAClD,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,uBAAuB,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,IAAI,CAC5E,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ModelinfoError } from "../core/errors.js";
|
|
2
|
+
import { diffToJson, modelMatchToJson, writeJson } from "../format/json.js";
|
|
3
|
+
import { renderDiffTable, renderModelMatchesTable } from "../format/table.js";
|
|
4
|
+
import { resolveModelQuery, requireSingleModel } from "./shared.js";
|
|
5
|
+
export async function runDiffCommand(modelAQuery, modelBQuery, options) {
|
|
6
|
+
const leftResolution = await resolveModelQuery(modelAQuery, options?.providerA);
|
|
7
|
+
const rightResolution = await resolveModelQuery(modelBQuery, options?.providerB);
|
|
8
|
+
const left = requireSingleModel(leftResolution);
|
|
9
|
+
const right = requireSingleModel(rightResolution);
|
|
10
|
+
if (!left) {
|
|
11
|
+
if (leftResolution.matches.length === 0) {
|
|
12
|
+
if (options?.output === "json") {
|
|
13
|
+
writeJson({ error: "MODEL_NOT_FOUND", side: "left", query: modelAQuery });
|
|
14
|
+
process.exitCode = 1;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
throw new ModelinfoError(`No model matched "${modelAQuery}".`, "MODEL_NOT_FOUND");
|
|
18
|
+
}
|
|
19
|
+
if (options?.output === "json") {
|
|
20
|
+
writeJson({
|
|
21
|
+
side: "left",
|
|
22
|
+
query: modelAQuery,
|
|
23
|
+
count: leftResolution.matches.length,
|
|
24
|
+
results: leftResolution.matches.map(modelMatchToJson),
|
|
25
|
+
});
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
process.stdout.write(`Left candidates\n${renderModelMatchesTable(leftResolution.matches, { includeReason: true })}\n`);
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!right) {
|
|
34
|
+
if (rightResolution.matches.length === 0) {
|
|
35
|
+
if (options?.output === "json") {
|
|
36
|
+
writeJson({ error: "MODEL_NOT_FOUND", side: "right", query: modelBQuery });
|
|
37
|
+
process.exitCode = 1;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
throw new ModelinfoError(`No model matched "${modelBQuery}".`, "MODEL_NOT_FOUND");
|
|
41
|
+
}
|
|
42
|
+
if (options?.output === "json") {
|
|
43
|
+
writeJson({
|
|
44
|
+
side: "right",
|
|
45
|
+
query: modelBQuery,
|
|
46
|
+
count: rightResolution.matches.length,
|
|
47
|
+
results: rightResolution.matches.map(modelMatchToJson),
|
|
48
|
+
});
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
process.stdout.write(`Right candidates\n${renderModelMatchesTable(rightResolution.matches, { includeReason: true })}\n`);
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (options?.output === "json") {
|
|
57
|
+
writeJson(diffToJson(left, right));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
process.stdout.write(`${renderDiffTable(left, right)}\n`);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getCachePaths } from "../core/config.js";
|
|
2
|
+
import { fetchRemoteVersion } from "../data/remote.js";
|
|
3
|
+
import { readVersionState, readIndexDocument, ensureSeededCache } from "../data/cache.js";
|
|
4
|
+
import { getStaleState } from "../data/version.js";
|
|
5
|
+
import { renderDoctor } from "../format/detail.js";
|
|
6
|
+
import { doctorToJson, writeJson } from "../format/json.js";
|
|
7
|
+
export async function runDoctorCommand(options) {
|
|
8
|
+
const cachePaths = getCachePaths();
|
|
9
|
+
await ensureSeededCache(cachePaths);
|
|
10
|
+
const [index, version] = await Promise.all([
|
|
11
|
+
readIndexDocument(cachePaths),
|
|
12
|
+
readVersionState(cachePaths),
|
|
13
|
+
]);
|
|
14
|
+
let stale = "unknown";
|
|
15
|
+
try {
|
|
16
|
+
const remoteVersion = await fetchRemoteVersion();
|
|
17
|
+
stale = getStaleState(version?.local_updated_at, remoteVersion.updatedAt);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
stale = "unknown";
|
|
21
|
+
}
|
|
22
|
+
if (options?.output === "json") {
|
|
23
|
+
writeJson(doctorToJson(index, version, {
|
|
24
|
+
dir: cachePaths.dir,
|
|
25
|
+
raw: cachePaths.raw,
|
|
26
|
+
version: cachePaths.version,
|
|
27
|
+
index: cachePaths.index,
|
|
28
|
+
}, stale));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
process.stdout.write(`${renderDoctor(index, version, {
|
|
32
|
+
dir: cachePaths.dir,
|
|
33
|
+
raw: cachePaths.raw,
|
|
34
|
+
version: cachePaths.version,
|
|
35
|
+
index: cachePaths.index,
|
|
36
|
+
}, stale)}\n`);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAmC;IACxE,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAEpC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,iBAAiB,CAAC,UAAU,CAAC;QAC7B,gBAAgB,CAAC,UAAU,CAAC;KAC7B,CAAC,CAAC;IAEH,IAAI,KAAK,GAA6B,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACjD,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CACP,YAAY,CACV,KAAK,EACL,OAAO,EACP;YACE,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,EACD,KAAK,CACN,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,YAAY,CACb,KAAK,EACL,OAAO,EACP;QACE,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,EACD,KAAK,CACN,IAAI,CACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ModelinfoError } from "../core/errors.js";
|
|
2
|
+
import { renderLimitDetail } from "../format/detail.js";
|
|
3
|
+
import { limitToJson, modelMatchToJson, writeJson } from "../format/json.js";
|
|
4
|
+
import { renderModelMatchesTable } from "../format/table.js";
|
|
5
|
+
import { requireSingleModel, resolveModelQuery } from "./shared.js";
|
|
6
|
+
export async function runLimitCommand(modelQuery, options) {
|
|
7
|
+
const resolution = await resolveModelQuery(modelQuery, options?.provider);
|
|
8
|
+
const model = requireSingleModel(resolution);
|
|
9
|
+
if (!model) {
|
|
10
|
+
if (resolution.matches.length === 0) {
|
|
11
|
+
if (options?.output === "json") {
|
|
12
|
+
writeJson({ error: "MODEL_NOT_FOUND", query: modelQuery });
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
throw new ModelinfoError(`No model matched "${modelQuery}".`, "MODEL_NOT_FOUND");
|
|
17
|
+
}
|
|
18
|
+
if (options?.output === "json") {
|
|
19
|
+
writeJson({
|
|
20
|
+
query: modelQuery,
|
|
21
|
+
count: resolution.matches.length,
|
|
22
|
+
results: resolution.matches.map(modelMatchToJson),
|
|
23
|
+
});
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
process.stdout.write(`${renderModelMatchesTable(resolution.matches, { includeReason: true })}\n`);
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (options?.output === "json") {
|
|
32
|
+
writeJson(limitToJson(model));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
process.stdout.write(`${renderLimitDetail(model)}\n`);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limit.js","sourceRoot":"","sources":["../../src/commands/limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,OAAsD;IAEtD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC/B,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,cAAc,CAAC,qBAAqB,UAAU,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,CAAC;gBACR,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;gBAChC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;aAClD,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,uBAAuB,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,IAAI,CAC5E,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ModelinfoError } from "../core/errors.js";
|
|
2
|
+
import { getModelsForProvider } from "../data/index.js";
|
|
3
|
+
import { modelSummaryToJson, providerMatchToJson, providerSummaryToJson, writeJson, } from "../format/json.js";
|
|
4
|
+
import { renderProviderModelsTable, renderProvidersTable } from "../format/table.js";
|
|
5
|
+
import { requireSingleProvider, resolveProviderQuery } from "./shared.js";
|
|
6
|
+
export async function runListCommand(providerQuery, options) {
|
|
7
|
+
const resolution = await resolveProviderQuery(providerQuery);
|
|
8
|
+
const provider = requireSingleProvider(resolution);
|
|
9
|
+
if (!provider) {
|
|
10
|
+
if (resolution.matches.length === 0) {
|
|
11
|
+
if (options?.output === "json") {
|
|
12
|
+
writeJson({ error: "PROVIDER_NOT_FOUND", query: providerQuery });
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
throw new ModelinfoError(`No provider matched "${providerQuery}".`, "PROVIDER_NOT_FOUND");
|
|
17
|
+
}
|
|
18
|
+
if (options?.output === "json") {
|
|
19
|
+
writeJson({
|
|
20
|
+
query: providerQuery,
|
|
21
|
+
count: resolution.matches.length,
|
|
22
|
+
results: resolution.matches.map(providerMatchToJson),
|
|
23
|
+
});
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
process.stdout.write(`${renderProvidersTable(resolution.matches)}\n`);
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const models = getModelsForProvider(resolution.index, provider.id).sort((left, right) => {
|
|
32
|
+
const leftLabel = left.model_display_name ?? left.model_name ?? left.model_id;
|
|
33
|
+
const rightLabel = right.model_display_name ?? right.model_name ?? right.model_id;
|
|
34
|
+
return leftLabel.localeCompare(rightLabel);
|
|
35
|
+
});
|
|
36
|
+
if (options?.output === "json") {
|
|
37
|
+
writeJson({
|
|
38
|
+
provider: providerSummaryToJson(provider),
|
|
39
|
+
count: models.length,
|
|
40
|
+
models: models.map(modelSummaryToJson),
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
process.stdout.write(`${renderProviderModelsTable(models)}\n`);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,SAAS,GAEV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAqB,EACrB,OAAmC;IAEnC,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC/B,SAAS,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;gBACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,cAAc,CAAC,wBAAwB,aAAa,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,CAAC;gBACR,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;gBAChC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;aACrD,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACtF,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC9E,MAAM,UAAU,GAAG,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC;QAElF,OAAO,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC;YACR,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,CAAC;YACzC,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC;SACvC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC"}
|