@falai/agent 0.5.0 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/cjs/core/Agent.d.ts.map +1 -1
  2. package/dist/cjs/core/Agent.js +6 -6
  3. package/dist/cjs/core/Agent.js.map +1 -1
  4. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  5. package/dist/cjs/core/PersistenceManager.js +3 -5
  6. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  7. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  8. package/dist/cjs/core/ResponseEngine.js +5 -3
  9. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  10. package/dist/cjs/providers/GeminiProvider.d.ts +15 -0
  11. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  12. package/dist/cjs/providers/GeminiProvider.js +89 -4
  13. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  14. package/dist/cjs/providers/OpenAIProvider.d.ts +7 -0
  15. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  16. package/dist/cjs/providers/OpenAIProvider.js +13 -1
  17. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  18. package/dist/cjs/providers/OpenRouterProvider.d.ts +7 -0
  19. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  20. package/dist/cjs/providers/OpenRouterProvider.js +13 -1
  21. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  22. package/dist/cjs/types/session.d.ts +9 -4
  23. package/dist/cjs/types/session.d.ts.map +1 -1
  24. package/dist/cjs/types/session.js +8 -2
  25. package/dist/cjs/types/session.js.map +1 -1
  26. package/dist/core/Agent.d.ts.map +1 -1
  27. package/dist/core/Agent.js +6 -6
  28. package/dist/core/Agent.js.map +1 -1
  29. package/dist/core/PersistenceManager.d.ts.map +1 -1
  30. package/dist/core/PersistenceManager.js +3 -5
  31. package/dist/core/PersistenceManager.js.map +1 -1
  32. package/dist/core/ResponseEngine.d.ts.map +1 -1
  33. package/dist/core/ResponseEngine.js +5 -3
  34. package/dist/core/ResponseEngine.js.map +1 -1
  35. package/dist/providers/GeminiProvider.d.ts +15 -0
  36. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  37. package/dist/providers/GeminiProvider.js +90 -5
  38. package/dist/providers/GeminiProvider.js.map +1 -1
  39. package/dist/providers/OpenAIProvider.d.ts +7 -0
  40. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  41. package/dist/providers/OpenAIProvider.js +13 -1
  42. package/dist/providers/OpenAIProvider.js.map +1 -1
  43. package/dist/providers/OpenRouterProvider.d.ts +7 -0
  44. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  45. package/dist/providers/OpenRouterProvider.js +13 -1
  46. package/dist/providers/OpenRouterProvider.js.map +1 -1
  47. package/dist/types/session.d.ts +9 -4
  48. package/dist/types/session.d.ts.map +1 -1
  49. package/dist/types/session.js +8 -2
  50. package/dist/types/session.js.map +1 -1
  51. package/docs/API_REFERENCE.md +234 -0
  52. package/package.json +1 -1
  53. package/src/core/Agent.ts +6 -12
  54. package/src/core/PersistenceManager.ts +3 -5
  55. package/src/core/ResponseEngine.ts +6 -3
  56. package/src/providers/GeminiProvider.ts +114 -5
  57. package/src/providers/OpenAIProvider.ts +17 -1
  58. package/src/providers/OpenRouterProvider.ts +19 -1
  59. package/src/types/session.ts +18 -6
  60. package/dist/cjs/utils/schema.d.ts +0 -17
  61. package/dist/cjs/utils/schema.d.ts.map +0 -1
  62. package/dist/cjs/utils/schema.js +0 -32
  63. package/dist/cjs/utils/schema.js.map +0 -1
  64. package/dist/utils/schema.d.ts +0 -17
  65. package/dist/utils/schema.d.ts.map +0 -1
  66. package/dist/utils/schema.js +0 -27
  67. package/dist/utils/schema.js.map +0 -1
  68. package/src/utils/schema.ts +0 -32
@@ -6,8 +6,9 @@ import type {
6
6
  GoogleGenAI as GoogleGenAIType,
7
7
  GenerateContentConfig,
8
8
  GenerateContentResponse,
9
+ Schema,
9
10
  } from "@google/genai";
10
- import { GoogleGenAI } from "@google/genai";
11
+ import { GoogleGenAI, Type } from "@google/genai";
11
12
 
12
13
  import type {
13
14
  AiProvider,
@@ -16,6 +17,7 @@ import type {
16
17
  GenerateMessageStreamChunk,
17
18
  AgentStructuredResponse,
18
19
  } from "../types/ai";
20
+ import type { StructuredSchema } from "../types/schema";
19
21
  import { withTimeoutAndRetry } from "../utils/retry";
20
22
 
21
23
  const DEFAULT_RETRY_CONFIG = {
@@ -147,6 +149,109 @@ export class GeminiProvider implements AiProvider {
147
149
  };
148
150
  }
149
151
 
152
+ /**
153
+ * Adapt common schema format to Gemini's specific requirements.
154
+ * Gemini has strict validation:
155
+ * - OBJECT types MUST have non-empty properties
156
+ * - Empty objects cause 400 Bad Request errors
157
+ * - Uses Gemini's Schema type with Type enums
158
+ *
159
+ * @private
160
+ */
161
+ private adaptSchemaForGemini(schema: StructuredSchema): Schema {
162
+ const geminiSchema: Schema = {};
163
+
164
+ // Convert type
165
+ if (schema.type) {
166
+ if (Array.isArray(schema.type)) {
167
+ // For now, take the first type (Gemini doesn't support union types the same way)
168
+ geminiSchema.type = this.mapToGeminiType(schema.type[0]);
169
+ } else {
170
+ geminiSchema.type = this.mapToGeminiType(schema.type);
171
+ }
172
+ }
173
+
174
+ // Handle description
175
+ if (schema.description) {
176
+ geminiSchema.description = schema.description;
177
+ }
178
+
179
+ // Handle nullable
180
+ if (schema.nullable !== undefined) {
181
+ geminiSchema.nullable = schema.nullable;
182
+ }
183
+
184
+ // Handle enum
185
+ if (schema.enum) {
186
+ geminiSchema.enum = schema.enum as string[];
187
+ }
188
+
189
+ // Handle object properties - Gemini requires non-empty properties for OBJECT type
190
+ if (
191
+ geminiSchema.type === Type.OBJECT ||
192
+ schema.type === "object" ||
193
+ (Array.isArray(schema.type) && schema.type.includes("object"))
194
+ ) {
195
+ if (!schema.properties || Object.keys(schema.properties).length === 0) {
196
+ console.warn(
197
+ "[GeminiProvider] Gemini requires OBJECT types to have non-empty properties. Converting empty object to STRING."
198
+ );
199
+ geminiSchema.type = Type.STRING;
200
+ return geminiSchema;
201
+ }
202
+
203
+ // Recursively convert nested properties
204
+ geminiSchema.properties = {};
205
+ for (const [key, value] of Object.entries(schema.properties)) {
206
+ geminiSchema.properties[key] = this.adaptSchemaForGemini(value);
207
+ }
208
+
209
+ // Handle required fields
210
+ if (schema.required && schema.required.length > 0) {
211
+ geminiSchema.required = schema.required;
212
+ }
213
+ }
214
+
215
+ // Handle array items
216
+ if (
217
+ geminiSchema.type === Type.ARRAY ||
218
+ schema.type === "array" ||
219
+ (Array.isArray(schema.type) && schema.type.includes("array"))
220
+ ) {
221
+ if (schema.items) {
222
+ geminiSchema.items = this.adaptSchemaForGemini(schema.items);
223
+ }
224
+ }
225
+
226
+ return geminiSchema;
227
+ }
228
+
229
+ /**
230
+ * Map common JSON Schema type strings to Gemini's Type enum
231
+ * @private
232
+ */
233
+ private mapToGeminiType(type: string): Type {
234
+ switch (type.toLowerCase()) {
235
+ case "string":
236
+ return Type.STRING;
237
+ case "number":
238
+ return Type.NUMBER;
239
+ case "integer":
240
+ return Type.INTEGER;
241
+ case "boolean":
242
+ return Type.BOOLEAN;
243
+ case "array":
244
+ return Type.ARRAY;
245
+ case "object":
246
+ return Type.OBJECT;
247
+ default:
248
+ console.warn(
249
+ `[GeminiProvider] Unknown type "${type}", defaulting to STRING`
250
+ );
251
+ return Type.STRING;
252
+ }
253
+ }
254
+
150
255
  async generateMessage<
151
256
  TContext = unknown,
152
257
  TStructured = AgentStructuredResponse
@@ -239,9 +344,10 @@ export class GeminiProvider implements AiProvider {
239
344
  const configOverride: Partial<GenerateContentConfig> = { ...this.config };
240
345
  if (input.parameters?.jsonSchema) {
241
346
  configOverride.responseMimeType = "application/json";
242
- // Gemini expects responseSchema. We pass through our schema as-is.
243
- // A deeper mapping can be added via utils if needed.
244
- configOverride.responseSchema = input.parameters.jsonSchema;
347
+ // Adapt common schema format to Gemini's specific requirements
348
+ configOverride.responseSchema = this.adaptSchemaForGemini(
349
+ input.parameters.jsonSchema
350
+ );
245
351
  }
246
352
 
247
353
  const response: GenerateContentResponse =
@@ -360,7 +466,10 @@ export class GeminiProvider implements AiProvider {
360
466
  const configOverride: Partial<GenerateContentConfig> = { ...this.config };
361
467
  if (input.parameters?.jsonSchema) {
362
468
  configOverride.responseMimeType = "application/json";
363
- configOverride.responseSchema = input.parameters.jsonSchema;
469
+ // Adapt common schema format to Gemini's specific requirements
470
+ configOverride.responseSchema = this.adaptSchemaForGemini(
471
+ input.parameters.jsonSchema
472
+ );
364
473
  }
365
474
 
366
475
  const stream = await this.genAI.models.generateContentStream({
@@ -12,6 +12,7 @@ import type {
12
12
  GenerateMessageStreamChunk,
13
13
  AgentStructuredResponse,
14
14
  } from "../types/ai";
15
+ import type { StructuredSchema } from "../types/schema";
15
16
  import { withTimeoutAndRetry } from "../utils/retry";
16
17
 
17
18
  const DEFAULT_RETRY_CONFIG = {
@@ -159,6 +160,20 @@ export class OpenAIProvider implements AiProvider {
159
160
  };
160
161
  }
161
162
 
163
+ /**
164
+ * Adapt common schema format to OpenAI's format.
165
+ * OpenAI uses standard JSON Schema, so this is mostly a passthrough.
166
+ *
167
+ * @private
168
+ */
169
+ private adaptSchemaForOpenAI(
170
+ schema: StructuredSchema
171
+ ): Record<string, unknown> {
172
+ // OpenAI's responses.parse API uses standard JSON Schema
173
+ // Our StructuredSchema is already JSON Schema compatible
174
+ return schema as Record<string, unknown>;
175
+ }
176
+
162
177
  async generateMessage<
163
178
  TContext = unknown,
164
179
  TStructured = AgentStructuredResponse
@@ -279,7 +294,8 @@ export class OpenAIProvider implements AiProvider {
279
294
  format: {
280
295
  type: "json_schema",
281
296
  name: input.parameters?.schemaName || "structured_output",
282
- schema: input.parameters.jsonSchema,
297
+ // Adapt common schema format to OpenAI's format
298
+ schema: this.adaptSchemaForOpenAI(input.parameters.jsonSchema),
283
299
  },
284
300
  },
285
301
  });
@@ -13,6 +13,7 @@ import type {
13
13
  GenerateMessageOutput,
14
14
  GenerateMessageStreamChunk,
15
15
  } from "../types/ai";
16
+ import type { StructuredSchema } from "../types/schema";
16
17
  import { withTimeoutAndRetry } from "../utils/retry";
17
18
 
18
19
  const DEFAULT_RETRY_CONFIG = {
@@ -169,6 +170,20 @@ export class OpenRouterProvider implements AiProvider {
169
170
  };
170
171
  }
171
172
 
173
+ /**
174
+ * Adapt common schema format to OpenRouter's format.
175
+ * OpenRouter is OpenAI-compatible and uses standard JSON Schema.
176
+ *
177
+ * @private
178
+ */
179
+ private adaptSchemaForOpenRouter(
180
+ schema: StructuredSchema
181
+ ): Record<string, unknown> {
182
+ // OpenRouter is OpenAI-compatible and uses standard JSON Schema
183
+ // Our StructuredSchema is already JSON Schema compatible
184
+ return schema as Record<string, unknown>;
185
+ }
186
+
172
187
  async generateMessage<
173
188
  TContext = unknown,
174
189
  TStructured = AgentStructuredResponse
@@ -286,7 +301,10 @@ export class OpenRouterProvider implements AiProvider {
286
301
  format: {
287
302
  type: "json_schema",
288
303
  name: input.parameters?.schemaName || "structured_output",
289
- schema: input.parameters.jsonSchema,
304
+ // Adapt common schema format to OpenRouter's format
305
+ schema: this.adaptSchemaForOpenRouter(
306
+ input.parameters.jsonSchema
307
+ ),
290
308
  },
291
309
  },
292
310
  });
@@ -7,6 +7,9 @@
7
7
  * and data extracted during the route progression
8
8
  */
9
9
  export interface SessionState<TExtracted = Record<string, unknown>> {
10
+ /** Unique session identifier (useful for persistence) */
11
+ id?: string;
12
+
10
13
  /** Current route the conversation is in */
11
14
  currentRoute?: {
12
15
  id: string;
@@ -34,7 +37,6 @@ export interface SessionState<TExtracted = Record<string, unknown>> {
34
37
 
35
38
  /** Session metadata */
36
39
  metadata?: {
37
- sessionId?: string;
38
40
  createdAt?: Date;
39
41
  lastUpdatedAt?: Date;
40
42
  [key: string]: unknown;
@@ -43,11 +45,15 @@ export interface SessionState<TExtracted = Record<string, unknown>> {
43
45
 
44
46
  /**
45
47
  * Helper to create a new session
48
+ * @param sessionId - Optional session ID (e.g., from database)
49
+ * @param metadata - Optional metadata to attach
46
50
  */
47
51
  export function createSession<TExtracted = Record<string, unknown>>(
52
+ sessionId?: string,
48
53
  metadata?: SessionState<TExtracted>["metadata"]
49
54
  ): SessionState<TExtracted> {
50
55
  return {
56
+ id: sessionId,
51
57
  extracted: {},
52
58
  routeHistory: [],
53
59
  metadata: {
@@ -172,15 +178,21 @@ export function sessionStateToData<TExtracted = Record<string, unknown>>(
172
178
  /**
173
179
  * Helper to convert database SessionData back to SessionState
174
180
  * Used when loading from database
181
+ * @param sessionId - The database session ID
182
+ * @param data - The database session data
175
183
  */
176
- export function sessionDataToState<TExtracted = Record<string, unknown>>(data: {
177
- currentRoute?: string;
178
- currentState?: string;
179
- collectedData?: Record<string, unknown>;
180
- }): Partial<SessionState<TExtracted>> {
184
+ export function sessionDataToState<TExtracted = Record<string, unknown>>(
185
+ sessionId: string,
186
+ data: {
187
+ currentRoute?: string;
188
+ currentState?: string;
189
+ collectedData?: Record<string, unknown>;
190
+ }
191
+ ): SessionState<TExtracted> {
181
192
  const collectedData = data.collectedData || {};
182
193
 
183
194
  return {
195
+ id: sessionId,
184
196
  currentRoute: data.currentRoute
185
197
  ? {
186
198
  id: data.currentRoute,
@@ -1,17 +0,0 @@
1
- import type { StructuredSchema } from "../types/schema";
2
- /**
3
- * Convert our StructuredSchema to the OpenAI/OpenRouter JSON schema format
4
- * (they already accept standard JSON Schema for responses.parse)
5
- */
6
- export declare function convertToOpenAIJsonSchema(schema: StructuredSchema): object;
7
- /**
8
- * Convert our StructuredSchema to Gemini responseSchema (Type mapping)
9
- * The @google/genai expects a slightly different shape
10
- */
11
- export declare function convertToGeminiSchema(schema: StructuredSchema): object;
12
- /**
13
- * Convert our StructuredSchema into Anthropic system prompt constraints.
14
- * Since Anthropic lacks native schema parsing, we embed a concise instruction.
15
- */
16
- export declare function convertToAnthropicConstraint(schema: StructuredSchema): string;
17
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/utils/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAI1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAItE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAK7E"}
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.convertToOpenAIJsonSchema = convertToOpenAIJsonSchema;
4
- exports.convertToGeminiSchema = convertToGeminiSchema;
5
- exports.convertToAnthropicConstraint = convertToAnthropicConstraint;
6
- /**
7
- * Convert our StructuredSchema to the OpenAI/OpenRouter JSON schema format
8
- * (they already accept standard JSON Schema for responses.parse)
9
- */
10
- function convertToOpenAIJsonSchema(schema) {
11
- // For now our schema aligns well with JSON Schema draft-like structure
12
- // Return as-is; callers should ensure correctness
13
- return schema;
14
- }
15
- /**
16
- * Convert our StructuredSchema to Gemini responseSchema (Type mapping)
17
- * The @google/genai expects a slightly different shape
18
- */
19
- function convertToGeminiSchema(schema) {
20
- // Basic passthrough. If needed, a deeper mapping can be added later.
21
- // Gemini supports a similar structure (type, properties, items, enum, etc.)
22
- return schema;
23
- }
24
- /**
25
- * Convert our StructuredSchema into Anthropic system prompt constraints.
26
- * Since Anthropic lacks native schema parsing, we embed a concise instruction.
27
- */
28
- function convertToAnthropicConstraint(schema) {
29
- // Keep it concise to avoid context bloat
30
- return `You must respond with valid JSON that matches this schema: ${JSON.stringify(schema)}`;
31
- }
32
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/utils/schema.ts"],"names":[],"mappings":";;AAMA,8DAIC;AAMD,sDAIC;AAMD,oEAKC;AA7BD;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,MAAwB;IAChE,uEAAuE;IACvE,kDAAkD;IAClD,OAAO,MAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,MAAwB;IAC5D,qEAAqE;IACrE,4EAA4E;IAC5E,OAAO,MAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,MAAwB;IACnE,yCAAyC;IACzC,OAAO,8DAA8D,IAAI,CAAC,SAAS,CACjF,MAAM,CACP,EAAE,CAAC;AACN,CAAC"}
@@ -1,17 +0,0 @@
1
- import type { StructuredSchema } from "../types/schema";
2
- /**
3
- * Convert our StructuredSchema to the OpenAI/OpenRouter JSON schema format
4
- * (they already accept standard JSON Schema for responses.parse)
5
- */
6
- export declare function convertToOpenAIJsonSchema(schema: StructuredSchema): object;
7
- /**
8
- * Convert our StructuredSchema to Gemini responseSchema (Type mapping)
9
- * The @google/genai expects a slightly different shape
10
- */
11
- export declare function convertToGeminiSchema(schema: StructuredSchema): object;
12
- /**
13
- * Convert our StructuredSchema into Anthropic system prompt constraints.
14
- * Since Anthropic lacks native schema parsing, we embed a concise instruction.
15
- */
16
- export declare function convertToAnthropicConstraint(schema: StructuredSchema): string;
17
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAI1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAItE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAK7E"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Convert our StructuredSchema to the OpenAI/OpenRouter JSON schema format
3
- * (they already accept standard JSON Schema for responses.parse)
4
- */
5
- export function convertToOpenAIJsonSchema(schema) {
6
- // For now our schema aligns well with JSON Schema draft-like structure
7
- // Return as-is; callers should ensure correctness
8
- return schema;
9
- }
10
- /**
11
- * Convert our StructuredSchema to Gemini responseSchema (Type mapping)
12
- * The @google/genai expects a slightly different shape
13
- */
14
- export function convertToGeminiSchema(schema) {
15
- // Basic passthrough. If needed, a deeper mapping can be added later.
16
- // Gemini supports a similar structure (type, properties, items, enum, etc.)
17
- return schema;
18
- }
19
- /**
20
- * Convert our StructuredSchema into Anthropic system prompt constraints.
21
- * Since Anthropic lacks native schema parsing, we embed a concise instruction.
22
- */
23
- export function convertToAnthropicConstraint(schema) {
24
- // Keep it concise to avoid context bloat
25
- return `You must respond with valid JSON that matches this schema: ${JSON.stringify(schema)}`;
26
- }
27
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAwB;IAChE,uEAAuE;IACvE,kDAAkD;IAClD,OAAO,MAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,qEAAqE;IACrE,4EAA4E;IAC5E,OAAO,MAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAwB;IACnE,yCAAyC;IACzC,OAAO,8DAA8D,IAAI,CAAC,SAAS,CACjF,MAAM,CACP,EAAE,CAAC;AACN,CAAC"}
@@ -1,32 +0,0 @@
1
- import type { StructuredSchema } from "../types/schema";
2
-
3
- /**
4
- * Convert our StructuredSchema to the OpenAI/OpenRouter JSON schema format
5
- * (they already accept standard JSON Schema for responses.parse)
6
- */
7
- export function convertToOpenAIJsonSchema(schema: StructuredSchema): object {
8
- // For now our schema aligns well with JSON Schema draft-like structure
9
- // Return as-is; callers should ensure correctness
10
- return schema as object;
11
- }
12
-
13
- /**
14
- * Convert our StructuredSchema to Gemini responseSchema (Type mapping)
15
- * The @google/genai expects a slightly different shape
16
- */
17
- export function convertToGeminiSchema(schema: StructuredSchema): object {
18
- // Basic passthrough. If needed, a deeper mapping can be added later.
19
- // Gemini supports a similar structure (type, properties, items, enum, etc.)
20
- return schema as object;
21
- }
22
-
23
- /**
24
- * Convert our StructuredSchema into Anthropic system prompt constraints.
25
- * Since Anthropic lacks native schema parsing, we embed a concise instruction.
26
- */
27
- export function convertToAnthropicConstraint(schema: StructuredSchema): string {
28
- // Keep it concise to avoid context bloat
29
- return `You must respond with valid JSON that matches this schema: ${JSON.stringify(
30
- schema
31
- )}`;
32
- }