@base44-preview/sdk 0.8.32-pr.206.d8fc10d → 0.8.34-pr.205.d800012

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/dist/client.d.ts CHANGED
@@ -12,12 +12,12 @@ export type { Base44Client, CreateClientConfig, CreateClientOptions };
12
12
  * The client supports three authentication modes:
13
13
  * - **Anonymous**: Access modules without authentication using `base44.moduleName`. Operations are scoped to public data and permissions.
14
14
  * - **User authentication**: Access modules with user-level permissions using `base44.moduleName`. Operations are scoped to the authenticated user's data and permissions. Use `base44.auth.loginViaEmailPassword()` or other auth methods to get a token.
15
- * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations bypass entity access rules and field-level security, giving full read and write access to all of the app's data. Only available in Base44-hosted backend functions. Create a client with service role authentication using {@linkcode createClientFromRequest | createClientFromRequest()}.
15
+ * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations can access any data available to the app's admin. Only available in Base44-hosted backend functions. Create a client with service role authentication using {@linkcode createClientFromRequest | createClientFromRequest()}.
16
16
  *
17
17
  * For example, when using the {@linkcode EntitiesModule | entities} module:
18
18
  * - **Anonymous**: Can only read public data.
19
19
  * - **User authentication**: Can access the current user's data.
20
- * - **Service role authentication**: Can read and write any record, bypassing access rules.
20
+ * - **Service role authentication**: Can access all data that admins can access.
21
21
  *
22
22
  * Most modules are available in all three modes, but with different permission levels. However, some modules are only available in specific authentication modes.
23
23
  *
@@ -43,7 +43,7 @@ export declare function createClient(config: CreateClientConfig): Base44Client;
43
43
  *
44
44
  * This function is designed for use in Base44-hosted backend functions. For frontends and external backends, use {@linkcode createClient | createClient()} instead.
45
45
  *
46
- * When used in a Base44-hosted backend function, `createClientFromRequest()` automatically extracts authentication tokens from the request headers that Base44 injects when forwarding requests. The returned client includes service role access using `base44.asServiceRole`, which bypasses entity access rules and field-level security.
46
+ * When used in a Base44-hosted backend function, `createClientFromRequest()` automatically extracts authentication tokens from the request headers that Base44 injects when forwarding requests. The returned client includes service role access using `base44.asServiceRole`, which provides admin-level permissions.
47
47
  *
48
48
  * To learn more about the Base44 client, see {@linkcode createClient | createClient()}.
49
49
  *
@@ -82,7 +82,7 @@ export declare function createClient(config: CreateClientConfig): Base44Client;
82
82
  * try {
83
83
  * const base44 = createClientFromRequest(req);
84
84
  *
85
- * // Read across all users, bypassing the Orders entity's access rules
85
+ * // Access admin data with service role permissions
86
86
  * const recentOrders = await base44.asServiceRole.entities.Orders.list('-created_at', 50);
87
87
  *
88
88
  * return Response.json({ orders: recentOrders });
package/dist/client.js CHANGED
@@ -6,7 +6,7 @@ import { createSsoModule } from "./modules/sso.js";
6
6
  import { createConnectorsModule, createUserConnectorsModule, } from "./modules/connectors.js";
7
7
  import { getAccessToken } from "./utils/auth-utils.js";
8
8
  import { createFunctionsModule } from "./modules/functions.js";
9
- import { createAgentsModule } from "./modules/agents.js";
9
+ import { createAgentsModule } from "./modules/agents/index.js";
10
10
  import { createAppLogsModule } from "./modules/app-logs.js";
11
11
  import { createUsersModule } from "./modules/users.js";
12
12
  import { RoomsSocket } from "./utils/socket-utils.js";
@@ -23,12 +23,12 @@ import { createAnalyticsModule } from "./modules/analytics.js";
23
23
  * The client supports three authentication modes:
24
24
  * - **Anonymous**: Access modules without authentication using `base44.moduleName`. Operations are scoped to public data and permissions.
25
25
  * - **User authentication**: Access modules with user-level permissions using `base44.moduleName`. Operations are scoped to the authenticated user's data and permissions. Use `base44.auth.loginViaEmailPassword()` or other auth methods to get a token.
26
- * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations bypass entity access rules and field-level security, giving full read and write access to all of the app's data. Only available in Base44-hosted backend functions. Create a client with service role authentication using {@linkcode createClientFromRequest | createClientFromRequest()}.
26
+ * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations can access any data available to the app's admin. Only available in Base44-hosted backend functions. Create a client with service role authentication using {@linkcode createClientFromRequest | createClientFromRequest()}.
27
27
  *
28
28
  * For example, when using the {@linkcode EntitiesModule | entities} module:
29
29
  * - **Anonymous**: Can only read public data.
30
30
  * - **User authentication**: Can access the current user's data.
31
- * - **Service role authentication**: Can read and write any record, bypassing access rules.
31
+ * - **Service role authentication**: Can access all data that admins can access.
32
32
  *
33
33
  * Most modules are available in all three modes, but with different permission levels. However, some modules are only available in specific authentication modes.
34
34
  *
@@ -149,6 +149,7 @@ export function createClient(config) {
149
149
  appId,
150
150
  serverUrl,
151
151
  token,
152
+ getToken: () => token || getAccessToken() || undefined,
152
153
  }),
153
154
  appLogs: createAppLogsModule(axiosClient, appId),
154
155
  users: createUsersModule(axiosClient, appId),
@@ -191,6 +192,7 @@ export function createClient(config) {
191
192
  appId,
192
193
  serverUrl,
193
194
  token,
195
+ getToken: () => serviceToken,
194
196
  }),
195
197
  appLogs: createAppLogsModule(serviceRoleAxiosClient, appId),
196
198
  cleanup: () => {
@@ -257,7 +259,7 @@ export function createClient(config) {
257
259
  /**
258
260
  * Provides access to service role modules.
259
261
  *
260
- * Service role authentication provides elevated permissions for backend operations. Unlike user authentication, which is scoped to a specific user's permissions, service role authentication bypasses entity access rules and field-level security entirely, giving full read and write access to all of the app's data.
262
+ * Service role authentication provides elevated permissions for backend operations. Unlike user authentication, which is scoped to a specific user's permissions, service role authentication has access to the data and operations available to the app's admin.
261
263
  *
262
264
  * @throws {Error} When accessed without providing a serviceToken during client creation.
263
265
  *
@@ -268,7 +270,7 @@ export function createClient(config) {
268
270
  * serviceToken: 'service-role-token'
269
271
  * });
270
272
  *
271
- * // Read every user record, bypassing the User entity's access rules
273
+ * // Also access a module with elevated permissions
272
274
  * const allUsers = await base44.asServiceRole.entities.User.list();
273
275
  * ```
274
276
  */
@@ -286,7 +288,7 @@ export function createClient(config) {
286
288
  *
287
289
  * This function is designed for use in Base44-hosted backend functions. For frontends and external backends, use {@linkcode createClient | createClient()} instead.
288
290
  *
289
- * When used in a Base44-hosted backend function, `createClientFromRequest()` automatically extracts authentication tokens from the request headers that Base44 injects when forwarding requests. The returned client includes service role access using `base44.asServiceRole`, which bypasses entity access rules and field-level security.
291
+ * When used in a Base44-hosted backend function, `createClientFromRequest()` automatically extracts authentication tokens from the request headers that Base44 injects when forwarding requests. The returned client includes service role access using `base44.asServiceRole`, which provides admin-level permissions.
290
292
  *
291
293
  * To learn more about the Base44 client, see {@linkcode createClient | createClient()}.
292
294
  *
@@ -325,7 +327,7 @@ export function createClient(config) {
325
327
  * try {
326
328
  * const base44 = createClientFromRequest(req);
327
329
  *
328
- * // Read across all users, bypassing the Orders entity's access rules
330
+ * // Access admin data with service role permissions
329
331
  * const recentOrders = await base44.asServiceRole.entities.Orders.list('-created_at', 50);
330
332
  *
331
333
  * return Response.json({ orders: recentOrders });
@@ -4,7 +4,7 @@ import type { AuthModule } from "./modules/auth.types.js";
4
4
  import type { SsoModule } from "./modules/sso.types.js";
5
5
  import type { ConnectorsModule, UserConnectorsModule } from "./modules/connectors.types.js";
6
6
  import type { FunctionsModule } from "./modules/functions.types.js";
7
- import type { AgentsModule } from "./modules/agents.types.js";
7
+ import type { AgentsModule } from "./modules/agents/agents.types.js";
8
8
  import type { AppLogsModule } from "./modules/app-logs.types.js";
9
9
  import type { AnalyticsModule } from "./modules/analytics.types.js";
10
10
  /**
@@ -49,7 +49,7 @@ export interface CreateClientConfig {
49
49
  */
50
50
  token?: string;
51
51
  /**
52
- * Service role authentication token. Provides elevated permissions that bypass entity access rules and field-level security. Only available in Base44-hosted backend functions. Automatically added to clients created using {@linkcode createClientFromRequest | createClientFromRequest()}.
52
+ * Service role authentication token. Provides elevated permissions to access data available to the app's admin. Only available in Base44-hosted backend functions. Automatically added to client's created using {@linkcode createClientFromRequest | createClientFromRequest()}.
53
53
  * @internal
54
54
  */
55
55
  serviceToken?: string;
@@ -117,7 +117,7 @@ export interface Base44Client {
117
117
  /**
118
118
  * Provides access to supported modules with elevated permissions.
119
119
  *
120
- * Service role authentication provides elevated permissions for backend operations. Unlike user authentication, which is scoped to a specific user's permissions, service role authentication bypasses entity access rules and field-level security entirely, giving full read and write access to all of the app's data.
120
+ * Service role authentication provides elevated permissions for backend operations. Unlike user authentication, which is scoped to a specific user's permissions, service role authentication has access to the data and operations available to the app's admin.
121
121
  *
122
122
  * @throws {Error} When accessed without providing a serviceToken during client creation
123
123
  */
package/dist/index.d.ts CHANGED
@@ -1,16 +1,18 @@
1
1
  import { createClient, createClientFromRequest, type Base44Client, type CreateClientConfig, type CreateClientOptions } from "./client.js";
2
2
  import { Base44Error, type Base44ErrorJSON } from "./utils/axios-client.js";
3
3
  import { getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl } from "./utils/auth-utils.js";
4
- export { createClient, createClientFromRequest, Base44Error, getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, };
4
+ import { tool } from "./modules/agents/tool.js";
5
+ export { createClient, createClientFromRequest, Base44Error, getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, tool, };
5
6
  export type { Base44Client, CreateClientConfig, CreateClientOptions, Base44ErrorJSON, };
6
7
  export * from "./types.js";
7
8
  export type { DeleteManyResult, DeleteResult, EntitiesModule, EntityFilterOperators, EntityFilterQuery, EntityFilterValue, EntityHandler, EntityRecord, EntityTypeRegistry, ImportResult, RealtimeEventType, RealtimeEvent, RealtimeCallback, SortField, UpdateManyResult, } from "./modules/entities.types.js";
8
9
  export type { AuthModule, LoginResponse, RegisterParams, VerifyOtpParams, ChangePasswordParams, ResetPasswordParams, User, } from "./modules/auth.types.js";
9
10
  export type { IntegrationsModule, IntegrationEndpointFunction, CoreIntegrations, InvokeLLMParams, GenerateImageParams, GenerateImageResult, UploadFileParams, UploadFileResult, SendEmailParams, SendEmailResult, ExtractDataFromUploadedFileParams, ExtractDataFromUploadedFileResult, UploadPrivateFileParams, UploadPrivateFileResult, CreateFileSignedUrlParams, CreateFileSignedUrlResult, } from "./modules/integrations.types.js";
10
11
  export type { FunctionsModule, FunctionName, FunctionNameRegistry, } from "./modules/functions.types.js";
11
- export type { AgentsModule, AgentName, AgentNameRegistry, AgentConversation, AgentMessage, AgentMessageReasoning, AgentMessageToolCall, AgentMessageUsage, AgentMessageCustomContext, AgentMessageMetadata, CreateConversationParams, } from "./modules/agents.types.js";
12
+ export type { AgentsModule, AgentName, AgentNameRegistry, AgentConversation, AgentMessage, AgentMessageReasoning, AgentMessageToolCall, AgentMessageUsage, AgentMessageCustomContext, AgentMessageMetadata, CreateConversationParams, } from "./modules/agents/agents.types.js";
12
13
  export type { AppLogsModule } from "./modules/app-logs.types.js";
13
14
  export type { SsoModule, SsoAccessTokenResponse } from "./modules/sso.types.js";
14
15
  export type { ConnectorsModule, UserConnectorsModule, } from "./modules/connectors.types.js";
15
16
  export type { CustomIntegrationsModule, CustomIntegrationCallParams, CustomIntegrationCallResponse, } from "./modules/custom-integrations.types.js";
17
+ export type { Tool, JSONSchema, ChatMessage, Step, RunUsage, RunResult, RunInput, RunOptions, ToolChoice, AgentConfig, Agent, FinishReason, } from "./modules/agents/agents.types.js";
16
18
  export type { GetAccessTokenOptions, SaveAccessTokenOptions, RemoveAccessTokenOptions, GetLoginUrlOptions, } from "./utils/auth-utils.types.js";
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { createClient, createClientFromRequest, } from "./client.js";
2
2
  import { Base44Error } from "./utils/axios-client.js";
3
3
  import { getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, } from "./utils/auth-utils.js";
4
- export { createClient, createClientFromRequest, Base44Error, getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, };
4
+ import { tool } from "./modules/agents/tool.js";
5
+ export { createClient, createClientFromRequest, Base44Error, getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, tool, };
5
6
  export * from "./types.js";
@@ -1,6 +1,317 @@
1
1
  import { AxiosInstance } from "axios";
2
- import { RoomsSocket } from "../utils/socket-utils.js";
3
- import { ModelFilterParams } from "../types.js";
2
+ import { RoomsSocket } from "../../utils/socket-utils.js";
3
+ import { ModelFilterParams } from "../../types.js";
4
+ /**
5
+ * A JSON Schema object describing a tool's input parameters.
6
+ * Use the standard JSON Schema `object` shape: `{ type: "object", properties: {...}, required: [...] }`.
7
+ */
8
+ export type JSONSchema = Record<string, unknown>;
9
+ /**
10
+ * A tool an agent can call. Create one with {@linkcode tool | tool()}, or derive it from a
11
+ * resource with `.asTool()`.
12
+ */
13
+ export interface Tool {
14
+ /** Natural-language description the model uses to decide when to call the tool. */
15
+ description: string;
16
+ /** JSON Schema for the tool's arguments. */
17
+ parameters: JSONSchema;
18
+ /** Runs the tool. Receives parsed arguments; returns any JSON-serializable value (or a string). */
19
+ execute: (args: any) => Promise<unknown> | unknown;
20
+ }
21
+ /**
22
+ * Why the agent run ended.
23
+ * `"max_steps"` is set by the SDK when the step cap is hit; all other values come from the model/normalization layer.
24
+ */
25
+ export type FinishReason = "stop" | "length" | "tool-calls" | "content-filter" | "error" | "other";
26
+ /** An OpenAI-shaped chat message accepted by {@linkcode Agent.run}. */
27
+ export interface ChatMessage {
28
+ role: "system" | "user" | "assistant" | "tool";
29
+ content?: string | null;
30
+ tool_calls?: Array<{
31
+ id: string;
32
+ type: "function";
33
+ function: {
34
+ name: string;
35
+ arguments: string;
36
+ };
37
+ }>;
38
+ tool_call_id?: string;
39
+ }
40
+ /** One iteration of the agent loop: the tool calls the model made and their results. */
41
+ export interface Step {
42
+ toolResults: Array<{
43
+ toolCallId: string;
44
+ toolName: string;
45
+ args: unknown;
46
+ result: string;
47
+ }>;
48
+ /** Token/credit usage of the model call that produced this step's tool calls. */
49
+ usage?: RunUsage;
50
+ }
51
+ /** Token/credit usage for a single model call or a sum across calls. `credits` is the Base44 gateway's `base44_credits`. */
52
+ export interface RunUsage {
53
+ inputTokens?: number;
54
+ outputTokens?: number;
55
+ totalTokens?: number;
56
+ credits?: number;
57
+ }
58
+ /** Result of {@linkcode Agent.run}. */
59
+ export interface RunResult {
60
+ /** The model's final text output. */
61
+ text: string;
62
+ /** The loop history (one entry per step that made tool calls). */
63
+ steps: Step[];
64
+ /**
65
+ * Why the run ended.
66
+ * Values come from the model/normalization layer (`"stop"`, `"length"`, `"tool-calls"`, `"content-filter"`, `"error"`, `"other"`)
67
+ * or from the SDK itself (`"max_steps"`, set when the step cap is reached).
68
+ */
69
+ finishReason: FinishReason | "max_steps";
70
+ /** Token and credit usage from the final completion. */
71
+ usage: RunUsage;
72
+ /** Summed across all model calls in the loop; `usage` is the final call only. */
73
+ totalUsage: RunUsage;
74
+ /** The raw final completion body, for advanced use. */
75
+ raw: unknown;
76
+ }
77
+ /** Input to {@linkcode Agent.run}: either a single prompt or a full message list. */
78
+ export type RunInput = {
79
+ prompt: string;
80
+ } | {
81
+ messages: ChatMessage[];
82
+ };
83
+ /**
84
+ * Per-run options passed as the second argument to {@linkcode Agent.run}.
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * const controller = new AbortController();
89
+ * setTimeout(() => controller.abort(), 10_000);
90
+ *
91
+ * const result = await agent.run(
92
+ * { prompt: "Summarize last month's sales." },
93
+ * { abortSignal: controller.signal },
94
+ * );
95
+ * ```
96
+ */
97
+ export interface RunOptions {
98
+ /** Abort the run (and the in-flight gateway request). */
99
+ abortSignal?: AbortSignal;
100
+ }
101
+ /** OpenAI-compatible tool choice. */
102
+ export type ToolChoice = "auto" | "none" | "required" | {
103
+ type: "function";
104
+ function: {
105
+ name: string;
106
+ };
107
+ };
108
+ /**
109
+ * Configuration for a code-defined agent passed to {@linkcode AgentsModule.create}.
110
+ *
111
+ * @example
112
+ * ```typescript
113
+ * const agent = base44.agents.create({
114
+ * model: "claude_sonnet_4_6",
115
+ * system: "You are a concise travel planner.",
116
+ * tools: { getWeather, searchFlights },
117
+ * maxSteps: 5,
118
+ * });
119
+ * ```
120
+ */
121
+ export interface AgentConfig {
122
+ /**
123
+ * Model alias or vendor model ID to use for this agent.
124
+ *
125
+ * Use a Base44 model alias (e.g. `"claude_sonnet_4_6"`, `"gpt_4o"`, `"gpt_5_mini"`) or a
126
+ * fully-qualified vendor ID. Available aliases are listed in the Base44 console.
127
+ */
128
+ model: string;
129
+ /**
130
+ * System prompt prepended to every run.
131
+ *
132
+ * Provide instructions, persona, or constraints for the model.
133
+ * Omit to let the model run without a system message.
134
+ */
135
+ system?: string;
136
+ /**
137
+ * Tools the agent may call, keyed by their function name.
138
+ *
139
+ * Each value must be a {@linkcode Tool} object — use the {@linkcode tool | tool()} factory
140
+ * to create one, or use `.asTool()` on a resource such as an entity or function.
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * import { tool } from "@base44/sdk";
145
+ *
146
+ * const getWeather = tool({
147
+ * description: "Get the current weather for a city.",
148
+ * parameters: { type: "object", properties: { city: { type: "string" } }, required: ["city"] },
149
+ * execute: async ({ city }) => fetch(`/weather?city=${city}`).then(r => r.json()),
150
+ * });
151
+ *
152
+ * const agent = base44.agents.create({ model: "claude_sonnet_4_6", tools: { getWeather } });
153
+ * ```
154
+ */
155
+ tools?: Record<string, Tool>;
156
+ /**
157
+ * Maximum number of tool-calling loop iterations before the run stops.
158
+ *
159
+ * Each iteration is one round-trip to the model. If the model keeps calling tools
160
+ * and this limit is reached, the run ends with `finishReason: "max_steps"`.
161
+ * Defaults to `8`.
162
+ */
163
+ maxSteps?: number;
164
+ /**
165
+ * Sampling temperature passed to the model.
166
+ *
167
+ * Controls output randomness: lower values (e.g. `0`) produce more deterministic
168
+ * responses; higher values (e.g. `1`) increase variety. Omit to use the model default.
169
+ *
170
+ * Note: GPT-5 series models only accept `temperature: 1`.
171
+ */
172
+ temperature?: number;
173
+ /**
174
+ * JSON Schema to constrain the model's output to structured JSON.
175
+ *
176
+ * When set, the request is sent with `response_format: { type: "json_schema", … }`.
177
+ * The model's response will be valid JSON matching the schema; access it by parsing
178
+ * `RunResult.text`.
179
+ * The schema is sent with strict JSON-schema mode, so it should have `additionalProperties: false` and list every property in `required` (otherwise the provider may reject it).
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * const agent = base44.agents.create({
184
+ * model: "claude_sonnet_4_6",
185
+ * responseFormat: {
186
+ * type: "object",
187
+ * properties: { summary: { type: "string" }, score: { type: "number" } },
188
+ * required: ["summary", "score"],
189
+ * },
190
+ * });
191
+ * const { text } = await agent.run({ prompt: "Rate this product description." });
192
+ * const { summary, score } = JSON.parse(text);
193
+ * ```
194
+ */
195
+ responseFormat?: JSONSchema;
196
+ /**
197
+ * Controls whether and which tool the model must call.
198
+ *
199
+ * - `"auto"` (default when tools are provided): the model decides.
200
+ * - `"none"`: the model must not call any tool.
201
+ * - `"required"`: the model must call at least one tool.
202
+ * - `{ type: "function", function: { name } }`: force a specific tool.
203
+ */
204
+ toolChoice?: ToolChoice;
205
+ }
206
+ /**
207
+ * A reusable code-defined agent returned by {@linkcode AgentsModule.create}.
208
+ *
209
+ * An agent runs a multi-step tool-calling loop: it sends messages to the model,
210
+ * executes any tool calls the model requests, feeds the results back, and repeats
211
+ * until the model produces a final answer or `maxSteps` is reached.
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * const agent = base44.agents.create({
216
+ * model: "claude_sonnet_4_6",
217
+ * system: "You are a concise travel planner.",
218
+ * tools: { getWeather },
219
+ * });
220
+ *
221
+ * const { text } = await agent.run({ prompt: "What's the weather like in Tel Aviv?" });
222
+ * console.log(text);
223
+ * ```
224
+ */
225
+ export interface Agent {
226
+ /**
227
+ * Runs the agent's tool-calling loop to completion and returns the final result.
228
+ *
229
+ * Builds an initial message list from `input`, then repeatedly calls the model,
230
+ * executes any tool calls, and feeds results back until the model stops or
231
+ * `maxSteps` (from {@linkcode AgentConfig}) is reached.
232
+ *
233
+ * Tool errors are fed back to the model as tool results rather than thrown, so
234
+ * the model can recover or explain the failure.
235
+ *
236
+ * @param input - The run input: either `{ prompt: string }` for a simple user
237
+ * message, or `{ messages: ChatMessage[] }` to supply a full conversation history.
238
+ * @param options - Optional {@linkcode RunOptions} (e.g. an `AbortSignal`).
239
+ * @returns Promise resolving to a {@linkcode RunResult} containing the model's
240
+ * final text, per-step tool call history, finish reason, and token/credit usage.
241
+ *
242
+ * @example
243
+ * ```typescript
244
+ * // Simple prompt
245
+ * const { text, usage } = await agent.run({ prompt: "Plan a one-day trip to Haifa." });
246
+ * console.log(text);
247
+ * console.log(`Credits used: ${usage.credits}`);
248
+ * ```
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * // Supply a full message history
253
+ * const { text } = await agent.run({
254
+ * messages: [
255
+ * { role: "user", content: "What is the capital of France?" },
256
+ * { role: "assistant", content: "Paris." },
257
+ * { role: "user", content: "And what is the population?" },
258
+ * ],
259
+ * });
260
+ * ```
261
+ *
262
+ * @example
263
+ * ```typescript
264
+ * // Cancel a long-running run
265
+ * const controller = new AbortController();
266
+ * setTimeout(() => controller.abort(), 15_000);
267
+ * const { text } = await agent.run(
268
+ * { prompt: "Summarize all open support tickets." },
269
+ * { abortSignal: controller.signal },
270
+ * );
271
+ * ```
272
+ */
273
+ run(input: RunInput, options?: RunOptions): Promise<RunResult>;
274
+ /**
275
+ * Wraps this agent as a {@linkcode Tool} so another agent can call it as a sub-agent.
276
+ *
277
+ * The returned tool exposes a single `prompt` parameter. When called, it invokes
278
+ * {@linkcode Agent.run | run()} with that prompt and returns the text result.
279
+ * Use this to build agent hierarchies where a coordinator agent delegates tasks
280
+ * to specialized sub-agents.
281
+ *
282
+ * @param opts - Options for the tool wrapper.
283
+ * @param opts.description - Required. Natural-language description the calling
284
+ * model uses to decide when to invoke this sub-agent.
285
+ * @param opts.name - Optional display name for the tool. Defaults to the
286
+ * agent config's model alias when omitted.
287
+ * @returns A {@linkcode Tool} that can be passed in another agent's `tools` map.
288
+ * @note The sub-agent runs independently — the parent's `abortSignal` is not propagated and
289
+ * the sub-agent's token/credit usage is not included in the parent's `totalUsage`.
290
+ *
291
+ * @example
292
+ * ```typescript
293
+ * const researchAgent = base44.agents.create({
294
+ * model: "claude_sonnet_4_6",
295
+ * tools: { webSearch },
296
+ * });
297
+ *
298
+ * const writerAgent = base44.agents.create({
299
+ * model: "claude_sonnet_4_6",
300
+ * tools: {
301
+ * research: researchAgent.asTool({
302
+ * description: "Search the web and return a research summary.",
303
+ * }),
304
+ * },
305
+ * });
306
+ *
307
+ * const { text } = await writerAgent.run({ prompt: "Write a blog post about coral reefs." });
308
+ * ```
309
+ */
310
+ asTool(opts: {
311
+ name?: string;
312
+ description: string;
313
+ }): Tool;
314
+ }
4
315
  /**
5
316
  * Registry of agent names. The [`types generate`](/developers/references/cli/commands/types-generate) command fills this registry, then [`AgentName`](#agentname) resolves to a union of the keys.
6
317
  */
@@ -162,6 +473,8 @@ export interface AgentsModuleConfig {
162
473
  serverUrl?: string;
163
474
  /** Authentication token */
164
475
  token?: string;
476
+ /** Returns the current bearer token at call time (thunk — never a captured string). Used by `create()`. */
477
+ getToken?: () => string | undefined;
165
478
  }
166
479
  /**
167
480
  * Agents module for managing AI agent conversations.
@@ -194,7 +507,7 @@ export interface AgentsModuleConfig {
194
507
  * This module is available to use with a client in all authentication modes:
195
508
  *
196
509
  * - **Anonymous or User authentication** (`base44.agents`): Access is scoped to the current user's permissions. Users must be authenticated to create and access conversations.
197
- * - **Service role authentication** (`base44.asServiceRole.agents`): Operations run with elevated permissions for backend code that isn't tied to a specific user session.
510
+ * - **Service role authentication** (`base44.asServiceRole.agents`): Operations have elevated admin-level permissions. Can access all conversations that the app's admin role has access to.
198
511
  *
199
512
  * ## Generated Types
200
513
  *
@@ -356,6 +669,27 @@ export interface AgentsModule {
356
669
  * ```
357
670
  */
358
671
  subscribeToConversation(conversationId: string, onUpdate?: (conversation: AgentConversation) => void): () => void;
672
+ /**
673
+ * Creates a code-defined agent: you specify the model, system prompt, and tools in code,
674
+ * and the SDK runs the tool-calling loop against the Base44 AI Gateway.
675
+ *
676
+ * Returns a reusable {@linkcode Agent} you can {@linkcode Agent.run | run} or expose to
677
+ * another agent as a tool with {@linkcode Agent.asTool | asTool}.
678
+ *
679
+ * @param config - Model alias, optional system prompt, tools, and step limit.
680
+ * @returns A reusable {@linkcode Agent} with {@linkcode Agent.run | run()} and {@linkcode Agent.asTool | asTool()}.
681
+ *
682
+ * @example
683
+ * ```typescript
684
+ * const agent = base44.agents.create({
685
+ * model: "claude_sonnet_4_6",
686
+ * system: "You plan trips.",
687
+ * tools: { getWeather },
688
+ * });
689
+ * const { text } = await agent.run({ prompt: "Plan a day in Haifa." });
690
+ * ```
691
+ */
692
+ create(config: AgentConfig): Agent;
359
693
  /**
360
694
  * Gets WhatsApp connection URL for an agent.
361
695
  *
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Minimal authenticated JSON POST against the gateway. The provider supplies the wire-specific
3
+ * path (e.g. `/chat/completions`), so the transport stays neutral across provider formats.
4
+ * @internal
5
+ */
6
+ export type GatewayTransport = {
7
+ post(path: string, body: Record<string, unknown>, opts?: {
8
+ signal?: AbortSignal;
9
+ }): Promise<unknown>;
10
+ };
11
+ /** @internal */
12
+ export interface GatewayConfig {
13
+ serverUrl: string;
14
+ /** Returns the current bearer token at call time (thunk — never a captured string). */
15
+ getToken: () => string | undefined;
16
+ }
17
+ /**
18
+ * Resolves the AI Gateway connection from a client config.
19
+ * @internal
20
+ */
21
+ export declare function resolveConnection(config: GatewayConfig): {
22
+ baseURL: string;
23
+ apiKey: string;
24
+ };
25
+ /**
26
+ * Creates the gateway transport — owns the single HTTP call to the OpenAI-compatible
27
+ * `/chat/completions` endpoint.
28
+ * @internal
29
+ */
30
+ export declare function createGatewayTransport(config: GatewayConfig): {
31
+ post(path: string, body: Record<string, unknown>, opts?: {
32
+ signal?: AbortSignal;
33
+ }): Promise<unknown>;
34
+ };
@@ -0,0 +1,41 @@
1
+ import { Base44Error } from "../../utils/axios-client.js";
2
+ /**
3
+ * Resolves the AI Gateway connection from a client config.
4
+ * @internal
5
+ */
6
+ export function resolveConnection(config) {
7
+ var _a;
8
+ const { serverUrl, getToken } = config;
9
+ // No appId in the path: the gateway resolves the app by request Host.
10
+ return {
11
+ baseURL: `${serverUrl}/api/ai/unified/v1`,
12
+ apiKey: (_a = getToken()) !== null && _a !== void 0 ? _a : "",
13
+ };
14
+ }
15
+ /**
16
+ * Creates the gateway transport — owns the single HTTP call to the OpenAI-compatible
17
+ * `/chat/completions` endpoint.
18
+ * @internal
19
+ */
20
+ export function createGatewayTransport(config) {
21
+ return {
22
+ async post(path, body, opts = {}) {
23
+ const { baseURL, apiKey } = resolveConnection(config);
24
+ const res = await fetch(`${baseURL}${path}`, {
25
+ method: "POST",
26
+ headers: {
27
+ "Content-Type": "application/json",
28
+ Authorization: `Bearer ${apiKey}`,
29
+ },
30
+ body: JSON.stringify(body),
31
+ signal: opts.signal,
32
+ });
33
+ const json = await res.json().catch(() => null);
34
+ if (!res.ok) {
35
+ const err = (json && json.error) || {};
36
+ throw new Base44Error(err.message || `AI Gateway request failed with status ${res.status}`, res.status, err.code || err.type || "ai_gateway_error", json, null);
37
+ }
38
+ return json;
39
+ },
40
+ };
41
+ }
@@ -1,2 +1,2 @@
1
1
  import { AgentsModule, AgentsModuleConfig } from "./agents.types.js";
2
- export declare function createAgentsModule({ axios, getSocket, appId, serverUrl, token, }: AgentsModuleConfig): AgentsModule;
2
+ export declare function createAgentsModule({ axios, getSocket, appId, serverUrl, token, getToken, }: AgentsModuleConfig): AgentsModule;
@@ -1,5 +1,12 @@
1
- import { getAccessToken } from "../utils/auth-utils.js";
2
- export function createAgentsModule({ axios, getSocket, appId, serverUrl, token, }) {
1
+ import { getAccessToken } from "../../utils/auth-utils.js";
2
+ import { createGatewayTransport } from "./gateway.js";
3
+ import { openAICompatibleProvider } from "./providers/openai-compatible.js";
4
+ import { createAgent } from "./loop.js";
5
+ export function createAgentsModule({ axios, getSocket, appId, serverUrl, token, getToken, }) {
6
+ const model = openAICompatibleProvider(createGatewayTransport({
7
+ serverUrl: serverUrl !== null && serverUrl !== void 0 ? serverUrl : "",
8
+ getToken: getToken !== null && getToken !== void 0 ? getToken : (() => token),
9
+ }));
3
10
  const baseURL = `/apps/${appId}/agents`;
4
11
  // Track active conversations
5
12
  const currentConversations = {};
@@ -85,5 +92,6 @@ export function createAgentsModule({ axios, getSocket, appId, serverUrl, token,
85
92
  subscribeToConversation,
86
93
  getWhatsAppConnectURL,
87
94
  getTelegramConnectURL,
95
+ create(config) { return createAgent(config, model); },
88
96
  };
89
97
  }
@@ -0,0 +1,4 @@
1
+ import type { Agent, AgentConfig } from "./agents.types.js";
2
+ import type { LanguageModel } from "./provider.js";
3
+ /** Creates an Agent from a config and a language model. @internal */
4
+ export declare function createAgent(agentConfig: AgentConfig, model: LanguageModel): Agent;