modeldispatcher-browser-agent 0.6.7 → 0.7.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 +60 -1
- package/dist/agent.d.ts +12 -3
- package/dist/agent.js +1 -1
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts +3 -1
- package/dist/providers/anthropic.js +66 -0
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/gemini.d.ts +5 -1
- package/dist/providers/gemini.js +94 -0
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/ollama.d.ts +3 -1
- package/dist/providers/ollama.js +53 -0
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openaiCompatible.d.ts +5 -1
- package/dist/providers/openaiCompatible.js +82 -0
- package/dist/providers/openaiCompatible.js.map +1 -1
- package/dist/toolMessages.d.ts +4 -0
- package/dist/toolMessages.js +10 -0
- package/dist/toolMessages.js.map +1 -0
- package/dist/tools.d.ts +54 -0
- package/dist/tools.js +140 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/package.json +2 -2
- package/src/agent.ts +2 -2
- package/src/index.ts +7 -0
- package/src/providers/anthropic.ts +90 -1
- package/src/providers/gemini.ts +125 -1
- package/src/providers/ollama.ts +73 -1
- package/src/providers/openaiCompatible.ts +103 -1
- package/src/toolMessages.ts +11 -0
- package/src/tools.ts +215 -0
- package/src/types.ts +52 -0
package/README.md
CHANGED
|
@@ -85,6 +85,64 @@ instead of silently retried on the next provider — the caller has already
|
|
|
85
85
|
rendered a partial answer, and switching providers mid-stream would
|
|
86
86
|
duplicate or contradict it rather than complete it.
|
|
87
87
|
|
|
88
|
+
## Tool calling: `runWithTools`
|
|
89
|
+
|
|
90
|
+
Let the model call functions that run in the browser — reading the user's
|
|
91
|
+
own data from the device, looking something up — until it answers. The same
|
|
92
|
+
bounded loop as the Python core's `AgentLoop`, with every provider:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
import { loadConfig, runWithTools, type Tool } from "modeldispatcher-browser-agent";
|
|
96
|
+
|
|
97
|
+
const getHoldings: Tool = {
|
|
98
|
+
spec: {
|
|
99
|
+
name: "get_holdings",
|
|
100
|
+
description: "The user's holdings, read from this device",
|
|
101
|
+
parameters: { type: "object", properties: {} },
|
|
102
|
+
},
|
|
103
|
+
run: async () => JSON.stringify(await store.holdings()),
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const out = await runWithTools(loadConfig(), [{ role: "user", content: "Am I too concentrated?" }], {
|
|
107
|
+
tools: [getHoldings],
|
|
108
|
+
systemInstruction: "Answer from the user's own data.",
|
|
109
|
+
onToolResult: (call) => showStatus(`Looked at ${call.name}…`),
|
|
110
|
+
});
|
|
111
|
+
out.text; // the answer
|
|
112
|
+
out.toolsUsed; // ["get_holdings"]
|
|
113
|
+
out.messages; // the whole conversation, tool turns included, to continue it
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- **Every provider.** Gemini, OpenAI, Anthropic, Groq and Ollama (a
|
|
117
|
+
tool-capable local model). The history is kept in one neutral form
|
|
118
|
+
(`ToolChatMessage`) and translated to each provider's format per turn, so
|
|
119
|
+
fallback still works: if a provider fails on turn 3, the next one picks up
|
|
120
|
+
the conversation where it stopped.
|
|
121
|
+
- **Tools run on the device, one at a time, in the order asked**, so a write
|
|
122
|
+
lands before a later read. Whatever a tool returns is what the model reads;
|
|
123
|
+
if it throws, or the model names a tool that doesn't exist, the model gets
|
|
124
|
+
the error text and can recover instead of the run failing.
|
|
125
|
+
- **Bounded.** At most `maxSteps` model turns (default 6). A run that hits the
|
|
126
|
+
limit returns `stopReason: "max_steps"`: the last turn's tools have run, but
|
|
127
|
+
the model never saw their results, and `text` is whatever it said alongside
|
|
128
|
+
asking for them (often empty).
|
|
129
|
+
- **A blocked or cut-off reply counts as a failure**, not an answer: a safety
|
|
130
|
+
block, a refusal, or a tool call cut off by the token limit moves the turn to
|
|
131
|
+
the next configured provider, as an HTTP error would.
|
|
132
|
+
- **One system prompt.** `systemInstruction` if given, else every system turn
|
|
133
|
+
in `messages`, joined; the same text whichever provider runs.
|
|
134
|
+
- **Not streamed.** A turn can end in tool calls rather than text, so there is
|
|
135
|
+
no single text stream; use `onToolResult` to show progress.
|
|
136
|
+
- **Schemas.** Keep `parameters` to the JSON Schema subset every provider
|
|
137
|
+
accepts (`type`, `properties`, `required`, `description`, `enum`, `items`).
|
|
138
|
+
Gemini rejects the rest, so `additionalProperties` and `$schema` are dropped
|
|
139
|
+
for it, and a tool with no properties is declared without `parameters`;
|
|
140
|
+
`default`, `const`, `$ref`/`$defs` and `oneOf` are not translated, so avoid
|
|
141
|
+
them. After a fallback into Gemini, calls another provider made carry
|
|
142
|
+
Google's placeholder thought signature.
|
|
143
|
+
- **Tools don't receive the abort signal**: an abort takes effect at the next
|
|
144
|
+
provider call.
|
|
145
|
+
|
|
88
146
|
## No-API-key escape hatch: `openExternalChat`
|
|
89
147
|
|
|
90
148
|
For a user with no API key configured (or who just doesn't want to set one
|
|
@@ -188,7 +246,8 @@ the non-Vite env var forms: [`docs/USAGE.md`](../../docs/USAGE.md).
|
|
|
188
246
|
This package owns the generic "talk to a provider" plumbing: provider
|
|
189
247
|
configs, request/response translation, SSE/NDJSON stream parsing, retry on
|
|
190
248
|
429/5xx, cross-provider/cross-key fallback dispatch, timeout/abort handling,
|
|
191
|
-
Ollama URL validation,
|
|
249
|
+
Ollama URL validation, chat-history normalisation, and the tool-calling loop
|
|
250
|
+
(translating tool calls and results per provider). It deliberately does
|
|
192
251
|
**not** know about any app's actual
|
|
193
252
|
prompts or business logic (job-search coaching, trip parsing, whatever) —
|
|
194
253
|
that stays in each app, calling through this the same way
|
package/dist/agent.d.ts
CHANGED
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
* provider module; callers never need their own provider switch statement.
|
|
15
15
|
*/
|
|
16
16
|
import { type BuildMessagesOptions } from "./messages.js";
|
|
17
|
-
import type { AgentConfig, ChatMessage, RequestOptions, StreamOptions } from "./types.js";
|
|
17
|
+
import type { AgentConfig, ChatMessage, ProviderCallConfig, RequestOptions, StreamOptions } from "./types.js";
|
|
18
18
|
/** One candidate that failed, kept only to compose
|
|
19
19
|
* {@link AllProvidersExhaustedError}'s message. */
|
|
20
|
-
interface FailedAttempt {
|
|
20
|
+
export interface FailedAttempt {
|
|
21
21
|
readonly provider: string;
|
|
22
22
|
readonly error: string;
|
|
23
23
|
}
|
|
@@ -32,6 +32,16 @@ export declare class AllProvidersExhaustedError extends Error {
|
|
|
32
32
|
readonly attempts: readonly FailedAttempt[];
|
|
33
33
|
constructor(attempts: readonly FailedAttempt[]);
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Flatten the configured provider list into concrete, single-key attempts,
|
|
37
|
+
* in fallback order: each provider's own pooled keys are tried in the order
|
|
38
|
+
* they were added before moving to the next configured provider. Ollama
|
|
39
|
+
* contributes at most one candidate (it authenticates via `cfg.ollamaUrl`,
|
|
40
|
+
* not a key) and only when its own entry is present in the list — a
|
|
41
|
+
* provider with no usable credential is never offered as a candidate at
|
|
42
|
+
* all, the same rule the Python core's registry-building applies.
|
|
43
|
+
*/
|
|
44
|
+
export declare function candidatesOf(cfg: AgentConfig): ProviderCallConfig[];
|
|
35
45
|
/** Non-streaming completion, tried across every configured provider/key in
|
|
36
46
|
* order until one succeeds. `prompt` is wrapped as a single user turn; pass
|
|
37
47
|
* `messages` instead for an already-built multi-turn history.
|
|
@@ -61,4 +71,3 @@ export declare function streamComplete(cfg: AgentConfig, promptOrMessages: strin
|
|
|
61
71
|
* doesn't do, since its `messages` input is assumed already well-formed.
|
|
62
72
|
*/
|
|
63
73
|
export declare function streamChat(cfg: AgentConfig, uiMessages: readonly ChatMessage[], options: StreamOptions & BuildMessagesOptions): Promise<string>;
|
|
64
|
-
export {};
|
package/dist/agent.js
CHANGED
|
@@ -45,7 +45,7 @@ export class AllProvidersExhaustedError extends Error {
|
|
|
45
45
|
* provider with no usable credential is never offered as a candidate at
|
|
46
46
|
* all, the same rule the Python core's registry-building applies.
|
|
47
47
|
*/
|
|
48
|
-
function candidatesOf(cfg) {
|
|
48
|
+
export function candidatesOf(cfg) {
|
|
49
49
|
const candidates = [];
|
|
50
50
|
for (const cred of cfg.providers) {
|
|
51
51
|
if (cred.provider === "ollama") {
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAA6B,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAgBnG;;+DAE+D;AAC/D,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD;QACE,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,QAAQ,CAA2B;IAE5C,YAAY,QAAkC;QAC5C,KAAK,CAAC,uCAAuC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7G,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -19,4 +19,6 @@ export type { DispatcherFeatureFlags } from "./features.js";
|
|
|
19
19
|
export { buildMessages } from "./messages.js";
|
|
20
20
|
export type { BuildMessagesOptions } from "./messages.js";
|
|
21
21
|
export { isKnownProvider, modelOptionsFor, MODEL_OPTIONS, PROVIDERS } from "./registry.js";
|
|
22
|
-
export
|
|
22
|
+
export { DEFAULT_MAX_STEPS, runWithTools } from "./tools.js";
|
|
23
|
+
export type { RunWithToolsOptions, Tool, ToolRunResult, ToolRunStopReason } from "./tools.js";
|
|
24
|
+
export type { AgentConfig, ChatMessage, ChatRole, ExternalChatProviderId, ExternalChatProviderInfo, ProviderCredential, ProviderId, ProviderInfo, RequestOptions, StreamOptions, ToolCall, ToolChatMessage, ToolResult, ToolSpec, ToolTurn, } from "./types.js";
|
package/dist/index.js
CHANGED
|
@@ -15,4 +15,5 @@ export { DEFAULT_EXTERNAL_CHAT_FAVORITE_KEY, loadExternalChatFavorite, saveExter
|
|
|
15
15
|
export { DEFAULT_DISPATCHER_FEATURES, resolveDispatcherFeatures } from "./features.js";
|
|
16
16
|
export { buildMessages } from "./messages.js";
|
|
17
17
|
export { isKnownProvider, modelOptionsFor, MODEL_OPTIONS, PROVIDERS } from "./registry.js";
|
|
18
|
+
export { DEFAULT_MAX_STEPS, runWithTools } from "./tools.js";
|
|
18
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,0BAA0B,EAC1B,QAAQ,EACR,yBAAyB,EACzB,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EACL,kCAAkC,EAClC,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,0BAA0B,EAC1B,QAAQ,EACR,yBAAyB,EACzB,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EACL,kCAAkC,EAClC,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* supplies their own key on their own machine; there is no backend to hide
|
|
6
6
|
* it behind in the first place.
|
|
7
7
|
*/
|
|
8
|
-
import type { ChatMessage, ProviderCallConfig, RequestOptions } from "../types.js";
|
|
8
|
+
import type { ChatMessage, ProviderCallConfig, RequestOptions, ToolChatMessage, ToolSpec, ToolTurn } from "../types.js";
|
|
9
9
|
export declare function completeAnthropic(cfg: ProviderCallConfig, messages: readonly ChatMessage[], options?: RequestOptions): Promise<string>;
|
|
10
10
|
export declare function streamAnthropic(cfg: ProviderCallConfig, messages: readonly ChatMessage[], onChunk: (fullTextSoFar: string) => void, options?: RequestOptions): Promise<string>;
|
|
11
|
+
/** One non-streaming turn with tools available. */
|
|
12
|
+
export declare function completeWithToolsAnthropic(cfg: ProviderCallConfig, messages: readonly ToolChatMessage[], tools: readonly ToolSpec[], options?: RequestOptions): Promise<ToolTurn>;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* supplies their own key on their own machine; there is no backend to hide
|
|
6
6
|
* it behind in the first place.
|
|
7
7
|
*/
|
|
8
|
+
import { systemTurnOf } from "../toolMessages.js";
|
|
8
9
|
import { consumeLines, describeHttpError, fetchWithRetry } from "../http.js";
|
|
9
10
|
const DEFAULT_MAX_TOKENS = 1024;
|
|
10
11
|
const ANTHROPIC_URL = "https://api.anthropic.com/v1/messages";
|
|
@@ -61,4 +62,69 @@ export async function streamAnthropic(cfg, messages, onChunk, options = {}) {
|
|
|
61
62
|
});
|
|
62
63
|
return full;
|
|
63
64
|
}
|
|
65
|
+
function toToolApiMessages(messages) {
|
|
66
|
+
return messages
|
|
67
|
+
.filter((m) => m.role !== "system")
|
|
68
|
+
.map((m) => {
|
|
69
|
+
if (m.role === "tool") {
|
|
70
|
+
return {
|
|
71
|
+
role: "user",
|
|
72
|
+
content: m.results.map((r) => ({
|
|
73
|
+
type: "tool_result",
|
|
74
|
+
tool_use_id: r.callId,
|
|
75
|
+
content: r.content,
|
|
76
|
+
...(r.isError ? { is_error: true } : {}),
|
|
77
|
+
})),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if ("toolCalls" in m) {
|
|
81
|
+
return {
|
|
82
|
+
role: "assistant",
|
|
83
|
+
content: [
|
|
84
|
+
...(m.content ? [{ type: "text", text: m.content }] : []),
|
|
85
|
+
...m.toolCalls.map((c) => ({ type: "tool_use", id: c.id, name: c.name, input: c.arguments })),
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return { role: m.role, content: m.content };
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** One non-streaming turn with tools available. */
|
|
93
|
+
export async function completeWithToolsAnthropic(cfg, messages, tools, options = {}) {
|
|
94
|
+
const system = options.systemInstruction ?? systemTurnOf(messages);
|
|
95
|
+
const res = await fetchWithRetry(ANTHROPIC_URL, {
|
|
96
|
+
method: "POST",
|
|
97
|
+
headers: headers(cfg),
|
|
98
|
+
body: JSON.stringify({
|
|
99
|
+
model: cfg.model,
|
|
100
|
+
max_tokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
101
|
+
...(system ? { system } : {}),
|
|
102
|
+
messages: toToolApiMessages(messages),
|
|
103
|
+
...(tools.length
|
|
104
|
+
? { tools: tools.map((t) => ({ name: t.name, description: t.description, input_schema: t.parameters })) }
|
|
105
|
+
: {}),
|
|
106
|
+
}),
|
|
107
|
+
}, options.signal);
|
|
108
|
+
if (!res.ok)
|
|
109
|
+
throw new Error(await describeHttpError(res));
|
|
110
|
+
const data = await res.json();
|
|
111
|
+
const blocks = data.content ?? [];
|
|
112
|
+
if (data.stop_reason === "refusal")
|
|
113
|
+
throw new Error("Anthropic declined to answer");
|
|
114
|
+
if (data.stop_reason === "max_tokens" && blocks.some((b) => b.type === "tool_use")) {
|
|
115
|
+
// The tool input may be cut off: running it would act on partial arguments.
|
|
116
|
+
throw new Error("Anthropic ran out of tokens in the middle of a tool call");
|
|
117
|
+
}
|
|
118
|
+
if (blocks.length === 0)
|
|
119
|
+
throw new Error(`Anthropic returned an empty turn (${data.stop_reason ?? "no reason"})`);
|
|
120
|
+
return {
|
|
121
|
+
text: blocks
|
|
122
|
+
.filter((b) => b.type === "text")
|
|
123
|
+
.map((b) => b.text ?? "")
|
|
124
|
+
.join(""),
|
|
125
|
+
toolCalls: blocks
|
|
126
|
+
.filter((b) => b.type === "tool_use")
|
|
127
|
+
.map((b) => ({ id: b.id ?? "", name: b.name ?? "", arguments: b.input ?? {} })),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
64
130
|
//# sourceMappingURL=anthropic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
* (`x-goog-api-key`) rather than the `?key=` query string: a URL ends up in
|
|
4
4
|
* proxy/server access logs and browser history, a header does not.
|
|
5
5
|
*/
|
|
6
|
-
import type { ChatMessage, ProviderCallConfig, RequestOptions } from "../types.js";
|
|
6
|
+
import type { ChatMessage, ProviderCallConfig, RequestOptions, ToolChatMessage, ToolSpec, ToolTurn } from "../types.js";
|
|
7
7
|
export declare function completeGemini(cfg: ProviderCallConfig, messages: readonly ChatMessage[], options?: RequestOptions): Promise<string>;
|
|
8
8
|
export declare function streamGemini(cfg: ProviderCallConfig, messages: readonly ChatMessage[], onChunk: (fullTextSoFar: string) => void, options?: RequestOptions): Promise<string>;
|
|
9
|
+
/** Drop the JSON Schema keys Gemini's function declarations reject, at every depth. */
|
|
10
|
+
export declare function geminiSchema(schema: unknown): unknown;
|
|
11
|
+
/** One non-streaming turn with tools available. */
|
|
12
|
+
export declare function completeWithToolsGemini(cfg: ProviderCallConfig, messages: readonly ToolChatMessage[], tools: readonly ToolSpec[], options?: RequestOptions): Promise<ToolTurn>;
|
package/dist/providers/gemini.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* (`x-goog-api-key`) rather than the `?key=` query string: a URL ends up in
|
|
4
4
|
* proxy/server access logs and browser history, a header does not.
|
|
5
5
|
*/
|
|
6
|
+
import { systemTurnOf } from "../toolMessages.js";
|
|
6
7
|
import { consumeLines, describeHttpError, fetchWithRetry } from "../http.js";
|
|
7
8
|
const DEFAULT_MAX_TOKENS = 1024;
|
|
8
9
|
function toContents(messages) {
|
|
@@ -63,4 +64,97 @@ export async function streamGemini(cfg, messages, onChunk, options = {}) {
|
|
|
63
64
|
});
|
|
64
65
|
return full;
|
|
65
66
|
}
|
|
67
|
+
const SKIP_SIGNATURE = "skip_thought_signature_validator";
|
|
68
|
+
/** Finish reasons that still carry a usable turn. */
|
|
69
|
+
const GEMINI_NORMAL_FINISH = new Set(["STOP", "MAX_TOKENS", undefined]);
|
|
70
|
+
const GEMINI_UNSUPPORTED_SCHEMA_KEYS = new Set(["additionalProperties", "$schema"]);
|
|
71
|
+
/** Drop the JSON Schema keys Gemini's function declarations reject, at every depth. */
|
|
72
|
+
export function geminiSchema(schema) {
|
|
73
|
+
if (Array.isArray(schema))
|
|
74
|
+
return schema.map(geminiSchema);
|
|
75
|
+
if (typeof schema !== "object" || schema === null)
|
|
76
|
+
return schema;
|
|
77
|
+
return Object.fromEntries(Object.entries(schema)
|
|
78
|
+
.filter(([key]) => !GEMINI_UNSUPPORTED_SCHEMA_KEYS.has(key))
|
|
79
|
+
.map(([key, value]) => [key, geminiSchema(value)]));
|
|
80
|
+
}
|
|
81
|
+
function functionDeclaration(tool) {
|
|
82
|
+
const properties = tool.parameters["properties"];
|
|
83
|
+
const hasArguments = typeof properties === "object" && properties !== null && Object.keys(properties).length > 0;
|
|
84
|
+
// Gemini rejects an object schema with no properties: a no-argument tool omits it.
|
|
85
|
+
return {
|
|
86
|
+
name: tool.name,
|
|
87
|
+
description: tool.description,
|
|
88
|
+
...(hasArguments ? { parameters: geminiSchema(tool.parameters) } : {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function toToolContents(messages) {
|
|
92
|
+
return messages
|
|
93
|
+
.filter((m) => m.role !== "system")
|
|
94
|
+
.map((m) => {
|
|
95
|
+
if (m.role === "tool") {
|
|
96
|
+
return {
|
|
97
|
+
role: "user",
|
|
98
|
+
parts: m.results.map((r) => ({
|
|
99
|
+
functionResponse: { name: r.name, response: r.isError ? { error: r.content } : { result: r.content } },
|
|
100
|
+
})),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if ("toolCalls" in m) {
|
|
104
|
+
return {
|
|
105
|
+
role: "model",
|
|
106
|
+
parts: [
|
|
107
|
+
...(m.content ? [{ text: m.content }] : []),
|
|
108
|
+
...m.toolCalls.map((c) => ({
|
|
109
|
+
functionCall: { name: c.name, args: c.arguments },
|
|
110
|
+
// Thinking models reject calls without one; calls made by another
|
|
111
|
+
// provider (after a fallback) get Google's documented placeholder.
|
|
112
|
+
thoughtSignature: c.signature ?? SKIP_SIGNATURE,
|
|
113
|
+
})),
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return { role: m.role === "assistant" ? "model" : "user", parts: [{ text: m.content }] };
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/** One non-streaming turn with tools available. */
|
|
121
|
+
export async function completeWithToolsGemini(cfg, messages, tools, options = {}) {
|
|
122
|
+
const system = options.systemInstruction ?? systemTurnOf(messages);
|
|
123
|
+
const url = `https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(cfg.model)}:generateContent`;
|
|
124
|
+
const res = await fetchWithRetry(url, {
|
|
125
|
+
method: "POST",
|
|
126
|
+
headers: { "Content-Type": "application/json", "x-goog-api-key": cfg.apiKey },
|
|
127
|
+
body: JSON.stringify({
|
|
128
|
+
contents: toToolContents(messages),
|
|
129
|
+
generationConfig: { maxOutputTokens: options.maxTokens ?? DEFAULT_MAX_TOKENS },
|
|
130
|
+
...(system ? { systemInstruction: { parts: [{ text: system }] } } : {}),
|
|
131
|
+
...(tools.length ? { tools: [{ functionDeclarations: tools.map(functionDeclaration) }] } : {}),
|
|
132
|
+
}),
|
|
133
|
+
}, options.signal);
|
|
134
|
+
if (!res.ok)
|
|
135
|
+
throw new Error(await describeHttpError(res));
|
|
136
|
+
const data = await res.json();
|
|
137
|
+
const candidate = data.candidates?.[0];
|
|
138
|
+
if (!candidate)
|
|
139
|
+
throw new Error(`Gemini returned no answer (${data.promptFeedback?.blockReason ?? "no candidates"})`);
|
|
140
|
+
if (!GEMINI_NORMAL_FINISH.has(candidate.finishReason))
|
|
141
|
+
throw new Error(`Gemini stopped: ${candidate.finishReason}`);
|
|
142
|
+
const parts = candidate.content?.parts ?? [];
|
|
143
|
+
if (parts.length === 0)
|
|
144
|
+
throw new Error(`Gemini returned an empty turn (${candidate.finishReason ?? "no reason"})`);
|
|
145
|
+
if (candidate.finishReason === "MAX_TOKENS" && parts.some((p) => p.functionCall)) {
|
|
146
|
+
throw new Error("Gemini ran out of tokens in the middle of a tool call");
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
text: parts.map((p) => p.text ?? "").join(""),
|
|
150
|
+
toolCalls: parts
|
|
151
|
+
.filter((p) => p.functionCall)
|
|
152
|
+
.map((p) => ({
|
|
153
|
+
id: p.functionCall?.id ?? "", // often absent; the tool loop numbers it then
|
|
154
|
+
name: p.functionCall?.name ?? "",
|
|
155
|
+
arguments: p.functionCall?.args ?? {},
|
|
156
|
+
...(p.thoughtSignature ? { signature: p.thoughtSignature } : {}),
|
|
157
|
+
})),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
66
160
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* chat, so one code path covers both without the caller needing to know
|
|
6
6
|
* which Ollama endpoint that implies.
|
|
7
7
|
*/
|
|
8
|
-
import type { ChatMessage, ProviderCallConfig, RequestOptions } from "../types.js";
|
|
8
|
+
import type { ChatMessage, ProviderCallConfig, RequestOptions, ToolChatMessage, ToolSpec, ToolTurn } from "../types.js";
|
|
9
9
|
export declare function completeOllama(cfg: ProviderCallConfig, messages: readonly ChatMessage[], options?: RequestOptions): Promise<string>;
|
|
10
10
|
export declare function streamOllama(cfg: ProviderCallConfig, messages: readonly ChatMessage[], onChunk: (fullTextSoFar: string) => void, options?: RequestOptions): Promise<string>;
|
|
11
|
+
/** One non-streaming turn with tools available; needs a tool-capable local model. */
|
|
12
|
+
export declare function completeWithToolsOllama(cfg: ProviderCallConfig, messages: readonly ToolChatMessage[], tools: readonly ToolSpec[], options?: RequestOptions): Promise<ToolTurn>;
|
package/dist/providers/ollama.js
CHANGED
|
@@ -58,4 +58,57 @@ export async function streamOllama(cfg, messages, onChunk, options = {}) {
|
|
|
58
58
|
});
|
|
59
59
|
return full;
|
|
60
60
|
}
|
|
61
|
+
function toToolApiMessages(messages, systemInstruction) {
|
|
62
|
+
const hasSystemTurn = messages.some((m) => m.role === "system");
|
|
63
|
+
const system = !hasSystemTurn && systemInstruction ? [{ role: "system", content: systemInstruction }] : [];
|
|
64
|
+
return [
|
|
65
|
+
...system,
|
|
66
|
+
...messages.flatMap((m) => {
|
|
67
|
+
if (m.role === "tool")
|
|
68
|
+
return m.results.map((r) => ({ role: "tool", tool_name: r.name, content: r.content }));
|
|
69
|
+
if ("toolCalls" in m) {
|
|
70
|
+
return [
|
|
71
|
+
{
|
|
72
|
+
role: "assistant",
|
|
73
|
+
content: m.content,
|
|
74
|
+
tool_calls: m.toolCalls.map((c) => ({ function: { name: c.name, arguments: c.arguments } })),
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
return [{ role: m.role, content: m.content }];
|
|
79
|
+
}),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
/** One non-streaming turn with tools available; needs a tool-capable local model. */
|
|
83
|
+
export async function completeWithToolsOllama(cfg, messages, tools, options = {}) {
|
|
84
|
+
const baseUrl = validateOllamaUrl(cfg.ollamaUrl);
|
|
85
|
+
const res = await fetchWithRetry(`${baseUrl}/api/chat`, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: { "Content-Type": "application/json" },
|
|
88
|
+
body: JSON.stringify({
|
|
89
|
+
model: cfg.model,
|
|
90
|
+
messages: toToolApiMessages(messages, options.systemInstruction),
|
|
91
|
+
stream: false,
|
|
92
|
+
options: { num_predict: options.maxTokens ?? DEFAULT_MAX_TOKENS },
|
|
93
|
+
...(tools.length
|
|
94
|
+
? {
|
|
95
|
+
tools: tools.map((t) => ({
|
|
96
|
+
type: "function",
|
|
97
|
+
function: { name: t.name, description: t.description, parameters: t.parameters },
|
|
98
|
+
})),
|
|
99
|
+
}
|
|
100
|
+
: {}),
|
|
101
|
+
}),
|
|
102
|
+
}, options.signal);
|
|
103
|
+
if (!res.ok)
|
|
104
|
+
throw new Error(`Ollama error: HTTP ${res.status}. Is Ollama running?`);
|
|
105
|
+
const data = await res.json();
|
|
106
|
+
if (!data.message)
|
|
107
|
+
throw new Error("Ollama returned no answer");
|
|
108
|
+
const calls = data.message.tool_calls ?? [];
|
|
109
|
+
return {
|
|
110
|
+
text: data.message?.content ?? "",
|
|
111
|
+
toolCalls: calls.map((c) => ({ id: "", name: c.function?.name ?? "", arguments: c.function?.arguments ?? {} })),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
61
114
|
//# sourceMappingURL=ollama.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* base URL (matches how the Python core's GroqProvider relates to
|
|
5
5
|
* OpenAIProvider — same idea, browser side).
|
|
6
6
|
*/
|
|
7
|
-
import type { ChatMessage, ProviderCallConfig, RequestOptions } from "../types.js";
|
|
7
|
+
import type { ChatMessage, ProviderCallConfig, RequestOptions, ToolChatMessage, ToolSpec, ToolTurn } from "../types.js";
|
|
8
8
|
export declare function completeOpenAICompatible(provider: "openai" | "groq", cfg: ProviderCallConfig, messages: readonly ChatMessage[], options?: RequestOptions): Promise<string>;
|
|
9
9
|
export declare function streamOpenAICompatible(provider: "openai" | "groq", cfg: ProviderCallConfig, messages: readonly ChatMessage[], onChunk: (fullTextSoFar: string) => void, options?: RequestOptions): Promise<string>;
|
|
10
|
+
/** Parse the model's tool-call arguments: a JSON string that may be empty. */
|
|
11
|
+
export declare function parseArguments(raw: string | undefined, toolName: string): Record<string, unknown>;
|
|
12
|
+
/** One non-streaming turn with tools available (OpenAI or Groq). */
|
|
13
|
+
export declare function completeWithToolsOpenAICompatible(provider: "openai" | "groq", cfg: ProviderCallConfig, messages: readonly ToolChatMessage[], tools: readonly ToolSpec[], options?: RequestOptions): Promise<ToolTurn>;
|
|
@@ -61,4 +61,86 @@ export async function streamOpenAICompatible(provider, cfg, messages, onChunk, o
|
|
|
61
61
|
});
|
|
62
62
|
return full;
|
|
63
63
|
}
|
|
64
|
+
function toToolApiMessages(messages, systemInstruction) {
|
|
65
|
+
const hasSystemTurn = messages.some((m) => m.role === "system");
|
|
66
|
+
const system = !hasSystemTurn && systemInstruction ? [{ role: "system", content: systemInstruction }] : [];
|
|
67
|
+
return [
|
|
68
|
+
...system,
|
|
69
|
+
...messages.flatMap((m) => {
|
|
70
|
+
if (m.role === "tool") {
|
|
71
|
+
return m.results.map((r) => ({ role: "tool", tool_call_id: r.callId, content: r.content }));
|
|
72
|
+
}
|
|
73
|
+
if ("toolCalls" in m) {
|
|
74
|
+
return [
|
|
75
|
+
{
|
|
76
|
+
role: "assistant",
|
|
77
|
+
content: m.content || null,
|
|
78
|
+
tool_calls: m.toolCalls.map((c) => ({
|
|
79
|
+
id: c.id,
|
|
80
|
+
type: "function",
|
|
81
|
+
function: { name: c.name, arguments: JSON.stringify(c.arguments) },
|
|
82
|
+
})),
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
return [{ role: m.role, content: m.content }];
|
|
87
|
+
}),
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
/** Parse the model's tool-call arguments: a JSON string that may be empty. */
|
|
91
|
+
export function parseArguments(raw, toolName) {
|
|
92
|
+
if (!raw || !raw.trim())
|
|
93
|
+
return {};
|
|
94
|
+
let parsed;
|
|
95
|
+
try {
|
|
96
|
+
parsed = JSON.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
throw new Error(`Tool call ${toolName} sent arguments that are not valid JSON`);
|
|
100
|
+
}
|
|
101
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
102
|
+
throw new Error(`Tool call ${toolName} sent arguments that are not a JSON object`);
|
|
103
|
+
}
|
|
104
|
+
return parsed;
|
|
105
|
+
}
|
|
106
|
+
/** One non-streaming turn with tools available (OpenAI or Groq). */
|
|
107
|
+
export async function completeWithToolsOpenAICompatible(provider, cfg, messages, tools, options = {}) {
|
|
108
|
+
const res = await fetchWithRetry(BASE_URLS[provider], {
|
|
109
|
+
method: "POST",
|
|
110
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${cfg.apiKey}` },
|
|
111
|
+
body: JSON.stringify({
|
|
112
|
+
model: cfg.model,
|
|
113
|
+
max_tokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
114
|
+
messages: toToolApiMessages(messages, options.systemInstruction),
|
|
115
|
+
...(tools.length
|
|
116
|
+
? {
|
|
117
|
+
tools: tools.map((t) => ({
|
|
118
|
+
type: "function",
|
|
119
|
+
function: { name: t.name, description: t.description, parameters: t.parameters },
|
|
120
|
+
})),
|
|
121
|
+
}
|
|
122
|
+
: {}),
|
|
123
|
+
}),
|
|
124
|
+
}, options.signal);
|
|
125
|
+
if (!res.ok)
|
|
126
|
+
throw new Error(await describeHttpError(res));
|
|
127
|
+
const data = await res.json();
|
|
128
|
+
const choice = data.choices?.[0];
|
|
129
|
+
if (!choice?.message)
|
|
130
|
+
throw new Error(`${provider} returned no answer`);
|
|
131
|
+
if (choice.finish_reason === "content_filter")
|
|
132
|
+
throw new Error(`${provider} filtered the answer`);
|
|
133
|
+
const message = choice.message;
|
|
134
|
+
const calls = message.tool_calls ?? [];
|
|
135
|
+
if (choice.finish_reason === "length" && calls.length) {
|
|
136
|
+
throw new Error(`${provider} ran out of tokens in the middle of a tool call`);
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
text: message.content ?? "",
|
|
140
|
+
toolCalls: calls.map((c) => {
|
|
141
|
+
const name = c.function?.name ?? "";
|
|
142
|
+
return { id: c.id ?? "", name, arguments: parseArguments(c.function?.arguments, name) };
|
|
143
|
+
}),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
64
146
|
//# sourceMappingURL=openaiCompatible.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openaiCompatible.js","sourceRoot":"","sources":["../../src/providers/openaiCompatible.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"openaiCompatible.js","sourceRoot":"","sources":["../../src/providers/openaiCompatible.ts"],"names":[],"mappings":"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"}
|