mindweave 2.5.0 → 3.0.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 +81 -145
- package/dist/cli/App.js +579 -304
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/analytics.js +27 -18
- package/dist/cli/analytics.js.map +1 -1
- package/dist/cli/attachments.js +34 -0
- package/dist/cli/attachments.js.map +1 -1
- package/dist/cli/bannerFit.js +70 -0
- package/dist/cli/bannerFit.js.map +1 -0
- package/dist/cli/bootstrap.js +41 -3
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/commands.js +4 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/components/ApprovalBox.js +3 -2
- package/dist/cli/components/ApprovalBox.js.map +1 -1
- package/dist/cli/components/BlockView.js +27 -6
- package/dist/cli/components/BlockView.js.map +1 -1
- package/dist/cli/components/FirstRunFrame.js +2 -1
- package/dist/cli/components/FirstRunFrame.js.map +1 -1
- package/dist/cli/components/KeyManager.js +5 -4
- package/dist/cli/components/KeyManager.js.map +1 -1
- package/dist/cli/components/KeySetup.js +29 -13
- package/dist/cli/components/KeySetup.js.map +1 -1
- package/dist/cli/components/MarathonBox.js +64 -0
- package/dist/cli/components/MarathonBox.js.map +1 -0
- package/dist/cli/components/McpMinitabs.js +8 -7
- package/dist/cli/components/McpMinitabs.js.map +1 -1
- package/dist/cli/components/Picker.js +4 -3
- package/dist/cli/components/Picker.js.map +1 -1
- package/dist/cli/components/PromptInput.js +47 -8
- package/dist/cli/components/PromptInput.js.map +1 -1
- package/dist/cli/components/PulseDot.js +42 -0
- package/dist/cli/components/PulseDot.js.map +1 -0
- package/dist/cli/components/SubagentView.js +9 -6
- package/dist/cli/components/SubagentView.js.map +1 -1
- package/dist/cli/components/TipLine.js +2 -1
- package/dist/cli/components/TipLine.js.map +1 -1
- package/dist/cli/components/ToolGroup.js +65 -49
- package/dist/cli/components/ToolGroup.js.map +1 -1
- package/dist/cli/components/ToolLine.js +20 -19
- package/dist/cli/components/ToolLine.js.map +1 -1
- package/dist/cli/components/TrustGate.js +2 -1
- package/dist/cli/components/TrustGate.js.map +1 -1
- package/dist/cli/components/minitabs.js +3 -2
- package/dist/cli/components/minitabs.js.map +1 -1
- package/dist/cli/desktopApp.js +45 -0
- package/dist/cli/desktopApp.js.map +1 -0
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inkOutputPatch.js +285 -0
- package/dist/cli/inkOutputPatch.js.map +1 -0
- package/dist/cli/inkSpeed.js +29 -0
- package/dist/cli/inkSpeed.js.map +1 -0
- package/dist/cli/inkSpeedLoader.js +47 -0
- package/dist/cli/inkSpeedLoader.js.map +1 -0
- package/dist/cli/inputText.js +30 -0
- package/dist/cli/inputText.js.map +1 -0
- package/dist/cli/keyManager.js +2 -1
- package/dist/cli/keyManager.js.map +1 -1
- package/dist/cli/keyPrefs.js +90 -0
- package/dist/cli/keyPrefs.js.map +1 -0
- package/dist/cli/keySetup.js +5 -2
- package/dist/cli/keySetup.js.map +1 -1
- package/dist/cli/marathonUi.js +113 -0
- package/dist/cli/marathonUi.js.map +1 -0
- package/dist/cli/markdown.js +63 -11
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/modes.js +3 -3
- package/dist/cli/modes.js.map +1 -1
- package/dist/cli/prodEnv.js +43 -0
- package/dist/cli/prodEnv.js.map +1 -0
- package/dist/cli/revealPace.js +5 -5
- package/dist/cli/revealPace.js.map +1 -1
- package/dist/cli/revealQueue.js +120 -0
- package/dist/cli/revealQueue.js.map +1 -0
- package/dist/cli/theme.js +47 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/toolDisplay.js +112 -18
- package/dist/cli/toolDisplay.js.map +1 -1
- package/dist/cli/transcript.js +1 -1
- package/dist/cli/transcript.js.map +1 -1
- package/dist/cli/virtualWindow.js +14 -2
- package/dist/cli/virtualWindow.js.map +1 -1
- package/dist/cli/wheelAccel.js +73 -0
- package/dist/cli/wheelAccel.js.map +1 -0
- package/dist/cli/widestLinePatch.js +48 -0
- package/dist/cli/widestLinePatch.js.map +1 -0
- package/dist/cli/workingVerb.js +88 -28
- package/dist/cli/workingVerb.js.map +1 -1
- package/dist/cli/wrap.js +1 -1
- package/dist/cli/wrap.js.map +1 -1
- package/dist/core/contextSettings.js +84 -0
- package/dist/core/contextSettings.js.map +1 -0
- package/dist/core/limitsView.js +40 -0
- package/dist/core/limitsView.js.map +1 -0
- package/dist/core/mcpServers.js +164 -0
- package/dist/core/mcpServers.js.map +1 -0
- package/dist/core/permissions.js +209 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/providerKeys.js +187 -0
- package/dist/core/providerKeys.js.map +1 -0
- package/dist/core/rulesSkills.js +142 -0
- package/dist/core/rulesSkills.js.map +1 -0
- package/dist/core/spendView.js +90 -0
- package/dist/core/spendView.js.map +1 -0
- package/dist/core/turnRunner.js +759 -0
- package/dist/core/turnRunner.js.map +1 -0
- package/dist/drivers/anthropic/client.js +101 -26
- package/dist/drivers/anthropic/client.js.map +1 -1
- package/dist/drivers/anthropic/manifest.js +43 -13
- package/dist/drivers/anthropic/manifest.js.map +1 -1
- package/dist/drivers/cerebras/manifest.js +13 -3
- package/dist/drivers/cerebras/manifest.js.map +1 -1
- package/dist/drivers/deepseek/manifest.js +24 -34
- package/dist/drivers/deepseek/manifest.js.map +1 -1
- package/dist/drivers/glm/manifest.js +21 -6
- package/dist/drivers/glm/manifest.js.map +1 -1
- package/dist/drivers/groq/manifest.js +5 -2
- package/dist/drivers/groq/manifest.js.map +1 -1
- package/dist/drivers/kimi/manifest.js +13 -10
- package/dist/drivers/kimi/manifest.js.map +1 -1
- package/dist/drivers/meta/manifest.js +21 -16
- package/dist/drivers/meta/manifest.js.map +1 -1
- package/dist/drivers/minimax/manifest.js +15 -12
- package/dist/drivers/minimax/manifest.js.map +1 -1
- package/dist/drivers/ollama/catalog.js +71 -0
- package/dist/drivers/ollama/catalog.js.map +1 -0
- package/dist/drivers/ollama/client.js +164 -0
- package/dist/drivers/ollama/client.js.map +1 -0
- package/dist/drivers/ollama/endpoint.js +42 -0
- package/dist/drivers/ollama/endpoint.js.map +1 -0
- package/dist/drivers/ollama/index.js +5 -0
- package/dist/drivers/ollama/index.js.map +1 -0
- package/dist/drivers/ollama/manifest.js +64 -0
- package/dist/drivers/ollama/manifest.js.map +1 -0
- package/dist/drivers/openai/client.js +10 -4
- package/dist/drivers/openai/client.js.map +1 -1
- package/dist/drivers/openai/manifest.js +69 -18
- package/dist/drivers/openai/manifest.js.map +1 -1
- package/dist/drivers/qwen/manifest.js +19 -6
- package/dist/drivers/qwen/manifest.js.map +1 -1
- package/dist/drivers/registry.js +11 -0
- package/dist/drivers/registry.js.map +1 -1
- package/dist/drivers/retryPolicy.js +26 -1
- package/dist/drivers/retryPolicy.js.map +1 -1
- package/dist/drivers/xai/client.js +12 -10
- package/dist/drivers/xai/client.js.map +1 -1
- package/dist/drivers/xai/manifest.js +62 -25
- package/dist/drivers/xai/manifest.js.map +1 -1
- package/dist/dynamo/auxModel.js +54 -0
- package/dist/dynamo/auxModel.js.map +1 -0
- package/dist/dynamo/engine.js +407 -99
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/guard.js +10 -0
- package/dist/dynamo/guard.js.map +1 -1
- package/dist/dynamo/liveMeter.js +25 -6
- package/dist/dynamo/liveMeter.js.map +1 -1
- package/dist/dynamo/marathon.js +409 -0
- package/dist/dynamo/marathon.js.map +1 -0
- package/dist/dynamo/marathonPrompt.js +45 -0
- package/dist/dynamo/marathonPrompt.js.map +1 -0
- package/dist/dynamo/model.js +6 -2
- package/dist/dynamo/model.js.map +1 -1
- package/dist/dynamo/toolBatches.js +58 -0
- package/dist/dynamo/toolBatches.js.map +1 -0
- package/dist/dynamo/usageLimits.js +446 -0
- package/dist/dynamo/usageLimits.js.map +1 -0
- package/dist/governor/freshness.js +10 -7
- package/dist/governor/freshness.js.map +1 -1
- package/dist/governor/index.js +76 -9
- package/dist/governor/index.js.map +1 -1
- package/dist/governor/write.js +43 -14
- package/dist/governor/write.js.map +1 -1
- package/dist/index.js +18 -151
- package/dist/index.js.map +1 -1
- package/dist/main.js +162 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/manager.js +18 -0
- package/dist/mcp/manager.js.map +1 -1
- package/dist/memory/allMetas.js +69 -0
- package/dist/memory/allMetas.js.map +1 -0
- package/dist/memory/compaction.js +70 -15
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/earlier.js +15 -0
- package/dist/memory/earlier.js.map +1 -0
- package/dist/memory/profile.js +93 -0
- package/dist/memory/profile.js.map +1 -0
- package/dist/memory/rewind.js +262 -0
- package/dist/memory/rewind.js.map +1 -0
- package/dist/memory/session.js +42 -10
- package/dist/memory/session.js.map +1 -1
- package/dist/memory/sessionMemory.js +48 -13
- package/dist/memory/sessionMemory.js.map +1 -1
- package/dist/memory/sessionMemoryCompact.js +1 -1
- package/dist/memory/sessionMemoryCompact.js.map +1 -1
- package/dist/memory/sessionTitle.js +50 -0
- package/dist/memory/sessionTitle.js.map +1 -0
- package/dist/memory/store.js +42 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/tools/askUser.js +14 -0
- package/dist/tools/askUser.js.map +1 -1
- package/dist/tools/backgroundShells.js +208 -5
- package/dist/tools/backgroundShells.js.map +1 -1
- package/dist/tools/browser.js +176 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/cdp.js +165 -0
- package/dist/tools/cdp.js.map +1 -0
- package/dist/tools/checkpoints.js +208 -5
- package/dist/tools/checkpoints.js.map +1 -1
- package/dist/tools/deferredNative.js +2 -0
- package/dist/tools/deferredNative.js.map +1 -1
- package/dist/tools/detail.js +9 -6
- package/dist/tools/detail.js.map +1 -1
- package/dist/tools/edit.js +2 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/exitPlan.js +4 -0
- package/dist/tools/exitPlan.js.map +1 -1
- package/dist/tools/hiddenDesktop.js +273 -0
- package/dist/tools/hiddenDesktop.js.map +1 -0
- package/dist/tools/listeningPorts.js +134 -0
- package/dist/tools/listeningPorts.js.map +1 -0
- package/dist/tools/mcpSearch.js +8 -0
- package/dist/tools/mcpSearch.js.map +1 -1
- package/dist/tools/mindweaveStatus.js +1 -1
- package/dist/tools/mindweaveStatus.js.map +1 -1
- package/dist/tools/registry.js +3 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/replaceSymbol.js +2 -1
- package/dist/tools/replaceSymbol.js.map +1 -1
- package/dist/tools/runCommand.js +113 -9
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/screenshot.js +4 -6
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/screenshotWin.js +26 -9
- package/dist/tools/screenshotWin.js.map +1 -1
- package/dist/tools/stateCheckpoint.js +128 -0
- package/dist/tools/stateCheckpoint.js.map +1 -0
- package/dist/tools/todo.js +6 -0
- package/dist/tools/todo.js.map +1 -1
- package/dist/tools/ui.js +1295 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/tools/uiHide.js +356 -0
- package/dist/tools/uiHide.js.map +1 -0
- package/dist/tools/uiPage.js +861 -0
- package/dist/tools/uiPage.js.map +1 -0
- package/dist/tools/uiWin.js +506 -0
- package/dist/tools/uiWin.js.map +1 -0
- package/dist/tools/webFetch.js +32 -25
- package/dist/tools/webFetch.js.map +1 -1
- package/dist/tools/webSearch.js +12 -0
- package/dist/tools/webSearch.js.map +1 -1
- package/dist/tools/writeFile.js +2 -1
- package/dist/tools/writeFile.js.map +1 -1
- package/package.json +78 -75
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { ProviderHttpError, renderMessages, toStop } from "../openaiCompat/wire.js";
|
|
2
|
+
import { salvagePartialTurn } from "../partialTurn.js";
|
|
3
|
+
import { isAbortLike } from "../retryPolicy.js";
|
|
4
|
+
import { clientId } from "../clientId.js";
|
|
5
|
+
import { manifestForModel } from "../registry.js";
|
|
6
|
+
import { baseUrl } from "./endpoint.js";
|
|
7
|
+
import { BUFFERED_OUTPUT_TOKENS, localWindow, wireId } from "./manifest.js";
|
|
8
|
+
/** For the shared stop-reason and error vocabulary only; this driver does not use the OpenAI wire. */
|
|
9
|
+
const AS_PROVIDER = { label: "Ollama" };
|
|
10
|
+
/** Tool arguments are a JSON string everywhere else; `/api/chat` wants the object. */
|
|
11
|
+
function argsObject(raw) {
|
|
12
|
+
try {
|
|
13
|
+
const parsed = JSON.parse(raw || "{}");
|
|
14
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The shared rendering, reshaped: images as bare base64, tool calls with object arguments, and a
|
|
22
|
+
* tool result carrying the name of the tool it answers (Ollama matches results by name, not id).
|
|
23
|
+
*/
|
|
24
|
+
export function toNativeMessages(messages) {
|
|
25
|
+
const names = new Map();
|
|
26
|
+
return messages.map((m) => {
|
|
27
|
+
const out = { role: m.role, content: m.content };
|
|
28
|
+
if (m.images?.length)
|
|
29
|
+
out.images = m.images.map((i) => i.data);
|
|
30
|
+
if (m.tool_calls?.length) {
|
|
31
|
+
out.tool_calls = m.tool_calls.map((c) => {
|
|
32
|
+
names.set(c.id, c.function.name);
|
|
33
|
+
return { function: { name: c.function.name, arguments: argsObject(c.function.arguments) } };
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (m.role === "tool" && m.tool_call_id && names.has(m.tool_call_id))
|
|
37
|
+
out.tool_name = names.get(m.tool_call_id);
|
|
38
|
+
return out;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Whether the chosen model has a thinking switch at all (from what discovery reported). */
|
|
42
|
+
function canThink(config) {
|
|
43
|
+
return !!config && manifestForModel(config.model).thinkLevels(config.model).some((l) => l.thinking);
|
|
44
|
+
}
|
|
45
|
+
export function buildRequest(req, stream, maxTokens) {
|
|
46
|
+
const model = req.model?.model ?? "";
|
|
47
|
+
const window = manifestForModel(model).contextWindow(model) || localWindow();
|
|
48
|
+
const body = {
|
|
49
|
+
model: wireId(model),
|
|
50
|
+
messages: toNativeMessages(renderMessages(req)),
|
|
51
|
+
stream,
|
|
52
|
+
// Every request states its window: otherwise Ollama's default applies and the rest is cut.
|
|
53
|
+
options: { num_ctx: window, ...(maxTokens ? { num_predict: maxTokens } : {}) },
|
|
54
|
+
};
|
|
55
|
+
// Stated either way for a model that has the switch: one that thinks by default (Qwen3) would
|
|
56
|
+
// otherwise think on every turn the user chose Standard for.
|
|
57
|
+
if (canThink(req.model))
|
|
58
|
+
body.think = req.model?.thinking === true;
|
|
59
|
+
if (req.tools?.length)
|
|
60
|
+
body.tools = req.tools;
|
|
61
|
+
return body;
|
|
62
|
+
}
|
|
63
|
+
function toUsage(chunk) {
|
|
64
|
+
const promptTokens = chunk.prompt_eval_count ?? 0;
|
|
65
|
+
const completionTokens = chunk.eval_count ?? 0;
|
|
66
|
+
return {
|
|
67
|
+
promptTokens,
|
|
68
|
+
completionTokens,
|
|
69
|
+
totalTokens: promptTokens + completionTokens,
|
|
70
|
+
cacheHitTokens: 0,
|
|
71
|
+
cacheMissTokens: promptTokens,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function toToolCall(c, index) {
|
|
75
|
+
const args = c.function.arguments;
|
|
76
|
+
return {
|
|
77
|
+
id: c.id || `call_${index}`,
|
|
78
|
+
name: c.function.name,
|
|
79
|
+
arguments: typeof args === "string" ? args : JSON.stringify(args ?? {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function post(body, signal) {
|
|
83
|
+
const response = await fetch(`${baseUrl()}/api/chat`, {
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: { "Content-Type": "application/json", "User-Agent": clientId() },
|
|
86
|
+
body: JSON.stringify(body),
|
|
87
|
+
signal,
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
const detail = await response.text().catch(() => "");
|
|
91
|
+
throw new ProviderHttpError(response.status, detail, "Ollama", response.statusText);
|
|
92
|
+
}
|
|
93
|
+
return response;
|
|
94
|
+
}
|
|
95
|
+
/** Each JSON line of a streamed reply (Ollama streams newline-delimited JSON, not SSE). */
|
|
96
|
+
async function* jsonLines(response) {
|
|
97
|
+
if (!response.body)
|
|
98
|
+
return;
|
|
99
|
+
const decoder = new TextDecoder();
|
|
100
|
+
let buffer = "";
|
|
101
|
+
for await (const piece of response.body) {
|
|
102
|
+
buffer += decoder.decode(piece, { stream: true });
|
|
103
|
+
let nl;
|
|
104
|
+
while ((nl = buffer.indexOf("\n")) !== -1) {
|
|
105
|
+
const line = buffer.slice(0, nl).trim();
|
|
106
|
+
buffer = buffer.slice(nl + 1);
|
|
107
|
+
if (line)
|
|
108
|
+
yield JSON.parse(line);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (buffer.trim())
|
|
112
|
+
yield JSON.parse(buffer);
|
|
113
|
+
}
|
|
114
|
+
export async function toolTurn(req, options = {}) {
|
|
115
|
+
const response = await post(buildRequest(req, false, BUFFERED_OUTPUT_TOKENS), options.signal);
|
|
116
|
+
const chunk = (await response.json());
|
|
117
|
+
if (chunk.error)
|
|
118
|
+
throw new Error(`Ollama: ${chunk.error}`);
|
|
119
|
+
return {
|
|
120
|
+
content: chunk.message?.content ?? "",
|
|
121
|
+
toolCalls: (chunk.message?.tool_calls ?? []).map(toToolCall),
|
|
122
|
+
stop: toStop(AS_PROVIDER, chunk.done_reason),
|
|
123
|
+
usage: toUsage(chunk),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export async function streamTurn(req, options = {}) {
|
|
127
|
+
const onEvent = options.onEvent ?? (() => { });
|
|
128
|
+
const response = await post(buildRequest(req, true), options.signal);
|
|
129
|
+
let content = "";
|
|
130
|
+
const calls = [];
|
|
131
|
+
let usage;
|
|
132
|
+
let reason;
|
|
133
|
+
try {
|
|
134
|
+
for await (const chunk of jsonLines(response)) {
|
|
135
|
+
if (chunk.error)
|
|
136
|
+
throw new Error(`Ollama: ${chunk.error}`);
|
|
137
|
+
const m = chunk.message;
|
|
138
|
+
if (m?.thinking)
|
|
139
|
+
onEvent({ type: "reasoning", delta: m.thinking });
|
|
140
|
+
if (m?.content) {
|
|
141
|
+
content += m.content;
|
|
142
|
+
onEvent({ type: "text", delta: m.content });
|
|
143
|
+
}
|
|
144
|
+
// Ollama sends each tool call whole, in one line, rather than in fragments.
|
|
145
|
+
for (const c of m?.tool_calls ?? []) {
|
|
146
|
+
const call = toToolCall(c, calls.length);
|
|
147
|
+
onEvent({ type: "tool_start", index: calls.length, id: call.id, name: call.name });
|
|
148
|
+
onEvent({ type: "tool_args", index: calls.length, delta: call.arguments });
|
|
149
|
+
calls.push(call);
|
|
150
|
+
}
|
|
151
|
+
if (chunk.done) {
|
|
152
|
+
reason = chunk.done_reason;
|
|
153
|
+
usage = toUsage(chunk);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (isAbortLike(error))
|
|
159
|
+
throw error;
|
|
160
|
+
return salvagePartialTurn(content, error);
|
|
161
|
+
}
|
|
162
|
+
return { content, toolCalls: calls, usage, stop: toStop(AS_PROVIDER, reason) };
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/drivers/ollama/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* endpoint.ts — where the local Ollama server is.
|
|
3
|
+
*
|
|
4
|
+
* Its own module so the catalogue (which only lists models) and the client (which talks to one)
|
|
5
|
+
* agree on the address without the catalogue loading any wire code.
|
|
6
|
+
*
|
|
7
|
+
* Ollama's own variable, `OLLAMA_HOST`, is honoured the way Ollama reads it: a bare `host:port`
|
|
8
|
+
* or a full URL, and `0.0.0.0` (which a server binds to, but nobody can connect to) means this
|
|
9
|
+
* machine. `MINDWEAVE_OLLAMA_URL` overrides both, for a server somewhere else.
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_URL = "http://127.0.0.1:11434";
|
|
12
|
+
/** The server's root URL, no trailing slash. Read on each call, so a changed variable counts. */
|
|
13
|
+
export function baseUrl(env = process.env) {
|
|
14
|
+
const own = env.MINDWEAVE_OLLAMA_URL?.trim();
|
|
15
|
+
if (own)
|
|
16
|
+
return own.replace(/\/+$/, "");
|
|
17
|
+
const host = env.OLLAMA_HOST?.trim();
|
|
18
|
+
if (!host)
|
|
19
|
+
return DEFAULT_URL;
|
|
20
|
+
const withScheme = /^[a-z]+:\/\//i.test(host) ? host : `http://${host}`;
|
|
21
|
+
try {
|
|
22
|
+
const url = new URL(withScheme);
|
|
23
|
+
if (url.hostname === "0.0.0.0" || url.hostname === "::" || url.hostname === "[::]")
|
|
24
|
+
url.hostname = "127.0.0.1";
|
|
25
|
+
if (!url.port && url.protocol === "http:" && !/:\d+$/.test(host))
|
|
26
|
+
url.port = "11434";
|
|
27
|
+
return url.toString().replace(/\/+$/, "");
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return DEFAULT_URL;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The variable that says the server answered with at least one usable model.
|
|
35
|
+
*
|
|
36
|
+
* Every provider is "connected" when its key variable is set, and every part of Mindweave that
|
|
37
|
+
* decides what can run (first-run setup, the fallback to another provider, the app's composer)
|
|
38
|
+
* reads that one fact. A local server has no key, so discovery sets this variable when the
|
|
39
|
+
* server is up and clears it when it is not: the same fact, with no second code path.
|
|
40
|
+
*/
|
|
41
|
+
export const RUNNING_ENV = "MINDWEAVE_OLLAMA_RUNNING";
|
|
42
|
+
//# sourceMappingURL=endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/drivers/ollama/endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAEpD,iGAAiG;AACjG,MAAM,UAAU,OAAO,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC;IAC9B,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM;YAAE,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC/G,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;QACrF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/drivers/ollama/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAW,EAAE,GAAG,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAEhF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { RUNNING_ENV } from "./endpoint.js";
|
|
2
|
+
/** The namespace every Ollama model id carries inside Mindweave. */
|
|
3
|
+
export const PREFIX = "ollama:";
|
|
4
|
+
/** Ollama's own name for a namespaced id. */
|
|
5
|
+
export function wireId(model) {
|
|
6
|
+
return model.startsWith(PREFIX) ? model.slice(PREFIX.length) : model;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The context each request asks Ollama for, in tokens.
|
|
10
|
+
*
|
|
11
|
+
* Ollama loads a model with a small window by default (a few thousand tokens) and silently
|
|
12
|
+
* drops whatever does not fit, which an agent's instructions and tools alone can exceed. So
|
|
13
|
+
* every request states its window. 32K by default: room for the agent's instructions and a real
|
|
14
|
+
* conversation. It costs memory (the model's cache for 32K tokens can be several GB), so
|
|
15
|
+
* `MINDWEAVE_OLLAMA_CONTEXT` sets another size for a smaller machine. A model trained on less
|
|
16
|
+
* keeps its own figure (see `catalog.ts`).
|
|
17
|
+
*/
|
|
18
|
+
export const LOCAL_WINDOW = 32_768;
|
|
19
|
+
/** The window asked for: `MINDWEAVE_OLLAMA_CONTEXT` when set to a sensible number, else 32K. */
|
|
20
|
+
export function localWindow(env = process.env) {
|
|
21
|
+
const n = Number(env.MINDWEAVE_OLLAMA_CONTEXT);
|
|
22
|
+
return Number.isInteger(n) && n >= 2048 ? n : LOCAL_WINDOW;
|
|
23
|
+
}
|
|
24
|
+
/** Nothing is billed: the model runs here. */
|
|
25
|
+
const FREE = { cacheHit: 0, cacheMiss: 0, output: 0 };
|
|
26
|
+
export function price(_model) {
|
|
27
|
+
return FREE;
|
|
28
|
+
}
|
|
29
|
+
export function thinkLevels(_model) {
|
|
30
|
+
return [{ label: "Standard", description: "answer directly", thinking: false, effort: "low" }];
|
|
31
|
+
}
|
|
32
|
+
export function contextWindow(_model) {
|
|
33
|
+
return localWindow();
|
|
34
|
+
}
|
|
35
|
+
/** A buffered call's ceiling, well inside the window it shares. */
|
|
36
|
+
export const BUFFERED_OUTPUT_TOKENS = 4_096;
|
|
37
|
+
export function bufferedOutputTokens(_model) {
|
|
38
|
+
return BUFFERED_OUTPUT_TOKENS;
|
|
39
|
+
}
|
|
40
|
+
/** Keep a saved local model even before discovery has listed it; see OpenRouter's. */
|
|
41
|
+
export function normalize(config) {
|
|
42
|
+
const thinking = config.thinking === true;
|
|
43
|
+
return { model: config.model, thinking, effort: thinking ? "high" : "low" };
|
|
44
|
+
}
|
|
45
|
+
export function ownsModel(model) {
|
|
46
|
+
return model.startsWith(PREFIX);
|
|
47
|
+
}
|
|
48
|
+
export const ollamaManifest = {
|
|
49
|
+
id: "ollama",
|
|
50
|
+
label: "Ollama",
|
|
51
|
+
apiKeyEnv: RUNNING_ENV,
|
|
52
|
+
keysUrl: "https://ollama.com/download",
|
|
53
|
+
local: true,
|
|
54
|
+
// Empty until discovery: only what is pulled on this machine is offered.
|
|
55
|
+
models: [],
|
|
56
|
+
thinkLevels,
|
|
57
|
+
price,
|
|
58
|
+
contextWindow,
|
|
59
|
+
bufferedOutputTokens,
|
|
60
|
+
normalize,
|
|
61
|
+
ownsModel,
|
|
62
|
+
discoverModels: async () => (await import("./catalog.js")).discoverModels(),
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/drivers/ollama/manifest.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,oEAAoE;AACpE,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC;AAEhC,6CAA6C;AAC7C,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACvE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AAEnC,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9D,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAC7D,CAAC;AAED,8CAA8C;AAC9C,MAAM,IAAI,GAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAElE,MAAM,UAAU,KAAK,CAAC,MAAe;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAe;IACzC,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAClD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,MAAmB;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,6BAA6B;IACtC,KAAK,EAAE,IAAI;IACX,yEAAyE;IACzE,MAAM,EAAE,EAAE;IACV,WAAW;IACX,KAAK;IACL,aAAa;IACb,oBAAoB;IACpB,SAAS;IACT,SAAS;IACT,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE;CAC5E,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { basename } from "node:path";
|
|
2
2
|
import { clientId } from "../clientId.js";
|
|
3
3
|
import { RETRY_MAX_ATTEMPTS } from "../retryPolicy.js";
|
|
4
|
-
import { BUFFERED_OUTPUT_TOKENS, DEFAULT_MODEL } from "./manifest.js";
|
|
4
|
+
import { BUFFERED_OUTPUT_TOKENS, DEFAULT_MODEL, canSkipReasoning } from "./manifest.js";
|
|
5
5
|
const MODEL = process.env.MINDWEAVE_MODEL ?? DEFAULT_MODEL;
|
|
6
6
|
/** Output ceiling for a streamed turn. This caps reasoning AND answer together, so
|
|
7
7
|
* it needs headroom at the higher rungs; the family accepts up to 128K. */
|
|
@@ -11,10 +11,13 @@ const MAX_TOKENS_STREAM = 64_000;
|
|
|
11
11
|
* the manifest because core reserves room for it when setting the compaction bars. */
|
|
12
12
|
const MAX_TOKENS_BUFFERED = BUFFERED_OUTPUT_TOKENS;
|
|
13
13
|
let client = null;
|
|
14
|
+
/** The key `client` was built with. A different live key (switched with /key, or by the
|
|
15
|
+
* app's key manager) rebuilds it; the old code kept the first key for the whole process. */
|
|
16
|
+
let clientKey;
|
|
14
17
|
/** The shared SDK client, or a clear setup error if no key is configured yet. */
|
|
15
18
|
async function api() {
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
20
|
+
if (!client || apiKey !== clientKey) {
|
|
18
21
|
if (!apiKey) {
|
|
19
22
|
throw new Error("No OPENAI_API_KEY found. Add your key to the global config so Mindweave works " +
|
|
20
23
|
"in every project:\n" +
|
|
@@ -28,6 +31,7 @@ async function api() {
|
|
|
28
31
|
// here means a session behaves the same way whichever provider it is pointed at,
|
|
29
32
|
// and that an SDK upgrade changing its default cannot quietly change ours.
|
|
30
33
|
client = new OpenAIClient({ apiKey, maxRetries: RETRY_MAX_ATTEMPTS - 1, defaultHeaders: { "User-Agent": clientId() } });
|
|
34
|
+
clientKey = apiKey;
|
|
31
35
|
}
|
|
32
36
|
return client;
|
|
33
37
|
}
|
|
@@ -140,7 +144,9 @@ export function buildBody(req, maxTokens) {
|
|
|
140
144
|
max_output_tokens: maxTokens,
|
|
141
145
|
// Reasoning is ONE dial here: `none` is the off switch rather than a separate
|
|
142
146
|
// flag, so the shared thinking/effort pair collapses into a single rung.
|
|
143
|
-
|
|
147
|
+
// Astra and GPT-6.1 Sol have no `none`; `normalize` keeps them thinking, and a stray
|
|
148
|
+
// no-thinking config still gets the lightest rung rather than a refused request.
|
|
149
|
+
reasoning: { effort: cfg?.thinking ? cfg.effort : canSkipReasoning(cfg?.model ?? MODEL) ? "none" : "low" },
|
|
144
150
|
store: false,
|
|
145
151
|
};
|
|
146
152
|
const tools = renderTools(req);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/drivers/openai/client.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAYvD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/drivers/openai/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export const ASTRA = "gpt-6-astra";
|
|
2
|
+
export const SOL_61 = "gpt-6.1-sol";
|
|
3
|
+
export const SOL_6 = "gpt-6-sol";
|
|
4
|
+
export const LUNA_6 = "gpt-6-luna";
|
|
2
5
|
export const SOL = "gpt-5.6-sol";
|
|
3
6
|
export const TERRA = "gpt-5.6-terra";
|
|
4
7
|
export const LUNA = "gpt-5.6-luna";
|
|
@@ -13,23 +16,51 @@ export const DEFAULT_MODEL = TERRA;
|
|
|
13
16
|
*/
|
|
14
17
|
export const MODELS = [
|
|
15
18
|
{ id: TERRA, label: "GPT-5.6 Terra", description: "balanced intelligence and cost — the default" },
|
|
16
|
-
{ id: ASTRA, label: "GPT-6 Astra", description: "the
|
|
19
|
+
{ id: ASTRA, label: "GPT-6 Astra", description: "the GPT-6 flagship — the most capable, and the priciest" },
|
|
20
|
+
{ id: SOL_61, label: "GPT-6.1 Sol", description: "the newest Sol, at GPT-6 Sol's rate" },
|
|
21
|
+
{ id: SOL_6, label: "GPT-6 Sol", description: "GPT-6 at Terra's input rate, with cheaper output" },
|
|
22
|
+
{ id: LUNA_6, label: "GPT-6 Luna", description: "the cheapest GPT-6, for high-volume work" },
|
|
17
23
|
{ id: SOL, label: "GPT-5.6 Sol", description: "the GPT-5.6 frontier tier" },
|
|
18
24
|
{ id: LUNA, label: "GPT-5.6 Luna", description: "cheap and quick, for high-volume work" },
|
|
19
25
|
];
|
|
26
|
+
/**
|
|
27
|
+
* The models that cannot be asked NOT to reason. OpenAI's pages list their `effort` as
|
|
28
|
+
* low, medium, high, xhigh and max: `none` is not on the list, and the reasoning guide
|
|
29
|
+
* says so for both ("GPT-6 Astra does not support `none`", "GPT-6.1 Sol does not support
|
|
30
|
+
* `none` or `minimal`", developers.openai.com, checked 2026-10-01). Every other model
|
|
31
|
+
* here lists `none` among its efforts. Sending `none` to one of these two is the
|
|
32
|
+
* request the API refuses, so the "answer directly" rung does not exist for them.
|
|
33
|
+
*/
|
|
34
|
+
const ALWAYS_REASONS = new Set([ASTRA, SOL_61]);
|
|
35
|
+
/** Whether this model accepts `reasoning.effort: "none"`, the off switch. */
|
|
36
|
+
export function canSkipReasoning(model) {
|
|
37
|
+
return !ALWAYS_REASONS.has(model);
|
|
38
|
+
}
|
|
20
39
|
/**
|
|
21
40
|
* The reasoning levels offered by `/think`.
|
|
22
41
|
*
|
|
23
42
|
* OpenAI expresses reasoning as a single `effort` rung with `none` as its off
|
|
24
43
|
* switch, rather than a separate on/off flag plus a budget. That maps onto the
|
|
25
44
|
* shared shape cleanly: `thinking: false` becomes `none` on the wire, and the four
|
|
26
|
-
* thinking rungs are sent as themselves.
|
|
45
|
+
* thinking rungs are sent as themselves.
|
|
27
46
|
*
|
|
28
|
-
* The
|
|
29
|
-
*
|
|
30
|
-
*
|
|
47
|
+
* The two models in `ALWAYS_REASONS` have no `none`, so their ladder starts at `low`
|
|
48
|
+
* and says so: a rung that sat there as "answer directly" would be a setting that
|
|
49
|
+
* ends in a refused request.
|
|
50
|
+
*
|
|
51
|
+
* The provider also accepts `minimal` between `none` and `low` on some models. It is not
|
|
52
|
+
* offered: it would be a fifth rung whose difference from `low` no user could predict,
|
|
53
|
+
* and the ladder is more useful short.
|
|
31
54
|
*/
|
|
32
|
-
export function thinkLevels(
|
|
55
|
+
export function thinkLevels(model) {
|
|
56
|
+
if (!canSkipReasoning(model)) {
|
|
57
|
+
return [
|
|
58
|
+
{ label: "Standard", description: "always thinks — lighter budget", thinking: true, effort: "low" },
|
|
59
|
+
{ label: "Thinking", description: "think first, then answer", thinking: true, effort: "medium" },
|
|
60
|
+
{ label: "Deep", description: "more reasoning, more tool work", thinking: true, effort: "high" },
|
|
61
|
+
{ label: "Maximum", description: "maximum reasoning budget", thinking: true, effort: "max" },
|
|
62
|
+
];
|
|
63
|
+
}
|
|
33
64
|
return [
|
|
34
65
|
{ label: "Standard", description: "answer directly — fastest", thinking: false, effort: "high" },
|
|
35
66
|
{ label: "Thinking", description: "think first, then answer", thinking: true, effort: "medium" },
|
|
@@ -38,12 +69,30 @@ export function thinkLevels(_model) {
|
|
|
38
69
|
];
|
|
39
70
|
}
|
|
40
71
|
/**
|
|
41
|
-
* List prices (USD / 1M tokens)
|
|
42
|
-
*
|
|
72
|
+
* List prices (USD / 1M tokens), short-context tier (this manifest does not model
|
|
73
|
+
* OpenAI's separate long-context pricing above ~200K input — see `contextWindow`,
|
|
74
|
+
* which caps the usable window below that tier anyway). Cached input bills at a
|
|
75
|
+
* tenth of fresh input, which is what keeps a re-sent conversation cheap.
|
|
76
|
+
*
|
|
77
|
+
* Sol is running promotional pricing — $4 / $20 rather than its $5 / $30 (2.5x
|
|
78
|
+
* Terra) list price — "available at least through November 21, 2026"
|
|
79
|
+
* (developers.openai.com/api/docs/pricing, checked 2026-09-20). Recorded as the
|
|
80
|
+
* plain current price rather than branched on the date, same call the Gemini
|
|
81
|
+
* manifest makes for its own promo: a fixed expiry with no announced successor
|
|
82
|
+
* price belongs in a review before that date, not a guess baked in now.
|
|
43
83
|
*/
|
|
44
84
|
const PRICES = {
|
|
45
85
|
[ASTRA]: { cacheHit: 1, cacheMiss: 10, output: 50 },
|
|
46
|
-
|
|
86
|
+
// GPT-6 Sol and Luna: list prices, no promotion (developers.openai.com/api/docs/pricing,
|
|
87
|
+
// checked 2026-09-23).
|
|
88
|
+
[SOL_6]: { cacheHit: 0.2, cacheMiss: 2, output: 10 },
|
|
89
|
+
// GPT-6.1 Sol: the same input and output rate as GPT-6 Sol with HALF its cache-read price
|
|
90
|
+
// (developers.openai.com/api/docs/pricing, checked 2026-10-01). Over 272K input tokens the
|
|
91
|
+
// whole request bills at 2x input and cache and 1.5x output; the usable window here is far
|
|
92
|
+
// below that, so it is not modelled.
|
|
93
|
+
[SOL_61]: { cacheHit: 0.1, cacheMiss: 2, output: 10 },
|
|
94
|
+
[LUNA_6]: { cacheHit: 0.01, cacheMiss: 0.1, output: 0.5 },
|
|
95
|
+
[SOL]: { cacheHit: 0.4, cacheMiss: 4, output: 20 },
|
|
47
96
|
[TERRA]: { cacheHit: 0.2, cacheMiss: 2, output: 12 },
|
|
48
97
|
[LUNA]: { cacheHit: 0.02, cacheMiss: 0.2, output: 1.2 },
|
|
49
98
|
};
|
|
@@ -52,7 +101,7 @@ export function price(model) {
|
|
|
52
101
|
return PRICES[model] ?? PRICES[DEFAULT_MODEL];
|
|
53
102
|
}
|
|
54
103
|
/**
|
|
55
|
-
* The model's USABLE context window.
|
|
104
|
+
* The model's USABLE context window. Every model here STORES 1.05M tokens (922K of it
|
|
56
105
|
* input), but this is deliberately the sharp window rather than the storage cap:
|
|
57
106
|
* on BYOK every token in the window is the user's money on every turn, so
|
|
58
107
|
* anchoring compaction at 1M would mean carrying an enormous prompt long after it
|
|
@@ -64,7 +113,7 @@ export function contextWindow(_model) {
|
|
|
64
113
|
/**
|
|
65
114
|
* The ceiling this driver puts on a single BUFFERED (non-streaming) call.
|
|
66
115
|
*
|
|
67
|
-
*
|
|
116
|
+
* Every model here accepts 128K output, but a non-streaming request that runs that
|
|
68
117
|
* long risks an HTTP timeout, so the buffered path — core's small internal calls,
|
|
69
118
|
* like a compaction summary — is capped far lower. `client.ts` sends this value and
|
|
70
119
|
* `dynamo/contextWindow.ts` reserves it; one exported constant means the request
|
|
@@ -83,16 +132,18 @@ export function acceptsImages(_model) {
|
|
|
83
132
|
/**
|
|
84
133
|
* Coerce a stored or unknown config onto a model this provider actually serves.
|
|
85
134
|
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
135
|
+
* Two corrections. A model that cannot skip reasoning is moved onto thinking, at the
|
|
136
|
+
* LIGHTEST rung rather than whatever effort the old config carried: a "no thinking" config
|
|
137
|
+
* arrives from another model with effort `high`, and landing on `high` would spend more of
|
|
138
|
+
* the user's money than the setting they chose. Then the result is snapped onto a rung
|
|
139
|
+
* `/think` actually lists, so a config carried in from another provider by `/model` cannot
|
|
140
|
+
* leave the user on a setting the menu has no tick beside.
|
|
91
141
|
*/
|
|
92
142
|
export function normalize(config) {
|
|
93
143
|
const model = PRICES[config.model] ? config.model : DEFAULT_MODEL;
|
|
94
|
-
const
|
|
95
|
-
const
|
|
144
|
+
const forcedOn = !canSkipReasoning(model) && config.thinking !== true;
|
|
145
|
+
const thinking = forcedOn || config.thinking === true;
|
|
146
|
+
const effort = forcedOn ? "low" : EFFORTS.includes(config.effort) ? config.effort : "high";
|
|
96
147
|
return { model, thinking, effort: snapToOfferedRung(model, thinking, effort) };
|
|
97
148
|
}
|
|
98
149
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/drivers/openai/manifest.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,KAAK,GAAG,aAAa,CAAC;AACnC,MAAM,CAAC,MAAM,GAAG,GAAG,aAAa,CAAC;AACjC,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAAC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAC;AAEnC,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAkB;IACnC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,8CAA8C,EAAE;IAClG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/drivers/openai/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const MAX_38 = "qwen3.8-max";
|
|
2
2
|
export const MAX_37 = "qwen3.7-max";
|
|
3
3
|
export const PLUS = "qwen3.7-plus";
|
|
4
|
+
export const FLASH_38 = "qwen3.8-flash";
|
|
4
5
|
export const FLASH = "qwen3.5-flash";
|
|
5
6
|
/** The model used when nothing is saved and no env override is set. */
|
|
6
7
|
export const DEFAULT_MODEL = PLUS;
|
|
@@ -10,14 +11,15 @@ export const DEFAULT_MODEL = PLUS;
|
|
|
10
11
|
*
|
|
11
12
|
* Plus leads rather than Max: it is roughly a sixth of Max's rate and carries the
|
|
12
13
|
* same 1M window, so it is the one that is rarely the wrong answer for ordinary
|
|
13
|
-
* work.
|
|
14
|
-
*
|
|
14
|
+
* work. The older Max stays listed because it has not been withdrawn, but it now
|
|
15
|
+
* costs MORE than 3.8 Max, and its description says so rather than implying a saving.
|
|
15
16
|
*/
|
|
16
17
|
export const MODELS = [
|
|
17
18
|
{ id: PLUS, label: "Qwen3.7 Plus", description: "balanced and cheap to run — the default" },
|
|
18
19
|
{ id: MAX_38, label: "Qwen3.8 Max", description: "the flagship, for the hardest work" },
|
|
19
|
-
{ id: MAX_37, label: "Qwen3.7 Max", description: "the previous flagship
|
|
20
|
-
{ id:
|
|
20
|
+
{ id: MAX_37, label: "Qwen3.7 Max", description: "the previous flagship — pricier than 3.8 Max" },
|
|
21
|
+
{ id: FLASH_38, label: "Qwen3.8 Flash", description: "the newest Flash — fast and cheap" },
|
|
22
|
+
{ id: FLASH, label: "Qwen3.5 Flash", description: "the previous Flash, cheaper still" },
|
|
21
23
|
];
|
|
22
24
|
/**
|
|
23
25
|
* The reasoning levels offered by `/think`.
|
|
@@ -50,11 +52,22 @@ export function thinkLevels(_model) {
|
|
|
50
52
|
* one these figures come from. This driver targets international, so these are
|
|
51
53
|
* the rates that apply to it.
|
|
52
54
|
*/
|
|
55
|
+
/*
|
|
56
|
+
* Checked against Alibaba's International price table 2026-09-23 (alibabacloud.com,
|
|
57
|
+
* model-studio/model-pricing). Implicit cache hits bill at 20% of input EXCEPT on the
|
|
58
|
+
* Qwen3.8 models, which Alibaba lists as exceptions priced in its console; their cache
|
|
59
|
+
* figures are the rates OpenRouter's live listing carries for the same models.
|
|
60
|
+
*
|
|
61
|
+
* 3.7 Max and 3.5 Flash used to sit at half and about two thirds of their real price
|
|
62
|
+
* here, so every session on them reported well under what it cost.
|
|
63
|
+
*/
|
|
53
64
|
const PRICES = {
|
|
54
65
|
[MAX_38]: { cacheHit: 0.25, cacheMiss: 2, output: 6 },
|
|
55
|
-
[MAX_37]: { cacheHit: 0.
|
|
66
|
+
[MAX_37]: { cacheHit: 0.5, cacheMiss: 2.5, output: 7.5 },
|
|
67
|
+
// Limited-time 20% off the $0.40 / $1.60 list price.
|
|
56
68
|
[PLUS]: { cacheHit: 0.064, cacheMiss: 0.32, output: 1.28 },
|
|
57
|
-
[
|
|
69
|
+
[FLASH_38]: { cacheHit: 0.016, cacheMiss: 0.15, output: 0.47 },
|
|
70
|
+
[FLASH]: { cacheHit: 0.02, cacheMiss: 0.1, output: 0.4 },
|
|
58
71
|
};
|
|
59
72
|
/** Cache-aware list price for a model, falling back to the default model's. */
|
|
60
73
|
export function price(model) {
|