@flue/sdk 0.3.6 → 0.3.8
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 +48 -7
- package/dist/client.d.mts +3 -3
- package/dist/client.mjs +32 -11
- package/dist/cloudflare/index.d.mts +2 -2
- package/dist/cloudflare/index.mjs +1 -1
- package/dist/{command-helpers-CXzopT_-.d.mts → command-helpers-5DpOaRIB.d.mts} +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -16
- package/dist/internal.d.mts +3 -3
- package/dist/internal.mjs +20 -4
- package/dist/{mcp-DTFRe9vh.mjs → mcp-B13ZPduG.mjs} +1 -1
- package/dist/{mcp-EZy-Vb5M.d.mts → mcp-CKMPhMDe.d.mts} +1 -1
- package/dist/node/index.d.mts +2 -2
- package/dist/sandbox.d.mts +1 -1
- package/dist/sandbox.mjs +1 -1
- package/dist/{session-BaaSQTWS.mjs → session-CNOAfV45.mjs} +8 -4
- package/dist/{types-CItTrBsU.d.mts → types-CKcp6T-y.d.mts} +55 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,11 +14,10 @@ Flue isn't another AI SDK. It's a proper runtime-agnostic framework — think As
|
|
|
14
14
|
|
|
15
15
|
## Packages
|
|
16
16
|
|
|
17
|
-
| Package
|
|
18
|
-
|
|
|
19
|
-
| [`@flue/sdk`](packages/sdk)
|
|
20
|
-
| [`@flue/cli`](packages/cli)
|
|
21
|
-
| [`@flue/connectors`](packages/connectors) | Third-party connectors for sandboxes, etc. |
|
|
17
|
+
| Package | Description |
|
|
18
|
+
| ----------------------------- | --------------------------------------- |
|
|
19
|
+
| [`@flue/sdk`](packages/sdk) | Core SDK: build system, sessions, tools |
|
|
20
|
+
| [`@flue/cli`](packages/cli) | CLI for building and running agents |
|
|
22
21
|
|
|
23
22
|
## Examples
|
|
24
23
|
|
|
@@ -146,17 +145,19 @@ export default async function ({ init, payload }: FlueContext) {
|
|
|
146
145
|
}
|
|
147
146
|
```
|
|
148
147
|
|
|
149
|
-
### Coding Agent (
|
|
148
|
+
### Coding Agent (Remote Sandbox)
|
|
150
149
|
|
|
151
150
|
The examples above all run on a lightweight virtual sandbox — no container needed. But for a full coding agent, you want a real Linux environment with git, Node.js, a browser, and a cloned repo ready to go.
|
|
152
151
|
|
|
153
152
|
Daytona's declarative image builder lets you define the environment in code. The image is cached after the first build, so subsequent sessions start instantly.
|
|
154
153
|
|
|
154
|
+
Install the Daytona connector with `flue add daytona | <your-agent>` (e.g. `claude`, `opencode`, `codex`, `cursor-agent`). It writes a small `connectors/daytona.ts` adapter into your project that you import directly.
|
|
155
|
+
|
|
155
156
|
```ts
|
|
156
157
|
// .flue/agents/code.ts
|
|
157
158
|
import { Type, type FlueContext, type ToolDef } from '@flue/sdk/client';
|
|
158
159
|
import { Daytona } from '@daytona/sdk';
|
|
159
|
-
import { daytona } from '
|
|
160
|
+
import { daytona } from '../connectors/daytona';
|
|
160
161
|
|
|
161
162
|
export const triggers = { webhook: true };
|
|
162
163
|
|
|
@@ -289,6 +290,34 @@ await session.prompt('Review the latest changes.'); // uses reviewer
|
|
|
289
290
|
await session.task('Research related issues.', { role: 'researcher' }); // uses researcher
|
|
290
291
|
```
|
|
291
292
|
|
|
293
|
+
### Provider Settings
|
|
294
|
+
|
|
295
|
+
Use `providers` when model traffic needs provider-specific runtime settings,
|
|
296
|
+
such as an enterprise API gateway, provider-compatible proxy, custom endpoint,
|
|
297
|
+
or gateway-specific credentials. This is common for managed credentials, audit
|
|
298
|
+
logging, traffic routing, or self-hosted OpenAI-compatible providers.
|
|
299
|
+
|
|
300
|
+
Configure these settings in `init()` instead of mutating global model state. They
|
|
301
|
+
are runtime-scoped to that agent and apply to every model it resolves, including
|
|
302
|
+
agent defaults, role-level models, per-call model selections, tasks, and context
|
|
303
|
+
compaction.
|
|
304
|
+
|
|
305
|
+
```ts
|
|
306
|
+
const agent = await init({
|
|
307
|
+
model: 'anthropic/claude-sonnet-4-6',
|
|
308
|
+
providers: {
|
|
309
|
+
anthropic: {
|
|
310
|
+
baseUrl: env.ANTHROPIC_BASE_URL,
|
|
311
|
+
headers: {
|
|
312
|
+
'X-Custom-Auth': env.GATEWAY_KEY,
|
|
313
|
+
},
|
|
314
|
+
// Use this when the proxy expects a synthetic or gateway-specific key.
|
|
315
|
+
apiKey: 'dummy',
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
```
|
|
320
|
+
|
|
292
321
|
### Custom Virtual Sandboxes
|
|
293
322
|
|
|
294
323
|
For most agents, use the built-in virtual sandbox or `sandbox: 'local'`. If you need to customize just-bash directly, pass a Bash factory. The factory must return a fresh Bash-like runtime each time; share the filesystem object in the closure to persist files across sessions and prompts.
|
|
@@ -305,6 +334,18 @@ const agent = await init({
|
|
|
305
334
|
const session = await agent.session();
|
|
306
335
|
```
|
|
307
336
|
|
|
337
|
+
## Connectors
|
|
338
|
+
|
|
339
|
+
Connectors adapt third-party services (sandbox providers, etc.) into Flue. They are not an npm package — they are markdown installation instructions hosted at `https://flueframework.com/cli/connectors/` and applied to your project by your AI coding agent.
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
flue add # list available connectors
|
|
343
|
+
flue add daytona | claude # pipe to your coding agent (claude, opencode, codex, cursor-agent, ...)
|
|
344
|
+
flue add https://e2b.dev --category sandbox | claude # build one from scratch — pass the provider's docs URL as the agent's starting point
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
The CLI fetches the markdown for the named connector and prints it to stdout when run by an agent (or with `--print`), or shows a short copyable `flue add ... | <agent>` recipe when run by a human in a terminal. Your agent reads the markdown and writes a small TypeScript adapter into `./.flue/connectors/<name>.ts` (or `./connectors/<name>.ts` for the root layout).
|
|
348
|
+
|
|
308
349
|
## Running Agents
|
|
309
350
|
|
|
310
351
|
### Local Development (`flue dev`)
|
package/dist/client.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
import { i as connectMcpServer, n as McpServerOptions, r as McpTransport, t as McpServerConnection } from "./mcp-
|
|
1
|
+
import { A as ShellResult, D as SessionOptions, E as SessionEnv, F as ToolParameters, M as SkillOptions, N as TaskOptions, O as SessionStore, P as ToolDef, S as ProvidersConfig, T as SessionData, _ as FlueSessions, a as BashLike, b as PromptResponse, d as FileStat, f as FlueAgent, g as FlueSession, h as FlueEventCallback, i as BashFactory, k as ShellOptions, l as Command, m as FlueEvent, p as FlueContext, r as AgentInit, t as AgentConfig, v as ModelConfig, w as SandboxFactory, x as ProviderSettings, y as PromptOptions } from "./types-CKcp6T-y.mjs";
|
|
2
|
+
import { i as connectMcpServer, n as McpServerOptions, r as McpTransport, t as McpServerConnection } from "./mcp-CKMPhMDe.mjs";
|
|
3
3
|
import { Type } from "@mariozechner/pi-ai";
|
|
4
4
|
|
|
5
5
|
//#region src/client.d.ts
|
|
@@ -23,4 +23,4 @@ interface FlueContextInternal extends FlueContext {
|
|
|
23
23
|
}
|
|
24
24
|
declare function createFlueContext(config: FlueContextConfig): FlueContextInternal;
|
|
25
25
|
//#endregion
|
|
26
|
-
export { type AgentInit, type BashFactory, type BashLike, type Command, type FileStat, type FlueAgent, type FlueContext, FlueContextConfig, FlueContextInternal, type FlueEvent, type FlueEventCallback, type FlueSession, type FlueSessions, type McpServerConnection, type McpServerOptions, type McpTransport, type PromptOptions, type PromptResponse, type SandboxFactory, type SessionData, type SessionEnv, type SessionOptions, type SessionStore, type ShellOptions, type ShellResult, type SkillOptions, type TaskOptions, type ToolDef, type ToolParameters, Type, connectMcpServer, createFlueContext };
|
|
26
|
+
export { type AgentInit, type BashFactory, type BashLike, type Command, type FileStat, type FlueAgent, type FlueContext, FlueContextConfig, FlueContextInternal, type FlueEvent, type FlueEventCallback, type FlueSession, type FlueSessions, type McpServerConnection, type McpServerOptions, type McpTransport, type ModelConfig, type PromptOptions, type PromptResponse, type ProviderSettings, type ProvidersConfig, type SandboxFactory, type SessionData, type SessionEnv, type SessionOptions, type SessionStore, type ShellOptions, type ShellResult, type SkillOptions, type TaskOptions, type ToolDef, type ToolParameters, Type, connectMcpServer, createFlueContext };
|
package/dist/client.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as discoverSessionContext } from "./agent-BTB0809P.mjs";
|
|
2
|
-
import { a as assertRoleExists } from "./session-
|
|
2
|
+
import { a as assertRoleExists } from "./session-CNOAfV45.mjs";
|
|
3
3
|
import { bashFactoryToSessionEnv, createCwdSessionEnv } from "./sandbox.mjs";
|
|
4
|
-
import { n as AgentClient, t as connectMcpServer } from "./mcp-
|
|
4
|
+
import { n as AgentClient, t as connectMcpServer } from "./mcp-B13ZPduG.mjs";
|
|
5
5
|
import { Type } from "@mariozechner/pi-ai";
|
|
6
6
|
|
|
7
7
|
//#region src/client.ts
|
|
@@ -19,24 +19,28 @@ function createFlueContext(config) {
|
|
|
19
19
|
return config.env;
|
|
20
20
|
},
|
|
21
21
|
async init(options) {
|
|
22
|
-
|
|
22
|
+
if (!options || !("model" in options)) throw new Error("[flue] init() requires a model. Pass { model: \"provider/model-id\" } or { model: false }.");
|
|
23
|
+
if (options.model !== false && typeof options.model !== "string") throw new Error("[flue] init({ model }) must be a model string or false.");
|
|
24
|
+
const id = options.id ?? config.id;
|
|
23
25
|
if (initializedAgentIds.has(id)) throw new Error(`[flue] init() has already been called for agent "${id}" in this request.`);
|
|
24
26
|
initializedAgentIds.add(id);
|
|
25
27
|
try {
|
|
26
|
-
assertRoleExists(config.agentConfig.roles, options
|
|
27
|
-
const sandbox = options
|
|
28
|
-
const baseEnv = await resolveSessionEnv(id, sandbox, config, options
|
|
29
|
-
const env = options
|
|
30
|
-
const store = options
|
|
28
|
+
assertRoleExists(config.agentConfig.roles, options.role);
|
|
29
|
+
const sandbox = options.sandbox;
|
|
30
|
+
const baseEnv = await resolveSessionEnv(id, sandbox, config, options.cwd);
|
|
31
|
+
const env = options.cwd ? createCwdSessionEnv(baseEnv, options.cwd) : baseEnv;
|
|
32
|
+
const store = options.persist ?? config.defaultStore;
|
|
31
33
|
const localContext = await discoverSessionContext(env);
|
|
32
|
-
const
|
|
34
|
+
const providers = mergeProvidersConfig(config.agentConfig.providers, options.providers);
|
|
35
|
+
const agentModel = config.agentConfig.resolveModel(options.model, providers);
|
|
33
36
|
return new AgentClient(id, {
|
|
34
37
|
...config.agentConfig,
|
|
35
38
|
systemPrompt: localContext.systemPrompt,
|
|
36
39
|
skills: localContext.skills,
|
|
37
40
|
model: agentModel,
|
|
38
|
-
role: options
|
|
39
|
-
|
|
41
|
+
role: options.role ?? config.agentConfig.role,
|
|
42
|
+
providers
|
|
43
|
+
}, env, store, currentEventCallback, options.commands, options.tools);
|
|
40
44
|
} catch (error) {
|
|
41
45
|
initializedAgentIds.delete(id);
|
|
42
46
|
throw error;
|
|
@@ -73,6 +77,23 @@ async function resolveSessionEnv(id, sandbox, config, cwd) {
|
|
|
73
77
|
});
|
|
74
78
|
throw new Error("[flue] Invalid sandbox option passed to init().");
|
|
75
79
|
}
|
|
80
|
+
function mergeProvidersConfig(base, settings) {
|
|
81
|
+
if (!base) return settings;
|
|
82
|
+
if (!settings) return base;
|
|
83
|
+
const merged = { ...base };
|
|
84
|
+
for (const [provider, config] of Object.entries(settings)) {
|
|
85
|
+
const previous = merged[provider];
|
|
86
|
+
merged[provider] = {
|
|
87
|
+
...previous,
|
|
88
|
+
...config,
|
|
89
|
+
headers: previous?.headers || config.headers ? {
|
|
90
|
+
...previous?.headers ?? {},
|
|
91
|
+
...config.headers ?? {}
|
|
92
|
+
} : void 0
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return merged;
|
|
96
|
+
}
|
|
76
97
|
|
|
77
98
|
//#endregion
|
|
78
99
|
export { Type, connectMcpServer, createFlueContext };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as CommandExecutor } from "../command-helpers-
|
|
1
|
+
import { E as SessionEnv, O as SessionStore, l as Command } from "../types-CKcp6T-y.mjs";
|
|
2
|
+
import { t as CommandExecutor } from "../command-helpers-5DpOaRIB.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/cloudflare/virtual-sandbox.d.ts
|
|
5
5
|
interface VirtualSandboxOptions {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "../agent-BTB0809P.mjs";
|
|
2
|
-
import "../session-
|
|
2
|
+
import "../session-CNOAfV45.mjs";
|
|
3
3
|
import { createSandboxSessionEnv } from "../sandbox.mjs";
|
|
4
4
|
import { t as normalizeExecutor } from "../command-helpers-hTZKWK13.mjs";
|
|
5
5
|
import { Workspace, WorkspaceFileSystem } from "@cloudflare/shell";
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as ShellResult, C as Role, D as SessionOptions, E as SessionEnv, F as ToolParameters, M as SkillOptions, N as TaskOptions, O as SessionStore, P as ToolDef, T as SessionData, _ as FlueSessions, a as BashLike, b as PromptResponse, c as BuildPlugin, d as FileStat, f as FlueAgent, g as FlueSession, h as FlueEventCallback, i as BashFactory, j as Skill, k as ShellOptions, l as Command, m as FlueEvent, n as AgentInfo, o as BuildContext, p as FlueContext, r as AgentInit, s as BuildOptions, t as AgentConfig, u as CommandDef, v as ModelConfig, w as SandboxFactory, y as PromptOptions } from "./types-CKcp6T-y.mjs";
|
|
2
2
|
import { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core";
|
|
3
3
|
|
|
4
4
|
//#region src/build.d.ts
|
|
@@ -113,4 +113,4 @@ interface CreateToolsOptions {
|
|
|
113
113
|
}
|
|
114
114
|
declare function createTools(env: SessionEnv, options?: CreateToolsOptions): AgentTool<any>[];
|
|
115
115
|
//#endregion
|
|
116
|
-
export { type AgentConfig, type AgentInfo, type AgentInit, BUILTIN_TOOL_NAMES, type BashFactory, type BashLike, type BuildContext, type BuildOptions, type BuildPlugin, type Command, type CommandDef, DEFAULT_DEV_PORT, type DevOptions, type FileStat, type FlueAgent, type FlueContext, type FlueEvent, type FlueEventCallback, type FlueSession, type FlueSessions, type PromptOptions, type PromptResponse, type Role, type SandboxFactory, type SessionData, type SessionEnv, type SessionOptions, type SessionStore, type ShellOptions, type ShellResult, type Skill, type SkillOptions, type TaskOptions, type ToolDef, type ToolParameters, build, createTools, dev, parseEnvFiles, resolveEnvFiles, resolveWorkspaceFromCwd };
|
|
116
|
+
export { type AgentConfig, type AgentInfo, type AgentInit, BUILTIN_TOOL_NAMES, type BashFactory, type BashLike, type BuildContext, type BuildOptions, type BuildPlugin, type Command, type CommandDef, DEFAULT_DEV_PORT, type DevOptions, type FileStat, type FlueAgent, type FlueContext, type FlueEvent, type FlueEventCallback, type FlueSession, type FlueSessions, type ModelConfig, type PromptOptions, type PromptResponse, type Role, type SandboxFactory, type SessionData, type SessionEnv, type SessionOptions, type SessionStore, type ShellOptions, type ShellResult, type Skill, type SkillOptions, type TaskOptions, type ToolDef, type ToolParameters, build, createTools, dev, parseEnvFiles, resolveEnvFiles, resolveWorkspaceFromCwd };
|
package/dist/index.mjs
CHANGED
|
@@ -439,13 +439,6 @@ const manifest = ${manifest};
|
|
|
439
439
|
// dispatcher (which would otherwise return text/plain "Invalid request").
|
|
440
440
|
const webhookAgentNames = new Set(${JSON.stringify(webhookAgents.map((a) => a.name))});
|
|
441
441
|
|
|
442
|
-
// ─── Infrastructure ─────────────────────────────────────────────────────────
|
|
443
|
-
|
|
444
|
-
// No build-time model default. The user sets model at runtime via
|
|
445
|
-
// \`init({ model: "provider/model-id" })\` for an agent default, or via
|
|
446
|
-
// \`{ model: "provider/model-id" }\` on any individual prompt/skill/task call.
|
|
447
|
-
const model = undefined;
|
|
448
|
-
|
|
449
442
|
// ─── Sandbox Environments ───────────────────────────────────────────────────
|
|
450
443
|
|
|
451
444
|
/**
|
|
@@ -549,7 +542,7 @@ function createContextForRequest(id, payload, doInstance) {
|
|
|
549
542
|
payload,
|
|
550
543
|
env: doInstance?.env ?? {},
|
|
551
544
|
agentConfig: {
|
|
552
|
-
systemPrompt, skills, roles, model, resolveModel,
|
|
545
|
+
systemPrompt, skills, roles, model: undefined, resolveModel,
|
|
553
546
|
},
|
|
554
547
|
createDefaultEnv,
|
|
555
548
|
createLocalEnv,
|
|
@@ -909,13 +902,6 @@ const manifest = ${JSON.stringify({ agents: agents.map((a) => ({
|
|
|
909
902
|
triggers: a.triggers
|
|
910
903
|
})) }, null, 2)};
|
|
911
904
|
|
|
912
|
-
// ─── Infrastructure ─────────────────────────────────────────────────────────
|
|
913
|
-
|
|
914
|
-
// No build-time model default. The user sets model at runtime via
|
|
915
|
-
// \`init({ model: "provider/model-id" })\` for an agent default, or via
|
|
916
|
-
// \`{ model: "provider/model-id" }\` on any individual prompt/skill/task call.
|
|
917
|
-
const model = undefined;
|
|
918
|
-
|
|
919
905
|
// ─── Sandbox Environments ───────────────────────────────────────────────────
|
|
920
906
|
|
|
921
907
|
/**
|
|
@@ -955,7 +941,7 @@ function createContextForRequest(id, payload) {
|
|
|
955
941
|
payload,
|
|
956
942
|
env: process.env,
|
|
957
943
|
agentConfig: {
|
|
958
|
-
systemPrompt, skills, roles, model, resolveModel,
|
|
944
|
+
systemPrompt, skills, roles, model: undefined, resolveModel,
|
|
959
945
|
},
|
|
960
946
|
createDefaultEnv,
|
|
961
947
|
createLocalEnv,
|
package/dist/internal.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as
|
|
2
|
-
import "./mcp-
|
|
1
|
+
import { O as SessionStore, S as ProvidersConfig, T as SessionData, v as ModelConfig } from "./types-CKcp6T-y.mjs";
|
|
2
|
+
import "./mcp-CKMPhMDe.mjs";
|
|
3
3
|
import { FlueContextConfig, FlueContextInternal, createFlueContext } from "./client.mjs";
|
|
4
4
|
import { bashFactoryToSessionEnv } from "./sandbox.mjs";
|
|
5
5
|
import { getModel } from "@mariozechner/pi-ai";
|
|
@@ -285,6 +285,6 @@ declare function validateAgentRequest(opts: ValidateAgentRequestOptions): void;
|
|
|
285
285
|
* transitive deps. Centralizing the resolver here keeps `_entry.ts`
|
|
286
286
|
* dependency-free apart from `@flue/sdk/*`.
|
|
287
287
|
*/
|
|
288
|
-
declare function resolveModel(
|
|
288
|
+
declare function resolveModel(model: ModelConfig | undefined, providers?: ProvidersConfig): ReturnType<typeof getModel> | undefined;
|
|
289
289
|
//#endregion
|
|
290
290
|
export { AgentNotFoundError, type FlueContextConfig, type FlueContextInternal, InMemorySessionStore, InvalidRequestError, MethodNotAllowedError, RouteNotFoundError, bashFactoryToSessionEnv, createFlueContext, parseJsonBody, resolveModel, toHttpResponse, toSseData, validateAgentRequest };
|
package/dist/internal.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./agent-BTB0809P.mjs";
|
|
2
|
-
import { t as InMemorySessionStore } from "./session-
|
|
2
|
+
import { t as InMemorySessionStore } from "./session-CNOAfV45.mjs";
|
|
3
3
|
import { bashFactoryToSessionEnv } from "./sandbox.mjs";
|
|
4
|
-
import "./mcp-
|
|
4
|
+
import "./mcp-B13ZPduG.mjs";
|
|
5
5
|
import { createFlueContext } from "./client.mjs";
|
|
6
6
|
import { getModel } from "@mariozechner/pi-ai";
|
|
7
7
|
|
|
@@ -441,14 +441,30 @@ function validateAgentRequest(opts) {
|
|
|
441
441
|
* transitive deps. Centralizing the resolver here keeps `_entry.ts`
|
|
442
442
|
* dependency-free apart from `@flue/sdk/*`.
|
|
443
443
|
*/
|
|
444
|
-
function resolveModel(
|
|
444
|
+
function resolveModel(model, providers) {
|
|
445
|
+
if (model === false || model === void 0) return void 0;
|
|
446
|
+
const modelString = model;
|
|
445
447
|
const slash = modelString.indexOf("/");
|
|
446
448
|
if (slash === -1) throw new Error(`[flue] Invalid model "${modelString}". Use the "provider/model-id" format (e.g. "anthropic/claude-haiku-4-5").`);
|
|
447
449
|
const provider = modelString.slice(0, slash);
|
|
448
450
|
const modelId = modelString.slice(slash + 1);
|
|
449
451
|
const resolved = getModel(provider, modelId);
|
|
450
452
|
if (!resolved) throw new Error(`[flue] Unknown model "${modelString}". Provider "${provider}" / model id "${modelId}" is not registered with @mariozechner/pi-ai.`);
|
|
451
|
-
return resolved;
|
|
453
|
+
return applyProviderSettings(resolved, providers?.[provider]);
|
|
454
|
+
}
|
|
455
|
+
function applyProviderSettings(model, providerSettings) {
|
|
456
|
+
if (!providerSettings) return model;
|
|
457
|
+
const hasBaseUrl = providerSettings.baseUrl !== void 0;
|
|
458
|
+
const hasHeaders = providerSettings.headers !== void 0;
|
|
459
|
+
if (!hasBaseUrl && !hasHeaders) return model;
|
|
460
|
+
return {
|
|
461
|
+
...model,
|
|
462
|
+
baseUrl: providerSettings.baseUrl ?? model.baseUrl,
|
|
463
|
+
headers: hasHeaders ? {
|
|
464
|
+
...model.headers ?? {},
|
|
465
|
+
...providerSettings.headers
|
|
466
|
+
} : model.headers
|
|
467
|
+
};
|
|
452
468
|
}
|
|
453
469
|
|
|
454
470
|
//#endregion
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as discoverSessionContext } from "./agent-BTB0809P.mjs";
|
|
2
|
-
import { a as assertRoleExists, n as Session, o as createScopedEnv, r as deleteSessionTree, s as mergeCommands } from "./session-
|
|
2
|
+
import { a as assertRoleExists, n as Session, o as createScopedEnv, r as deleteSessionTree, s as mergeCommands } from "./session-CNOAfV45.mjs";
|
|
3
3
|
import { createCwdSessionEnv } from "./sandbox.mjs";
|
|
4
4
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
5
5
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
package/dist/node/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { l as Command } from "../types-
|
|
2
|
-
import { t as CommandExecutor } from "../command-helpers-
|
|
1
|
+
import { l as Command } from "../types-CKcp6T-y.mjs";
|
|
2
|
+
import { t as CommandExecutor } from "../command-helpers-5DpOaRIB.mjs";
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
4
|
|
|
5
5
|
//#region src/node/define-command.d.ts
|
package/dist/sandbox.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as ShellResult, E as SessionEnv, d as FileStat, i as BashFactory, u as CommandDef, w as SandboxFactory } from "./types-CKcp6T-y.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/sandbox.d.ts
|
|
4
4
|
declare function createCwdSessionEnv(parentEnv: SessionEnv, cwd: string): SessionEnv;
|
package/dist/sandbox.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./agent-BTB0809P.mjs";
|
|
2
|
-
import { i as normalizePath, o as createScopedEnv } from "./session-
|
|
2
|
+
import { i as normalizePath, o as createScopedEnv } from "./session-CNOAfV45.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/sandbox.ts
|
|
5
5
|
function createCwdSessionEnv(parentEnv, cwd) {
|
|
@@ -740,6 +740,7 @@ var Session = class {
|
|
|
740
740
|
tools,
|
|
741
741
|
messages: previousMessages
|
|
742
742
|
},
|
|
743
|
+
getApiKey: (provider) => this.getProviderApiKey(provider),
|
|
743
744
|
toolExecution: "parallel"
|
|
744
745
|
});
|
|
745
746
|
this.eventCallback = options.onAgentEvent;
|
|
@@ -891,8 +892,8 @@ var Session = class {
|
|
|
891
892
|
resolveModelForCall(promptModel, roleName, callSite) {
|
|
892
893
|
let model = this.config.model;
|
|
893
894
|
const roleModel = resolveRoleModel(this.config.roles, roleName);
|
|
894
|
-
if (roleModel
|
|
895
|
-
if (promptModel
|
|
895
|
+
if (roleModel) model = this.config.resolveModel(roleModel, this.config.providers);
|
|
896
|
+
if (promptModel) model = this.config.resolveModel(promptModel, this.config.providers);
|
|
896
897
|
return this.requireModel(model, callSite);
|
|
897
898
|
}
|
|
898
899
|
/**
|
|
@@ -902,7 +903,10 @@ var Session = class {
|
|
|
902
903
|
*/
|
|
903
904
|
requireModel(model, callSite) {
|
|
904
905
|
if (model) return model;
|
|
905
|
-
throw new Error(`[flue] No model configured for ${callSite}. Pass \`{ model: "provider/model-id" }\` to
|
|
906
|
+
throw new Error(`[flue] No model configured for ${callSite}. Pass \`{ model: "provider/model-id" }\` to this call or configure a role model.`);
|
|
907
|
+
}
|
|
908
|
+
getProviderApiKey(provider) {
|
|
909
|
+
return this.config.providers?.[provider]?.apiKey;
|
|
906
910
|
}
|
|
907
911
|
buildSystemPrompt(roleName) {
|
|
908
912
|
const parts = [this.config.systemPrompt];
|
|
@@ -1193,7 +1197,7 @@ var Session = class {
|
|
|
1193
1197
|
reason,
|
|
1194
1198
|
estimatedTokens
|
|
1195
1199
|
});
|
|
1196
|
-
const result = await compact(preparation, model,
|
|
1200
|
+
const result = await compact(preparation, model, this.getProviderApiKey(model.provider), this.compactionAbortController.signal);
|
|
1197
1201
|
if (this.compactionAbortController.signal.aborted) return;
|
|
1198
1202
|
this.history.appendCompaction({
|
|
1199
1203
|
summary: result.summary,
|
|
@@ -102,6 +102,25 @@ interface CompactionConfig {
|
|
|
102
102
|
/** Recent tokens to preserve (not summarized). Default: 20000 */
|
|
103
103
|
keepRecentTokens?: number;
|
|
104
104
|
}
|
|
105
|
+
interface ProviderSettings {
|
|
106
|
+
/**
|
|
107
|
+
* Provider endpoint used by built-in models. Useful for API gateways,
|
|
108
|
+
* LiteLLM-style proxies, or enterprise-managed provider endpoints.
|
|
109
|
+
*/
|
|
110
|
+
baseUrl?: string;
|
|
111
|
+
/**
|
|
112
|
+
* Headers merged into the resolved model's provider-level headers. Values
|
|
113
|
+
* here override headers already defined by the built-in model.
|
|
114
|
+
*/
|
|
115
|
+
headers?: Record<string, string>;
|
|
116
|
+
/**
|
|
117
|
+
* API key returned to the underlying agent runtime for this provider.
|
|
118
|
+
* Useful when the gateway requires a dummy key or when credentials should
|
|
119
|
+
* come from the agent's runtime env instead of process-global env vars.
|
|
120
|
+
*/
|
|
121
|
+
apiKey?: string;
|
|
122
|
+
}
|
|
123
|
+
type ProvidersConfig = Record<string, ProviderSettings>;
|
|
105
124
|
interface AgentConfig {
|
|
106
125
|
/** Discovered at runtime from AGENTS.md + .agents/skills/ in the session's cwd. */
|
|
107
126
|
systemPrompt: string;
|
|
@@ -109,17 +128,20 @@ interface AgentConfig {
|
|
|
109
128
|
skills: Record<string, Skill>;
|
|
110
129
|
roles: Record<string, Role>;
|
|
111
130
|
/**
|
|
112
|
-
* Agent-wide default model. Undefined
|
|
113
|
-
* `init({ model:
|
|
114
|
-
*
|
|
131
|
+
* Agent-wide default model. Undefined when the user explicitly passes
|
|
132
|
+
* `init({ model: false })`, so each model-using call must resolve one from a
|
|
133
|
+
* role or call-site override.
|
|
115
134
|
*/
|
|
116
135
|
model: Model<any> | undefined;
|
|
117
136
|
/** Agent-wide default role. Per-session and per-call roles override this. */
|
|
118
137
|
role?: string;
|
|
119
|
-
/**
|
|
120
|
-
|
|
138
|
+
/** Provider runtime settings applied when resolving models. */
|
|
139
|
+
providers?: ProvidersConfig;
|
|
140
|
+
/** Resolve model config to a Model instance. Throws on invalid model strings. */
|
|
141
|
+
resolveModel: (model: ModelConfig | undefined, providers?: ProvidersConfig) => Model<any> | undefined;
|
|
121
142
|
compaction?: CompactionConfig;
|
|
122
143
|
}
|
|
144
|
+
type ModelConfig = string | false;
|
|
123
145
|
/**
|
|
124
146
|
* Request context passed to agent handler functions. Pass type parameters
|
|
125
147
|
* to type `payload` and `env` (e.g. the `Env` interface generated by
|
|
@@ -131,9 +153,9 @@ interface FlueContext<TPayload = any, TEnv = Record<string, any>> {
|
|
|
131
153
|
/** Platform env bindings (process.env on Node, Worker env on Cloudflare). */
|
|
132
154
|
readonly env: TEnv;
|
|
133
155
|
/** Initialize an agent runtime with sandbox + persistence. */
|
|
134
|
-
init(options
|
|
156
|
+
init(options: AgentInit): Promise<FlueAgent>;
|
|
135
157
|
}
|
|
136
|
-
/**
|
|
158
|
+
/** Agent runtime options. A default model is required unless explicitly disabled with `model: false`. */
|
|
137
159
|
interface AgentInit {
|
|
138
160
|
/** Agent/sandbox scope id. Defaults to the route/context id. */
|
|
139
161
|
id?: string;
|
|
@@ -149,16 +171,37 @@ interface AgentInit {
|
|
|
149
171
|
/** Defaults to platform store (in-memory on Node, DO SQLite on Cloudflare). */
|
|
150
172
|
persist?: SessionStore;
|
|
151
173
|
/**
|
|
152
|
-
*
|
|
153
|
-
* calls unless overridden at the call site.
|
|
174
|
+
* Default model for this agent. Applies to all prompt(), skill(), and task()
|
|
175
|
+
* calls unless overridden by a role or at the call site. Pass `false` to require every
|
|
176
|
+
* model-using call to resolve a model from a role or call-site override.
|
|
154
177
|
*
|
|
155
178
|
* Format: `'provider/modelId'` (e.g. `'anthropic/claude-opus-4-20250514'`).
|
|
156
179
|
*
|
|
157
|
-
* Precedence (highest wins): per-call `model` > role `model` > agent `model
|
|
180
|
+
* Precedence (highest wins): per-call `model` > role `model` > agent `model`.
|
|
158
181
|
*/
|
|
159
|
-
model
|
|
182
|
+
model: ModelConfig;
|
|
160
183
|
/** Agent-wide default role. Overridden by session-level or per-call roles. */
|
|
161
184
|
role?: string;
|
|
185
|
+
/**
|
|
186
|
+
* Provider runtime settings for every model used by this agent, including
|
|
187
|
+
* role-level and per-call model selections.
|
|
188
|
+
*
|
|
189
|
+
* Example:
|
|
190
|
+
*
|
|
191
|
+
* ```ts
|
|
192
|
+
* await init({
|
|
193
|
+
* model: 'anthropic/claude-sonnet-4-6',
|
|
194
|
+
* providers: {
|
|
195
|
+
* anthropic: {
|
|
196
|
+
* baseUrl: env.ANTHROPIC_BASE_URL,
|
|
197
|
+
* headers: { 'X-Custom-Auth': env.GATEWAY_KEY },
|
|
198
|
+
* apiKey: 'dummy',
|
|
199
|
+
* },
|
|
200
|
+
* },
|
|
201
|
+
* });
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
providers?: ProvidersConfig;
|
|
162
205
|
/**
|
|
163
206
|
* Agent-wide tools. Every prompt(), skill(), and task() call can use these.
|
|
164
207
|
* Per-call tools are added on top and must not reuse the same names.
|
|
@@ -463,4 +506,4 @@ interface BuildOptions {
|
|
|
463
506
|
plugin?: BuildPlugin;
|
|
464
507
|
}
|
|
465
508
|
//#endregion
|
|
466
|
-
export {
|
|
509
|
+
export { ShellResult as A, Role as C, SessionOptions as D, SessionEnv as E, ToolParameters as F, SkillOptions as M, TaskOptions as N, SessionStore as O, ToolDef as P, ProvidersConfig as S, SessionData as T, FlueSessions as _, BashLike as a, PromptResponse as b, BuildPlugin as c, FileStat as d, FlueAgent as f, FlueSession as g, FlueEventCallback as h, BashFactory as i, Skill as j, ShellOptions as k, Command as l, FlueEvent as m, AgentInfo as n, BuildContext as o, FlueContext as p, AgentInit as r, BuildOptions as s, AgentConfig as t, CommandDef as u, ModelConfig as v, SandboxFactory as w, ProviderSettings as x, PromptOptions as y };
|