ottoport 1.5.0 → 1.5.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/.claude-plugin/plugin.json +1 -1
- package/README.md +4 -2
- package/cli/ottoport.mjs +7 -5
- package/commands/models.md +2 -2
- package/mcp/server.mjs +2 -2
- package/package.json +5 -1
- package/skills/ottoport/SKILL.md +7 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ottoport",
|
|
3
3
|
"description": "One API for every model. Call chat, image, video, speech and music models through the OttoPort gateway — as MCP tools, slash commands, or the bundled CLI.",
|
|
4
|
-
"version": "1.5.
|
|
4
|
+
"version": "1.5.2",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "LITBOX LLC",
|
|
7
7
|
"email": "support@ottoport.ai"
|
package/README.md
CHANGED
|
@@ -104,8 +104,10 @@ generation is spent.
|
|
|
104
104
|
- `OTTOPORT_API_KEY` — your `op-…` key. Export it from your shell profile: the
|
|
105
105
|
MCP server reads the environment its host was launched in, so a key exported
|
|
106
106
|
inside a running session arrives too late.
|
|
107
|
-
-
|
|
108
|
-
|
|
107
|
+
- The CLI always targets `https://ottoport.ai`. Use the explicit `--url` flag
|
|
108
|
+
only for local development or a self-hosted gateway.
|
|
109
|
+
- `OTTOPORT_BASE_URL` configures the MCP server only; it does not silently
|
|
110
|
+
redirect CLI traffic.
|
|
109
111
|
|
|
110
112
|
## Notes
|
|
111
113
|
|
package/cli/ottoport.mjs
CHANGED
|
@@ -14,11 +14,12 @@
|
|
|
14
14
|
//
|
|
15
15
|
// Config (flags override env):
|
|
16
16
|
// OTTOPORT_API_KEY your op-… key (or the dev OTTOPORT_KEY_SECRET)
|
|
17
|
-
//
|
|
17
|
+
// The public CLI always targets https://ottoport.ai unless --url is passed
|
|
18
|
+
// explicitly for local development or a self-hosted gateway.
|
|
18
19
|
|
|
19
20
|
import { writeFile } from "node:fs/promises";
|
|
20
21
|
|
|
21
|
-
const BASE = "
|
|
22
|
+
const BASE = "https://ottoport.ai";
|
|
22
23
|
|
|
23
24
|
// ── arg parsing ──────────────────────────────────────────────────────
|
|
24
25
|
function parseArgs(argv) {
|
|
@@ -52,7 +53,7 @@ function last(value) {
|
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
function config(flags) {
|
|
55
|
-
const baseUrl = (last(flags.url) ||
|
|
56
|
+
const baseUrl = (last(flags.url) || BASE).replace(/\/+$/, "");
|
|
56
57
|
const apiKey = last(flags.key) || process.env.OTTOPORT_API_KEY || process.env.OTTOPORT_KEY_SECRET;
|
|
57
58
|
return { baseUrl, apiKey };
|
|
58
59
|
}
|
|
@@ -92,6 +93,7 @@ async function cmdModel(id, flags) {
|
|
|
92
93
|
console.log(`${m.id} — ${m.display_name} [${m.modality}, ${m.owned_by}]`);
|
|
93
94
|
if (m.description) console.log(m.description);
|
|
94
95
|
if (m.credits_display) console.log(`rate: ${m.credits_display}`);
|
|
96
|
+
if (m.pricing_display) console.log(`price: ${m.pricing_display}`);
|
|
95
97
|
console.log(`endpoint: ${m.endpoint}`);
|
|
96
98
|
const caps = m.capabilities;
|
|
97
99
|
if (caps?.modes) {
|
|
@@ -352,11 +354,11 @@ Usage:
|
|
|
352
354
|
[--dry-run]
|
|
353
355
|
|
|
354
356
|
Global flags:
|
|
355
|
-
--url <base>
|
|
357
|
+
--url <base> override https://ottoport.ai (local/self-hosted development)
|
|
356
358
|
--key <key> OttoPort API key (env OTTOPORT_API_KEY)
|
|
357
359
|
|
|
358
360
|
Examples:
|
|
359
|
-
export OTTOPORT_API_KEY=op-...
|
|
361
|
+
export OTTOPORT_API_KEY=op-...
|
|
360
362
|
ottoport models --modality image # prints what each one accepts
|
|
361
363
|
ottoport models veo-3.1 # its modes, tiers, and every parameter
|
|
362
364
|
ottoport chat "explain MCP in one line" --model claude-haiku-4.5
|
package/commands/models.md
CHANGED
|
@@ -17,6 +17,6 @@ Argument (may be empty — then list everything): `$1`
|
|
|
17
17
|
- Nothing → list everything, grouped by modality, and keep it to the models
|
|
18
18
|
worth choosing between rather than every row.
|
|
19
19
|
|
|
20
|
-
Rates
|
|
21
|
-
|
|
20
|
+
Rates come in credits (`credits_display`, the unit the ledger bills in) and in USD (`pricing_display`, what the balance shows) — so quote
|
|
21
|
+
whichever the person asked for, as the tool returns it, without converting yourself. Never invent a
|
|
22
22
|
model id, a mode, or a resolution the tool did not return.
|
package/mcp/server.mjs
CHANGED
|
@@ -83,7 +83,7 @@ async function describeModel(id) {
|
|
|
83
83
|
const lines = [
|
|
84
84
|
`${m.id} — ${m.display_name} [${m.modality}, ${m.owned_by}]`,
|
|
85
85
|
...(m.description ? [m.description] : []),
|
|
86
|
-
...(m.credits_display ? [`Rate: ${m.credits_display}`] : []),
|
|
86
|
+
...(m.credits_display ? [`Rate: ${m.credits_display}${m.pricing_display ? ` (${m.pricing_display})` : ""}`] : []),
|
|
87
87
|
`Endpoint: ${m.endpoint}`,
|
|
88
88
|
];
|
|
89
89
|
if (caps?.modes) {
|
|
@@ -123,7 +123,7 @@ async function listModels({ modality, model } = {}) {
|
|
|
123
123
|
// unit is spelled out here.
|
|
124
124
|
return data
|
|
125
125
|
.map((m) => {
|
|
126
|
-
const rate = m.credits_display ? ` · ${m.credits_display}` : "";
|
|
126
|
+
const rate = m.credits_display ? ` · ${m.credits_display}${m.pricing_display ? ` (${m.pricing_display})` : ""}` : "";
|
|
127
127
|
const what = m.description ? ` — ${m.description}` : "";
|
|
128
128
|
return `${m.id} [${m.modality}, ${m.owned_by}]${what}${rate}${accepts(m.capabilities)}`;
|
|
129
129
|
})
|
package/package.json
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ottoport",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.2",
|
|
4
4
|
"description": "Claude Code plugin, CLI and MCP server for OttoPort — one OpenAI-compatible API for every LLM, image, video, and speech model.",
|
|
5
5
|
"homepage": "https://ottoport.ai",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/Jet1217/OttoPort.git"
|
|
9
|
+
},
|
|
6
10
|
"license": "MIT",
|
|
7
11
|
"keywords": [
|
|
8
12
|
"ai",
|
package/skills/ottoport/SKILL.md
CHANGED
|
@@ -14,7 +14,7 @@ and do not call the HTTP API, when a tool covers the job:
|
|
|
14
14
|
|
|
15
15
|
| Tool | For |
|
|
16
16
|
| --- | --- |
|
|
17
|
-
| `ottoport_list_models` | The catalog: what each model is for, and its rate in credits. Filter with `modality`, or pass `model` for ONE model in full — its modes, its resolution tiers with prices, and every parameter it reads. |
|
|
17
|
+
| `ottoport_list_models` | The catalog: what each model is for, and its rate in credits and USD. Filter with `modality`, or pass `model` for ONE model in full — its modes, its resolution tiers with prices, and every parameter it reads. |
|
|
18
18
|
| `ottoport_chat` | `prompt`, plus optional `model`, `system`, `temperature`, `max_tokens`. |
|
|
19
19
|
| `ottoport_generate_image` | `prompt`, plus optional `model`, `size` or `resolution`, `aspect_ratio`, `n`, `seed`, `image_url` (one reference), `reference_image_urls` (several). Layer decomposition too: `model` `qwen-image-layered` or `seedream-5.0-layers` with `image_url` alone (prompt optional, `num_layers` on Qwen) returns one URL per RGBA layer. |
|
|
20
20
|
| `ottoport_generate_video` | `prompt`, plus optional `model`, `duration`, `resolution`, `aspect_ratio`, `seed`, `image_url` (first frame), `last_frame_url`, `reference_image_urls`. |
|
|
@@ -76,9 +76,9 @@ sensible default.
|
|
|
76
76
|
| music | `suno-v5` | `lyria-2` |
|
|
77
77
|
|
|
78
78
|
Never invent a model id. Call `ottoport_list_models` when unsure — the catalog
|
|
79
|
-
changes, and a wrong id is a failed billable call. Rates come back in credits
|
|
80
|
-
the unit the
|
|
81
|
-
|
|
79
|
+
changes, and a wrong id is a failed billable call. Rates come back in credits (the unit the ledger
|
|
80
|
+
bills in) and in USD (the unit the balance shows); quote whichever is asked for
|
|
81
|
+
as given rather than converting yourself.
|
|
82
82
|
|
|
83
83
|
## What comes back
|
|
84
84
|
|
|
@@ -119,5 +119,6 @@ music live under `/api/v1/images/generations`, `/videos/generations`,
|
|
|
119
119
|
|
|
120
120
|
- `OTTOPORT_API_KEY` — an `op-…` key, read from the environment the client was
|
|
121
121
|
launched in. A key exported inside a running session arrives too late.
|
|
122
|
-
-
|
|
123
|
-
|
|
122
|
+
- The CLI always targets `https://ottoport.ai`; pass `--url` explicitly only
|
|
123
|
+
for local development or a self-hosted gateway.
|
|
124
|
+
- `OTTOPORT_BASE_URL` configures the MCP server only.
|