orbitx 0.2.0 → 0.2.3
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 +26 -0
- package/dist/core/ai-provider.d.ts +31 -1
- package/dist/core/ai-provider.d.ts.map +1 -1
- package/dist/core/ai-provider.js.map +1 -1
- package/dist/core/anthropic-provider.d.ts +1 -0
- package/dist/core/anthropic-provider.d.ts.map +1 -1
- package/dist/core/anthropic-provider.js +83 -3
- package/dist/core/anthropic-provider.js.map +1 -1
- package/dist/core/base-agent.d.ts.map +1 -1
- package/dist/core/base-agent.js +7 -3
- package/dist/core/base-agent.js.map +1 -1
- package/dist/core/deepseek-provider.d.ts +1 -0
- package/dist/core/deepseek-provider.d.ts.map +1 -1
- package/dist/core/deepseek-provider.js +51 -1
- package/dist/core/deepseek-provider.js.map +1 -1
- package/dist/core/ollama-provider.d.ts +1 -0
- package/dist/core/ollama-provider.d.ts.map +1 -1
- package/dist/core/ollama-provider.js +45 -1
- package/dist/core/ollama-provider.js.map +1 -1
- package/dist/core/openai-provider.d.ts +1 -0
- package/dist/core/openai-provider.d.ts.map +1 -1
- package/dist/core/openai-provider.js +54 -1
- package/dist/core/openai-provider.js.map +1 -1
- package/dist/core/think-effort.d.ts +21 -0
- package/dist/core/think-effort.d.ts.map +1 -0
- package/dist/core/think-effort.js +19 -0
- package/dist/core/think-effort.js.map +1 -0
- package/dist/core/worker-agent.d.ts +43 -0
- package/dist/core/worker-agent.d.ts.map +1 -0
- package/dist/core/worker-agent.js +40 -0
- package/dist/core/worker-agent.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/tests/index.d.ts +1 -0
- package/dist/tests/index.d.ts.map +1 -1
- package/dist/tests/index.js +1 -0
- package/dist/tests/index.js.map +1 -1
- package/dist/tests/tools/agent/agent-tools.test.d.ts +2 -0
- package/dist/tests/tools/agent/agent-tools.test.d.ts.map +1 -0
- package/dist/tests/tools/agent/agent-tools.test.js +156 -0
- package/dist/tests/tools/agent/agent-tools.test.js.map +1 -0
- package/dist/tools/agent/hire.d.ts +6 -0
- package/dist/tools/agent/hire.d.ts.map +1 -0
- package/dist/tools/agent/hire.js +32 -0
- package/dist/tools/agent/hire.js.map +1 -0
- package/dist/tools/agent/index.d.ts +27 -0
- package/dist/tools/agent/index.d.ts.map +1 -0
- package/dist/tools/agent/index.js +31 -0
- package/dist/tools/agent/index.js.map +1 -0
- package/dist/tools/agent/interaction.d.ts +25 -0
- package/dist/tools/agent/interaction.d.ts.map +1 -0
- package/dist/tools/agent/interaction.js +14 -0
- package/dist/tools/agent/interaction.js.map +1 -0
- package/dist/tools/agent/list.d.ts +5 -0
- package/dist/tools/agent/list.d.ts.map +1 -0
- package/dist/tools/agent/list.js +16 -0
- package/dist/tools/agent/list.js.map +1 -0
- package/dist/tools/agent/prompt.d.ts +6 -0
- package/dist/tools/agent/prompt.d.ts.map +1 -0
- package/dist/tools/agent/prompt.js +73 -0
- package/dist/tools/agent/prompt.js.map +1 -0
- package/dist/tools/agent/registry.d.ts +33 -0
- package/dist/tools/agent/registry.d.ts.map +1 -0
- package/dist/tools/agent/registry.js +68 -0
- package/dist/tools/agent/registry.js.map +1 -0
- package/dist/tools/agent/report.d.ts +12 -0
- package/dist/tools/agent/report.d.ts.map +1 -0
- package/dist/tools/agent/report.js +31 -0
- package/dist/tools/agent/report.js.map +1 -0
- package/dist/tools/fs/list-dir.d.ts.map +1 -1
- package/dist/tools/fs/list-dir.js +0 -1
- package/dist/tools/fs/list-dir.js.map +1 -1
- package/docs/agents.md +163 -0
- package/docs/api-reference.md +54 -0
- package/docs/getting-started.md +78 -0
- package/docs/index.md +23 -0
- package/docs/mcp-architecture.md +103 -0
- package/docs/providers.md +148 -0
- package/docs/skills.md +68 -0
- package/docs/streaming.md +116 -0
- package/docs/tools.md +174 -0
- package/package.json +4 -3
|
@@ -2,11 +2,15 @@ import OpenAI from "openai";
|
|
|
2
2
|
import AIProvider from "./ai-provider.js";
|
|
3
3
|
import { toOpenAIFunctionTools } from "./tool-schema-translator.js";
|
|
4
4
|
import { withRetry } from "./retry.js";
|
|
5
|
+
import { resolveThinkEffortLevel } from "./think-effort.js";
|
|
5
6
|
const MODEL_CONTEXT_WINDOWS = {
|
|
6
7
|
"deepseek-v4-flash": 1_000_000,
|
|
7
8
|
"deepseek-v4-pro": 1_000_000,
|
|
8
9
|
};
|
|
9
10
|
const DEFAULT_CONTEXT_WINDOW = 1_000_000;
|
|
11
|
+
// DeepSeek's reasoning models accept `reasoning_effort` as one of these
|
|
12
|
+
// four levels (OpenAI-compatible param, not in the `openai` SDK's types).
|
|
13
|
+
const DEEPSEEK_THINK_LEVELS = ["none", "low", "high", "max"];
|
|
10
14
|
function toOpenAIMessages(messages) {
|
|
11
15
|
return messages.map(msg => {
|
|
12
16
|
if (msg.role === "tool") {
|
|
@@ -59,6 +63,8 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
59
63
|
#model;
|
|
60
64
|
#supportsTools;
|
|
61
65
|
#contextWindow;
|
|
66
|
+
/** Universal 0-1 thinking effort — see src/core/think-effort.ts. Mapped onto DEEPSEEK_THINK_LEVELS in #chat. */
|
|
67
|
+
#thinkEffort;
|
|
62
68
|
constructor(apiKey, model = "deepseek-v4-flash", options = {}) {
|
|
63
69
|
super();
|
|
64
70
|
this.#client = new OpenAI({
|
|
@@ -68,6 +74,7 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
68
74
|
this.#model = model;
|
|
69
75
|
this.#supportsTools = options.supportsTools ?? true;
|
|
70
76
|
this.#contextWindow = options.contextWindow ?? MODEL_CONTEXT_WINDOWS[model] ?? DEFAULT_CONTEXT_WINDOW;
|
|
77
|
+
this.#thinkEffort = options.thinkEffort;
|
|
71
78
|
}
|
|
72
79
|
getCapabilities() {
|
|
73
80
|
return {
|
|
@@ -75,6 +82,7 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
75
82
|
supportsImages: false,
|
|
76
83
|
contextWindow: this.#contextWindow,
|
|
77
84
|
safeUsageRatio: 0.5,
|
|
85
|
+
supportsThinking: true,
|
|
78
86
|
};
|
|
79
87
|
}
|
|
80
88
|
async chat(messages, streamCallback, tools) {
|
|
@@ -82,6 +90,8 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
82
90
|
const formattedTools = tools && tools.length > 0 && this.#supportsTools
|
|
83
91
|
? toOpenAIFunctionTools(tools)
|
|
84
92
|
: undefined;
|
|
93
|
+
const thinkLevel = resolveThinkEffortLevel(this.#thinkEffort, DEEPSEEK_THINK_LEVELS);
|
|
94
|
+
const thinkParam = thinkLevel !== undefined ? { reasoning_effort: thinkLevel } : {};
|
|
85
95
|
if (streamCallback) {
|
|
86
96
|
return withRetry(async () => {
|
|
87
97
|
// Per-attempt accumulators live inside this closure so a
|
|
@@ -91,12 +101,35 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
91
101
|
model: this.#model,
|
|
92
102
|
messages: formattedMessages,
|
|
93
103
|
...(formattedTools ? { tools: formattedTools } : {}),
|
|
104
|
+
...thinkParam,
|
|
94
105
|
stream: true
|
|
95
106
|
});
|
|
96
107
|
let fullContent = "";
|
|
108
|
+
let fullThinking = "";
|
|
97
109
|
let inputTokens = 0;
|
|
98
110
|
let outputTokens = 0;
|
|
99
111
|
const toolCallChunks = {};
|
|
112
|
+
// See the identical comment in openai-provider.ts: DeepSeek's
|
|
113
|
+
// Chat-Completions-compatible stream has no explicit
|
|
114
|
+
// "this tool call is done" event, so completion is inferred
|
|
115
|
+
// from the next call's id starting to arrive (or the stream
|
|
116
|
+
// ending, for the last/only call).
|
|
117
|
+
const emittedIndices = new Set();
|
|
118
|
+
let activeIndex;
|
|
119
|
+
const finalizeAndEmit = async (idx) => {
|
|
120
|
+
if (emittedIndices.has(idx))
|
|
121
|
+
return;
|
|
122
|
+
emittedIndices.add(idx);
|
|
123
|
+
const tc = toolCallChunks[idx];
|
|
124
|
+
let inputs = {};
|
|
125
|
+
try {
|
|
126
|
+
inputs = JSON.parse(tc.arguments || "{}");
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
inputs = {};
|
|
130
|
+
}
|
|
131
|
+
await streamCallback({ role: "assistant", content: "", done: false, toolCalls: [{ id: tc.id || "", name: tc.name || "", inputs }] });
|
|
132
|
+
};
|
|
100
133
|
for await (const chunk of stream) {
|
|
101
134
|
const delta = chunk.choices[0]?.delta;
|
|
102
135
|
const content = delta?.content || "";
|
|
@@ -104,9 +137,19 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
104
137
|
fullContent += content;
|
|
105
138
|
await streamCallback({ role: "assistant", content, done: false });
|
|
106
139
|
}
|
|
140
|
+
// DeepSeek's reasoner models stream reasoning text on
|
|
141
|
+
// `delta.reasoning_content`, separately from `content`.
|
|
142
|
+
const reasoning = delta?.reasoning_content || "";
|
|
143
|
+
if (reasoning) {
|
|
144
|
+
fullThinking += reasoning;
|
|
145
|
+
await streamCallback({ role: "assistant", content: "", done: false, thinking: reasoning });
|
|
146
|
+
}
|
|
107
147
|
if (delta?.tool_calls) {
|
|
108
148
|
for (const tc of delta.tool_calls) {
|
|
109
149
|
const idx = tc.index ?? 0;
|
|
150
|
+
if (tc.id && activeIndex !== undefined && activeIndex !== idx) {
|
|
151
|
+
await finalizeAndEmit(activeIndex);
|
|
152
|
+
}
|
|
110
153
|
if (!toolCallChunks[idx])
|
|
111
154
|
toolCallChunks[idx] = { arguments: "" };
|
|
112
155
|
if (tc.id)
|
|
@@ -115,6 +158,7 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
115
158
|
toolCallChunks[idx].name = tc.function.name;
|
|
116
159
|
if (tc.function?.arguments)
|
|
117
160
|
toolCallChunks[idx].arguments += tc.function.arguments;
|
|
161
|
+
activeIndex = idx;
|
|
118
162
|
}
|
|
119
163
|
}
|
|
120
164
|
if (chunk.usage) {
|
|
@@ -122,6 +166,9 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
122
166
|
outputTokens = chunk.usage.completion_tokens || 0;
|
|
123
167
|
}
|
|
124
168
|
}
|
|
169
|
+
if (activeIndex !== undefined) {
|
|
170
|
+
await finalizeAndEmit(activeIndex);
|
|
171
|
+
}
|
|
125
172
|
const toolCalls = Object.keys(toolCallChunks).length > 0
|
|
126
173
|
? Object.values(toolCallChunks).map(tc => {
|
|
127
174
|
let inputs = {};
|
|
@@ -134,12 +181,13 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
134
181
|
return { id: tc.id || "", name: tc.name || "", inputs };
|
|
135
182
|
})
|
|
136
183
|
: undefined;
|
|
137
|
-
await streamCallback({ role: "assistant", content: "", done: true
|
|
184
|
+
await streamCallback({ role: "assistant", content: "", done: true });
|
|
138
185
|
return {
|
|
139
186
|
content: fullContent,
|
|
140
187
|
inputTokens,
|
|
141
188
|
outputTokens,
|
|
142
189
|
...(toolCalls ? { toolCalls } : {}),
|
|
190
|
+
...(fullThinking ? { thinking: fullThinking } : {}),
|
|
143
191
|
};
|
|
144
192
|
});
|
|
145
193
|
}
|
|
@@ -149,6 +197,7 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
149
197
|
model: this.#model,
|
|
150
198
|
messages: formattedMessages,
|
|
151
199
|
...(formattedTools ? { tools: formattedTools } : {}),
|
|
200
|
+
...thinkParam,
|
|
152
201
|
});
|
|
153
202
|
const message = response.choices[0]?.message;
|
|
154
203
|
return {
|
|
@@ -156,6 +205,7 @@ export class DeepSeekProvider extends AIProvider {
|
|
|
156
205
|
inputTokens: response.usage?.prompt_tokens || 0,
|
|
157
206
|
outputTokens: response.usage?.completion_tokens || 0,
|
|
158
207
|
...(fromOpenAIToolCalls(message?.tool_calls) ? { toolCalls: fromOpenAIToolCalls(message?.tool_calls) } : {}),
|
|
208
|
+
...(message?.reasoning_content ? { thinking: message.reasoning_content } : {}),
|
|
159
209
|
};
|
|
160
210
|
});
|
|
161
211
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-provider.js","sourceRoot":"","sources":["../../src/core/deepseek-provider.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"deepseek-provider.js","sourceRoot":"","sources":["../../src/core/deepseek-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare class OllamaProvider extends AIProvider {
|
|
|
5
5
|
constructor(model: string, host?: string, options?: {
|
|
6
6
|
supportsTools?: boolean;
|
|
7
7
|
contextWindow?: number;
|
|
8
|
+
thinkEffort?: number;
|
|
8
9
|
});
|
|
9
10
|
getCapabilities(): ProviderCapabilities;
|
|
10
11
|
chat(messages: Message[], streamCallback?: StreamCallback, tools?: ToolSchema[]): Promise<ChatResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-provider.d.ts","sourceRoot":"","sources":["../../src/core/ollama-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAmB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACjI,OAAO,UAAU,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama-provider.d.ts","sourceRoot":"","sources":["../../src/core/ollama-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAmB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACjI,OAAO,UAAU,MAAM,kBAAkB,CAAC;AA+D1C,qBAAa,cAAe,SAAQ,UAAU;;gBAa9B,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAiC,EAAE,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAS3J,eAAe,IAAI,oBAAoB;IAUjC,IAAI,CACN,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,CAAC,EAAE,UAAU,EAAE,GACrB,OAAO,CAAC,YAAY,CAAC;CAuG3B;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -2,7 +2,14 @@ import { Ollama } from "ollama";
|
|
|
2
2
|
import AIProvider from "./ai-provider.js";
|
|
3
3
|
import { toOpenAIFunctionTools } from "./tool-schema-translator.js";
|
|
4
4
|
import { withRetry } from "./retry.js";
|
|
5
|
+
import { resolveThinkEffortLevel } from "./think-effort.js";
|
|
5
6
|
const DEFAULT_CONTEXT_WINDOW = 32_000;
|
|
7
|
+
// Ollama's `think` option accepts a boolean (most thinking-capable models,
|
|
8
|
+
// e.g. deepseek-r1/qwen3) or, for a smaller set of newer models (e.g.
|
|
9
|
+
// gpt-oss), one of these three levels. thinkEffort === 0 maps to `false`
|
|
10
|
+
// (thinking off) rather than the lowest level, so it still works as an
|
|
11
|
+
// on/off switch for models that only understand booleans.
|
|
12
|
+
const OLLAMA_THINK_LEVELS = ["low", "medium", "high"];
|
|
6
13
|
function toOllamaMessages(messages, supportsTools) {
|
|
7
14
|
return messages.map(msg => {
|
|
8
15
|
// Ollama rejects `tool`-role messages for models that don't support
|
|
@@ -57,12 +64,15 @@ export class OllamaProvider extends AIProvider {
|
|
|
57
64
|
// the model card (most recent tool-capable families default to true).
|
|
58
65
|
#supportsTools;
|
|
59
66
|
#contextWindow;
|
|
67
|
+
/** Universal 0-1 thinking effort — see src/core/think-effort.ts. Mapped onto a boolean or OLLAMA_THINK_LEVELS in #chat; ignored by models that don't support thinking (Ollama itself ignores an unrecognized `think` value rather than erroring). */
|
|
68
|
+
#thinkEffort;
|
|
60
69
|
constructor(model, host = "http://localhost:11434", options = {}) {
|
|
61
70
|
super();
|
|
62
71
|
this.#client = new Ollama({ host });
|
|
63
72
|
this.#model = model;
|
|
64
73
|
this.#supportsTools = options.supportsTools ?? false;
|
|
65
74
|
this.#contextWindow = options.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
75
|
+
this.#thinkEffort = options.thinkEffort;
|
|
66
76
|
}
|
|
67
77
|
getCapabilities() {
|
|
68
78
|
return {
|
|
@@ -70,6 +80,7 @@ export class OllamaProvider extends AIProvider {
|
|
|
70
80
|
supportsImages: true,
|
|
71
81
|
contextWindow: this.#contextWindow,
|
|
72
82
|
safeUsageRatio: 0.5,
|
|
83
|
+
supportsThinking: true,
|
|
73
84
|
};
|
|
74
85
|
}
|
|
75
86
|
async chat(messages, streamCallback, tools) {
|
|
@@ -79,6 +90,14 @@ export class OllamaProvider extends AIProvider {
|
|
|
79
90
|
const formattedTools = tools && tools.length > 0 && this.#supportsTools
|
|
80
91
|
? toOpenAIFunctionTools(tools)
|
|
81
92
|
: undefined;
|
|
93
|
+
// OLLAMA_THINK_LEVELS only contains "low"/"medium"/"high", so this
|
|
94
|
+
// narrows to what Ollama's own `think` type actually accepts.
|
|
95
|
+
const think = this.#thinkEffort === undefined
|
|
96
|
+
? undefined
|
|
97
|
+
: this.#thinkEffort <= 0
|
|
98
|
+
? false
|
|
99
|
+
: resolveThinkEffortLevel(this.#thinkEffort, OLLAMA_THINK_LEVELS);
|
|
100
|
+
const thinkParam = think !== undefined ? { think } : {};
|
|
82
101
|
if (streamCallback) {
|
|
83
102
|
return withRetry(async () => {
|
|
84
103
|
// Per-attempt accumulators live inside this closure so a
|
|
@@ -88,20 +107,41 @@ export class OllamaProvider extends AIProvider {
|
|
|
88
107
|
model: this.#model,
|
|
89
108
|
messages: formattedMessages,
|
|
90
109
|
...(formattedTools ? { tools: formattedTools } : {}),
|
|
110
|
+
...thinkParam,
|
|
91
111
|
stream: true
|
|
92
112
|
});
|
|
93
113
|
let fullContent = "";
|
|
114
|
+
let fullThinking = "";
|
|
94
115
|
let promptEvalCount = 0;
|
|
95
116
|
let evalCount = 0;
|
|
96
117
|
let toolCalls;
|
|
118
|
+
const emittedToolCallIds = new Set();
|
|
97
119
|
for await (const chunk of stream) {
|
|
98
120
|
const content = chunk.message?.content || "";
|
|
99
121
|
if (content) {
|
|
100
122
|
fullContent += content;
|
|
101
123
|
await streamCallback({ role: "assistant", content, done: false });
|
|
102
124
|
}
|
|
125
|
+
// Thinking-capable models stream reasoning text on
|
|
126
|
+
// `message.thinking`, separately from `message.content`.
|
|
127
|
+
const thinking = chunk.message?.thinking || "";
|
|
128
|
+
if (thinking) {
|
|
129
|
+
fullThinking += thinking;
|
|
130
|
+
await streamCallback({ role: "assistant", content: "", done: false, thinking });
|
|
131
|
+
}
|
|
103
132
|
if (chunk.message?.tool_calls?.length) {
|
|
133
|
+
// Unlike OpenAI/DeepSeek/Anthropic, Ollama doesn't
|
|
134
|
+
// stream a tool call's arguments incrementally — each
|
|
135
|
+
// one arrives already fully formed, so it can be
|
|
136
|
+
// emitted the moment it's seen instead of waiting
|
|
137
|
+
// for the response to finish.
|
|
104
138
|
toolCalls = fromOllamaToolCalls(chunk.message.tool_calls);
|
|
139
|
+
for (const toolCall of toolCalls ?? []) {
|
|
140
|
+
if (emittedToolCallIds.has(toolCall.id))
|
|
141
|
+
continue;
|
|
142
|
+
emittedToolCallIds.add(toolCall.id);
|
|
143
|
+
await streamCallback({ role: "assistant", content: "", done: false, toolCalls: [toolCall] });
|
|
144
|
+
}
|
|
105
145
|
}
|
|
106
146
|
if (chunk.prompt_eval_count !== undefined) {
|
|
107
147
|
promptEvalCount = chunk.prompt_eval_count;
|
|
@@ -110,12 +150,13 @@ export class OllamaProvider extends AIProvider {
|
|
|
110
150
|
evalCount = chunk.eval_count;
|
|
111
151
|
}
|
|
112
152
|
}
|
|
113
|
-
await streamCallback({ role: "assistant", content: "", done: true
|
|
153
|
+
await streamCallback({ role: "assistant", content: "", done: true });
|
|
114
154
|
return {
|
|
115
155
|
content: fullContent,
|
|
116
156
|
inputTokens: promptEvalCount,
|
|
117
157
|
outputTokens: evalCount,
|
|
118
158
|
...(toolCalls ? { toolCalls } : {}),
|
|
159
|
+
...(fullThinking ? { thinking: fullThinking } : {}),
|
|
119
160
|
};
|
|
120
161
|
});
|
|
121
162
|
}
|
|
@@ -125,12 +166,15 @@ export class OllamaProvider extends AIProvider {
|
|
|
125
166
|
model: this.#model,
|
|
126
167
|
messages: formattedMessages,
|
|
127
168
|
...(formattedTools ? { tools: formattedTools } : {}),
|
|
169
|
+
...thinkParam,
|
|
128
170
|
});
|
|
171
|
+
const thinking = response.message?.thinking;
|
|
129
172
|
return {
|
|
130
173
|
content: response.message?.content || "",
|
|
131
174
|
inputTokens: response.prompt_eval_count || 0,
|
|
132
175
|
outputTokens: response.eval_count || 0,
|
|
133
176
|
...(fromOllamaToolCalls(response.message?.tool_calls) ? { toolCalls: fromOllamaToolCalls(response.message?.tool_calls) } : {}),
|
|
177
|
+
...(thinking ? { thinking } : {}),
|
|
134
178
|
};
|
|
135
179
|
});
|
|
136
180
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../src/core/ollama-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../src/core/ollama-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export declare class OpenAIProvider extends AIProvider {
|
|
|
7
7
|
supportsImages?: boolean;
|
|
8
8
|
contextWindow?: number;
|
|
9
9
|
baseURL?: string;
|
|
10
|
+
thinkEffort?: number;
|
|
10
11
|
});
|
|
11
12
|
getCapabilities(): ProviderCapabilities;
|
|
12
13
|
chat(messages: Message[], streamCallback?: StreamCallback, tools?: ToolSchema[]): Promise<ChatResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../src/core/openai-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAmB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACjI,OAAO,UAAU,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../src/core/openai-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAmB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACjI,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAsF1C,qBAAa,cAAe,SAAQ,UAAU;;gBAS9B,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAgB,EAAE,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAaxL,eAAe,IAAI,oBAAoB;IAUjC,IAAI,CACN,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,CAAC,EAAE,UAAU,EAAE,GACrB,OAAO,CAAC,YAAY,CAAC;CAqH3B;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -2,6 +2,18 @@ import OpenAI from "openai";
|
|
|
2
2
|
import AIProvider from "./ai-provider.js";
|
|
3
3
|
import { toOpenAIFunctionTools } from "./tool-schema-translator.js";
|
|
4
4
|
import { withRetry } from "./retry.js";
|
|
5
|
+
import { resolveThinkEffortLevel } from "./think-effort.js";
|
|
6
|
+
// Only OpenAI's reasoning-capable model families accept `reasoning_effort`
|
|
7
|
+
// at all — sending it to a non-reasoning model errors, so `thinkEffort` is
|
|
8
|
+
// silently ignored for anything outside this list. Chat Completions never
|
|
9
|
+
// exposes the reasoning text itself (unlike DeepSeek/Anthropic/Ollama), so
|
|
10
|
+
// there is no streamed `thinking` output for OpenAI even when this
|
|
11
|
+
// param is honored server-side.
|
|
12
|
+
const REASONING_MODEL_PREFIXES = ["o1", "o3", "o4", "gpt-5"];
|
|
13
|
+
const OPENAI_THINK_LEVELS = ["low", "medium", "high"];
|
|
14
|
+
function isReasoningModel(model) {
|
|
15
|
+
return REASONING_MODEL_PREFIXES.some(prefix => model.startsWith(prefix));
|
|
16
|
+
}
|
|
5
17
|
const MODEL_CONTEXT_WINDOWS = {
|
|
6
18
|
"gpt-5": 400_000,
|
|
7
19
|
"gpt-5-mini": 400_000,
|
|
@@ -71,6 +83,8 @@ export class OpenAIProvider extends AIProvider {
|
|
|
71
83
|
#supportsTools;
|
|
72
84
|
#supportsImages;
|
|
73
85
|
#contextWindow;
|
|
86
|
+
/** Universal 0-1 thinking effort — see src/core/think-effort.ts. Ignored unless the model is reasoning-capable (see isReasoningModel). */
|
|
87
|
+
#thinkEffort;
|
|
74
88
|
constructor(apiKey, model = "gpt-5", options = {}) {
|
|
75
89
|
super();
|
|
76
90
|
this.#client = new OpenAI({
|
|
@@ -81,6 +95,7 @@ export class OpenAIProvider extends AIProvider {
|
|
|
81
95
|
this.#supportsTools = options.supportsTools ?? true;
|
|
82
96
|
this.#supportsImages = options.supportsImages ?? !NO_IMAGE_MODELS.has(model);
|
|
83
97
|
this.#contextWindow = options.contextWindow ?? MODEL_CONTEXT_WINDOWS[model] ?? DEFAULT_CONTEXT_WINDOW;
|
|
98
|
+
this.#thinkEffort = options.thinkEffort;
|
|
84
99
|
}
|
|
85
100
|
getCapabilities() {
|
|
86
101
|
return {
|
|
@@ -88,6 +103,7 @@ export class OpenAIProvider extends AIProvider {
|
|
|
88
103
|
supportsImages: this.#supportsImages,
|
|
89
104
|
contextWindow: this.#contextWindow,
|
|
90
105
|
safeUsageRatio: 0.5,
|
|
106
|
+
supportsThinking: false,
|
|
91
107
|
};
|
|
92
108
|
}
|
|
93
109
|
async chat(messages, streamCallback, tools) {
|
|
@@ -95,6 +111,10 @@ export class OpenAIProvider extends AIProvider {
|
|
|
95
111
|
const formattedTools = tools && tools.length > 0 && this.#supportsTools
|
|
96
112
|
? toOpenAIFunctionTools(tools)
|
|
97
113
|
: undefined;
|
|
114
|
+
const thinkLevel = isReasoningModel(this.#model)
|
|
115
|
+
? resolveThinkEffortLevel(this.#thinkEffort, OPENAI_THINK_LEVELS)
|
|
116
|
+
: undefined;
|
|
117
|
+
const thinkParam = thinkLevel !== undefined ? { reasoning_effort: thinkLevel } : {};
|
|
98
118
|
if (streamCallback) {
|
|
99
119
|
return withRetry(async () => {
|
|
100
120
|
// Per-attempt accumulators live inside this closure so a
|
|
@@ -104,6 +124,7 @@ export class OpenAIProvider extends AIProvider {
|
|
|
104
124
|
model: this.#model,
|
|
105
125
|
messages: formattedMessages,
|
|
106
126
|
...(formattedTools ? { tools: formattedTools } : {}),
|
|
127
|
+
...thinkParam,
|
|
107
128
|
stream: true,
|
|
108
129
|
stream_options: { include_usage: true },
|
|
109
130
|
});
|
|
@@ -111,6 +132,30 @@ export class OpenAIProvider extends AIProvider {
|
|
|
111
132
|
let inputTokens = 0;
|
|
112
133
|
let outputTokens = 0;
|
|
113
134
|
const toolCallChunks = {};
|
|
135
|
+
// OpenAI streams tool calls sequentially, one index at a
|
|
136
|
+
// time, with no explicit "this call is done" event — the
|
|
137
|
+
// only signal is the next call's first delta (carrying a
|
|
138
|
+
// fresh `id`) starting to arrive. So: whenever a new index
|
|
139
|
+
// shows up, the previously-active one must be finished;
|
|
140
|
+
// finalize and emit it then. The very last call in the
|
|
141
|
+
// response has no "next" index to trigger on, so it's
|
|
142
|
+
// finalized after the loop ends instead.
|
|
143
|
+
const emittedIndices = new Set();
|
|
144
|
+
let activeIndex;
|
|
145
|
+
const finalizeAndEmit = async (idx) => {
|
|
146
|
+
if (emittedIndices.has(idx))
|
|
147
|
+
return;
|
|
148
|
+
emittedIndices.add(idx);
|
|
149
|
+
const tc = toolCallChunks[idx];
|
|
150
|
+
let inputs = {};
|
|
151
|
+
try {
|
|
152
|
+
inputs = JSON.parse(tc.arguments || "{}");
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
inputs = {};
|
|
156
|
+
}
|
|
157
|
+
await streamCallback({ role: "assistant", content: "", done: false, toolCalls: [{ id: tc.id || "", name: tc.name || "", inputs }] });
|
|
158
|
+
};
|
|
114
159
|
for await (const chunk of stream) {
|
|
115
160
|
const delta = chunk.choices[0]?.delta;
|
|
116
161
|
const content = delta?.content || "";
|
|
@@ -121,6 +166,9 @@ export class OpenAIProvider extends AIProvider {
|
|
|
121
166
|
if (delta?.tool_calls) {
|
|
122
167
|
for (const tc of delta.tool_calls) {
|
|
123
168
|
const idx = tc.index ?? 0;
|
|
169
|
+
if (tc.id && activeIndex !== undefined && activeIndex !== idx) {
|
|
170
|
+
await finalizeAndEmit(activeIndex);
|
|
171
|
+
}
|
|
124
172
|
if (!toolCallChunks[idx])
|
|
125
173
|
toolCallChunks[idx] = { arguments: "" };
|
|
126
174
|
if (tc.id)
|
|
@@ -129,6 +177,7 @@ export class OpenAIProvider extends AIProvider {
|
|
|
129
177
|
toolCallChunks[idx].name = tc.function.name;
|
|
130
178
|
if (tc.function?.arguments)
|
|
131
179
|
toolCallChunks[idx].arguments += tc.function.arguments;
|
|
180
|
+
activeIndex = idx;
|
|
132
181
|
}
|
|
133
182
|
}
|
|
134
183
|
if (chunk.usage) {
|
|
@@ -136,6 +185,9 @@ export class OpenAIProvider extends AIProvider {
|
|
|
136
185
|
outputTokens = chunk.usage.completion_tokens || 0;
|
|
137
186
|
}
|
|
138
187
|
}
|
|
188
|
+
if (activeIndex !== undefined) {
|
|
189
|
+
await finalizeAndEmit(activeIndex);
|
|
190
|
+
}
|
|
139
191
|
const toolCalls = Object.keys(toolCallChunks).length > 0
|
|
140
192
|
? Object.values(toolCallChunks).map(tc => {
|
|
141
193
|
let inputs = {};
|
|
@@ -148,7 +200,7 @@ export class OpenAIProvider extends AIProvider {
|
|
|
148
200
|
return { id: tc.id || "", name: tc.name || "", inputs };
|
|
149
201
|
})
|
|
150
202
|
: undefined;
|
|
151
|
-
await streamCallback({ role: "assistant", content: "", done: true
|
|
203
|
+
await streamCallback({ role: "assistant", content: "", done: true });
|
|
152
204
|
return {
|
|
153
205
|
content: fullContent,
|
|
154
206
|
inputTokens,
|
|
@@ -163,6 +215,7 @@ export class OpenAIProvider extends AIProvider {
|
|
|
163
215
|
model: this.#model,
|
|
164
216
|
messages: formattedMessages,
|
|
165
217
|
...(formattedTools ? { tools: formattedTools } : {}),
|
|
218
|
+
...thinkParam,
|
|
166
219
|
});
|
|
167
220
|
const message = response.choices[0]?.message;
|
|
168
221
|
const toolCalls = fromOpenAIToolCalls(message?.tool_calls);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/core/openai-provider.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/core/openai-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every provider's native "how hard should the model think" knob uses a
|
|
3
|
+
* different scale (OpenAI/Ollama: low/medium/high, DeepSeek: none/low/high/max,
|
|
4
|
+
* Anthropic: a numeric thinking-token budget). OrbitX exposes a single
|
|
5
|
+
* universal 0-1 float (`thinkEffort`) on every provider's constructor
|
|
6
|
+
* options instead, and each provider maps it onto whatever scale it
|
|
7
|
+
* actually accepts via this helper. Providers/models with no thinking
|
|
8
|
+
* support at all simply ignore the option.
|
|
9
|
+
*/
|
|
10
|
+
export type ThinkEffortLevel = "none" | "low" | "medium" | "high" | "max";
|
|
11
|
+
/** Clamp an arbitrary number into the valid 0-1 think-effort range. */
|
|
12
|
+
export declare function clampThinkEffort(effort: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Bucket a universal 0-1 think-effort value into one of a provider's
|
|
15
|
+
* supported levels, evenly spaced so 0 always lands on `levels[0]` and 1
|
|
16
|
+
* always lands on the last entry. Returns undefined when no effort was
|
|
17
|
+
* requested, so callers can distinguish "not set" from "set to the lowest
|
|
18
|
+
* level" and omit the native param entirely in the former case.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveThinkEffortLevel(effort: number | undefined, levels: readonly ThinkEffortLevel[]): ThinkEffortLevel | undefined;
|
|
21
|
+
//# sourceMappingURL=think-effort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"think-effort.d.ts","sourceRoot":"","sources":["../../src/core/think-effort.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1E,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,SAAS,gBAAgB,EAAE,GACpC,gBAAgB,GAAG,SAAS,CAK9B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Clamp an arbitrary number into the valid 0-1 think-effort range. */
|
|
2
|
+
export function clampThinkEffort(effort) {
|
|
3
|
+
return Math.max(0, Math.min(1, effort));
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Bucket a universal 0-1 think-effort value into one of a provider's
|
|
7
|
+
* supported levels, evenly spaced so 0 always lands on `levels[0]` and 1
|
|
8
|
+
* always lands on the last entry. Returns undefined when no effort was
|
|
9
|
+
* requested, so callers can distinguish "not set" from "set to the lowest
|
|
10
|
+
* level" and omit the native param entirely in the former case.
|
|
11
|
+
*/
|
|
12
|
+
export function resolveThinkEffortLevel(effort, levels) {
|
|
13
|
+
if (effort === undefined || levels.length === 0)
|
|
14
|
+
return undefined;
|
|
15
|
+
const clamped = clampThinkEffort(effort);
|
|
16
|
+
const index = Math.round(clamped * (levels.length - 1));
|
|
17
|
+
return levels[index];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=think-effort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"think-effort.js","sourceRoot":"","sources":["../../src/core/think-effort.ts"],"names":[],"mappings":"AAWA,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACnC,MAA0B,EAC1B,MAAmC;IAEnC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}
|