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 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, and chat-history normalisation. It deliberately does
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":"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"}
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,MAAM,UAAU,YAAY,CAAC,GAAgB;IAC3C,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACjG,SAAS;QACX,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAChH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,UAAU,CAAC,gBAAiD;IACnE,OAAO,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACjH,CAAC;AAED,SAAS,WAAW,CAClB,SAA6B,EAC7B,QAAgC,EAChC,OAAuB;IAEvB,QAAQ,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtD,KAAK,WAAW;YACd,OAAO,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtD,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO,wBAAwB,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAgB,EAChB,gBAAiD,EACjD,UAA0B,EAAE;IAE5B,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,MAAM,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,MAAM,IAAI,0BAA0B,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,SAAS,CAChB,SAA6B,EAC7B,QAAgC,EAChC,OAAwC,EACxC,OAAuB;IAEvB,QAAQ,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,KAAK,WAAW;YACd,OAAO,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAChE,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO,sBAAsB,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAgB,EAChB,gBAAiD,EACjD,OAAsB;IAEtB,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAErC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CACpB,SAAS,EACT,QAAQ,EACR,CAAC,IAAI,EAAE,EAAE;gBACP,gBAAgB,GAAG,IAAI,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,gBAAgB;gBAAE,MAAM,GAAG,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,MAAM,IAAI,0BAA0B,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAgB,EAChB,UAAkC,EAClC,OAA6C;IAE7C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC"}
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 type { AgentConfig, ChatMessage, ChatRole, ExternalChatProviderId, ExternalChatProviderInfo, ProviderCredential, ProviderId, ProviderInfo, RequestOptions, StreamOptions, } from "./types.js";
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;AAG7E,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,aAAa,GAAG,uCAAuC,CAAC;AAE9D,SAAS,aAAa,CAAC,QAAgC;IACrD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgC,EAAE,QAAiB;IACnE,OAAO,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB,EAAE,QAAgC,EAAE,OAAuB,EAAE,MAAe;IACpH,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7D,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;QACnD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,GAAuB;IACtC,OAAO;QACL,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,GAAG,CAAC,MAAM;QACvB,mBAAmB,EAAE,YAAY;QACjC,2CAA2C,EAAE,MAAM;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAuB,EACvB,QAAgC,EAChC,UAA0B,EAAE;IAE5B,MAAM,GAAG,GAAG,MAAM,cAAc,CAC9B,aAAa,EACb,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,EACzG,OAAO,CAAC,MAAM,CACf,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAuB,EACvB,QAAgC,EAChC,OAAwC,EACxC,UAA0B,EAAE;IAE5B,MAAM,GAAG,GAAG,MAAM,cAAc,CAC9B,aAAa,EACb,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,EACxG,OAAO,CAAC,MAAM,CACf,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3D,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC/E,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,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>;
@@ -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":"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"}
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>;
@@ -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":"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"}
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":"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"}
1
+ {"version":3,"file":"openaiCompatible.js","sourceRoot":"","sources":["../../src/providers/openaiCompatible.ts"],"names":[],"mappings":"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"}