proxitor 0.2.1 → 0.4.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/README.md +242 -84
- package/dist/add.mjs +137 -0
- package/dist/add.mjs.map +1 -0
- package/dist/browse.mjs +86 -0
- package/dist/browse.mjs.map +1 -0
- package/dist/cli.mjs +14891 -27
- package/dist/cli.mjs.map +1 -1
- package/dist/config.mjs +46 -0
- package/dist/config.mjs.map +1 -0
- package/dist/config2.mjs +73 -0
- package/dist/config2.mjs.map +1 -0
- package/dist/dist.mjs +1325 -0
- package/dist/dist.mjs.map +1 -0
- package/dist/dist2.mjs +6617 -0
- package/dist/dist2.mjs.map +1 -0
- package/dist/edit.mjs +80 -0
- package/dist/edit.mjs.map +1 -0
- package/dist/list.mjs +31 -0
- package/dist/list.mjs.map +1 -0
- package/dist/prompt.mjs +849 -0
- package/dist/prompt.mjs.map +1 -0
- package/dist/providers.mjs +279 -0
- package/dist/providers.mjs.map +1 -0
- package/dist/remove.mjs +36 -0
- package/dist/remove.mjs.map +1 -0
- package/dist/validate.mjs +25 -0
- package/dist/validate.mjs.map +1 -0
- package/dist/wizard.mjs +192 -0
- package/dist/wizard.mjs.map +1 -0
- package/package.json +6 -18
- package/dist/cli.cjs +0 -36
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.d.cts +0 -1
- package/dist/cli.d.mts +0 -1
- package/dist/index.cjs +0 -10
- package/dist/index.d.cts +0 -91
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts +0 -91
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -2
- package/dist/proxy.cjs +0 -537
- package/dist/proxy.cjs.map +0 -1
- package/dist/proxy.mjs +0 -455
- package/dist/proxy.mjs.map +0 -1
package/dist/browse.mjs
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { autocomplete as Vt, confirm as le, intro as ye, isCancel as R$1, log as R, outro as fe, spinner as vt } from "./dist.mjs";
|
|
2
|
+
import { a as getUniqueProviders, c as formatModelHint, d as formatThroughput, f as fetchModels, g as OpenRouterClient, h as parseModelSlug, i as fetchModelEndpoints, l as formatModelLabel, m as parseModelAuthor, o as formatContextLength, p as formatPrice, s as formatLatency, u as formatPricing } from "./providers.mjs";
|
|
3
|
+
import { addOverrideCommand } from "./add.mjs";
|
|
4
|
+
//#region src/commands/config/browse.ts
|
|
5
|
+
function toOption(m) {
|
|
6
|
+
return {
|
|
7
|
+
value: m.id,
|
|
8
|
+
label: formatModelLabel(m),
|
|
9
|
+
hint: formatModelHint(m)
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function displayModelDetails(model) {
|
|
13
|
+
R.success(`${model.name || model.id}`);
|
|
14
|
+
if (model.description) {
|
|
15
|
+
const desc = model.description.length > 200 ? `${model.description.slice(0, 200)}...` : model.description;
|
|
16
|
+
R.info(` ${desc}`);
|
|
17
|
+
}
|
|
18
|
+
R.info(` Context: ${formatContextLength(model.context_length)} tokens`);
|
|
19
|
+
if (model.top_provider?.max_completion_tokens) R.info(` Max output: ${formatContextLength(model.top_provider.max_completion_tokens)} tokens`);
|
|
20
|
+
R.info(` Pricing: ${formatPricing(model.pricing.prompt, model.pricing.completion)}`);
|
|
21
|
+
if (model.pricing.input_cache_read && model.pricing.input_cache_read !== "0") R.info(` Cache read: ${formatPrice(model.pricing.input_cache_read)}`);
|
|
22
|
+
if (model.pricing.input_cache_write && model.pricing.input_cache_write !== "0") R.info(` Cache write: ${formatPrice(model.pricing.input_cache_write)}`);
|
|
23
|
+
if (model.architecture?.modality) R.info(` Modality: ${model.architecture.modality}`);
|
|
24
|
+
if (model.supported_parameters?.length) R.info(` Parameters: ${model.supported_parameters.join(", ")}`);
|
|
25
|
+
}
|
|
26
|
+
async function displayProviders(client, model) {
|
|
27
|
+
const author = parseModelAuthor(model.id);
|
|
28
|
+
const slug = parseModelSlug(model.id);
|
|
29
|
+
const s = vt();
|
|
30
|
+
s.start("Checking providers...");
|
|
31
|
+
try {
|
|
32
|
+
const endpoints = await fetchModelEndpoints(client, author, slug);
|
|
33
|
+
const unique = getUniqueProviders(endpoints);
|
|
34
|
+
s.stop(`${unique.length} providers available`);
|
|
35
|
+
for (const p of unique) {
|
|
36
|
+
const ep = endpoints.find((e) => e.tag === p.tag);
|
|
37
|
+
const latency = formatLatency(ep?.latency_last_30m?.p50 ?? null);
|
|
38
|
+
const throughput = formatThroughput(ep?.throughput_last_30m?.p50 ?? null);
|
|
39
|
+
R.info(` ${p.providerName} (${p.tag}) — ${latency} · ${throughput}`);
|
|
40
|
+
}
|
|
41
|
+
} catch {
|
|
42
|
+
s.stop("Could not fetch providers");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Run the interactive "Browse models" flow. */
|
|
46
|
+
async function browseModelsCommand(apiKey) {
|
|
47
|
+
ye("Browse Models");
|
|
48
|
+
const client = new OpenRouterClient(apiKey);
|
|
49
|
+
const s = vt();
|
|
50
|
+
s.start("Loading models...");
|
|
51
|
+
let models;
|
|
52
|
+
try {
|
|
53
|
+
models = await fetchModels(client);
|
|
54
|
+
s.stop(`${models.length} models available`);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
s.stop("Failed to load models");
|
|
57
|
+
R.error(String(error));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const modelId = await Vt({
|
|
61
|
+
message: "Search for a model",
|
|
62
|
+
placeholder: "Type to search...",
|
|
63
|
+
maxItems: 15,
|
|
64
|
+
options() {
|
|
65
|
+
const query = this.userInput.trim().toLowerCase();
|
|
66
|
+
if (!query) return models.slice(0, 15).map(toOption);
|
|
67
|
+
return models.filter((m) => `${m.id} ${m.name}`.toLowerCase().includes(query)).slice(0, 15).map(toOption);
|
|
68
|
+
},
|
|
69
|
+
filter: (_search, _option) => true
|
|
70
|
+
});
|
|
71
|
+
if (R$1(modelId)) return;
|
|
72
|
+
const model = models.find((m) => m.id === modelId);
|
|
73
|
+
if (!model) return;
|
|
74
|
+
displayModelDetails(model);
|
|
75
|
+
await displayProviders(client, model);
|
|
76
|
+
const configure = await le({ message: `Configure routing for ${model.id}?` });
|
|
77
|
+
if (R$1(configure) || !configure) {
|
|
78
|
+
fe("Bye!");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
await addOverrideCommand(apiKey);
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { browseModelsCommand };
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=browse.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browse.mjs","names":["clack.spinner","clack.autocomplete","isCancel","clack.confirm"],"sources":["../src/commands/config/browse.ts"],"sourcesContent":["import * as clack from '@clack/prompts'\nimport { isCancel } from '@clack/prompts'\nimport { OpenRouterClient } from '../../openrouter/client.js'\nimport { fetchModelEndpoints, getUniqueProviders } from '../../openrouter/endpoints.js'\nimport {\n fetchModels,\n formatPrice,\n parseModelAuthor,\n parseModelSlug,\n} from '../../openrouter/models.js'\nimport type { OpenRouterModel } from '../../openrouter/types.js'\nimport { addOverrideCommand } from './add.js'\nimport {\n formatContextLength,\n formatLatency,\n formatModelHint,\n formatModelLabel,\n formatPricing,\n formatThroughput,\n} from './format.js'\n\nfunction toOption(m: OpenRouterModel) {\n return { value: m.id, label: formatModelLabel(m), hint: formatModelHint(m) }\n}\n\nfunction displayModelDetails(model: OpenRouterModel): void {\n clack.log.success(`${model.name || model.id}`)\n if (model.description) {\n const desc =\n model.description.length > 200\n ? `${model.description.slice(0, 200)}...`\n : model.description\n clack.log.info(` ${desc}`)\n }\n clack.log.info(` Context: ${formatContextLength(model.context_length)} tokens`)\n if (model.top_provider?.max_completion_tokens) {\n clack.log.info(\n ` Max output: ${formatContextLength(model.top_provider.max_completion_tokens)} tokens`,\n )\n }\n clack.log.info(\n ` Pricing: ${formatPricing(model.pricing.prompt, model.pricing.completion)}`,\n )\n if (model.pricing.input_cache_read && model.pricing.input_cache_read !== '0') {\n clack.log.info(` Cache read: ${formatPrice(model.pricing.input_cache_read)}`)\n }\n if (model.pricing.input_cache_write && model.pricing.input_cache_write !== '0') {\n clack.log.info(` Cache write: ${formatPrice(model.pricing.input_cache_write)}`)\n }\n if (model.architecture?.modality) {\n clack.log.info(` Modality: ${model.architecture.modality}`)\n }\n if (model.supported_parameters?.length) {\n clack.log.info(` Parameters: ${model.supported_parameters.join(', ')}`)\n }\n}\n\nasync function displayProviders(\n client: OpenRouterClient,\n model: OpenRouterModel,\n): Promise<void> {\n const author = parseModelAuthor(model.id)\n const slug = parseModelSlug(model.id)\n const s = clack.spinner()\n s.start('Checking providers...')\n try {\n const endpoints = await fetchModelEndpoints(client, author, slug)\n const unique = getUniqueProviders(endpoints)\n s.stop(`${unique.length} providers available`)\n\n for (const p of unique) {\n const ep = endpoints.find(e => e.tag === p.tag)\n const latency = formatLatency(ep?.latency_last_30m?.p50 ?? null)\n const throughput = formatThroughput(ep?.throughput_last_30m?.p50 ?? null)\n clack.log.info(` ${p.providerName} (${p.tag}) — ${latency} · ${throughput}`)\n }\n } catch {\n s.stop('Could not fetch providers')\n }\n}\n\n/** Run the interactive \"Browse models\" flow. */\nexport async function browseModelsCommand(apiKey: string): Promise<void> {\n clack.intro('Browse Models')\n\n const client = new OpenRouterClient(apiKey)\n\n const s = clack.spinner()\n s.start('Loading models...')\n let models: OpenRouterModel[]\n try {\n models = await fetchModels(client)\n s.stop(`${models.length} models available`)\n } catch (error) {\n s.stop('Failed to load models')\n clack.log.error(String(error))\n return\n }\n\n const modelId = await clack.autocomplete({\n message: 'Search for a model',\n placeholder: 'Type to search...',\n maxItems: 15,\n options(this: { userInput: string }) {\n const query = this.userInput.trim().toLowerCase()\n if (!query) return models.slice(0, 15).map(toOption)\n\n return models\n .filter(m => `${m.id} ${m.name}`.toLowerCase().includes(query))\n .slice(0, 15)\n .map(toOption)\n },\n filter: (_search: string, _option: { value: string }) => true,\n })\n\n if (isCancel(modelId)) return\n\n const model = models.find(m => m.id === modelId)\n if (!model) return\n\n displayModelDetails(model)\n await displayProviders(client, model)\n\n const configure = await clack.confirm({\n message: `Configure routing for ${model.id}?`,\n })\n\n if (isCancel(configure) || !configure) {\n clack.outro('Bye!')\n return\n }\n\n await addOverrideCommand(apiKey)\n}\n"],"mappings":"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"}
|