orangeslice 1.6.1 → 1.7.1

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.
@@ -0,0 +1,57 @@
1
+ export interface DatasetListParams {
2
+ limit?: number;
3
+ offset?: number;
4
+ clean?: boolean;
5
+ fields?: string[];
6
+ unwind?: string;
7
+ }
8
+ export interface ActorSearchResult {
9
+ actorId: string;
10
+ name: string;
11
+ username: string;
12
+ title: string;
13
+ description: string;
14
+ stats: Record<string, unknown>;
15
+ pricing: Record<string, unknown>;
16
+ }
17
+ export interface ActorInputSchema {
18
+ actor: string;
19
+ actId: string;
20
+ buildId: string;
21
+ inputSchema: Record<string, unknown> | null;
22
+ inputProperties: Record<string, unknown>;
23
+ }
24
+ /**
25
+ * Run an Apify actor and get results
26
+ *
27
+ * @example
28
+ * // Scrape Google Maps reviews
29
+ * const reviews = await apify.run("compass/crawler-google-places", {
30
+ * searchStringsArray: ["restaurants in NYC"],
31
+ * maxReviews: 10
32
+ * });
33
+ */
34
+ export declare function run<T = unknown[]>(actor: string, input?: Record<string, unknown>, datasetListParams?: DatasetListParams): Promise<T>;
35
+ /**
36
+ * Search for Apify actors by keyword
37
+ *
38
+ * @example
39
+ * const actors = await apify.search("linkedin scraper");
40
+ */
41
+ export declare function search(query: string, limit?: number): Promise<{
42
+ actors: ActorSearchResult[];
43
+ total: number;
44
+ }>;
45
+ /**
46
+ * Get the input schema for an actor (to understand what params it accepts)
47
+ *
48
+ * @example
49
+ * const schema = await apify.getInputSchema("apify/web-scraper");
50
+ * console.log(schema.inputProperties);
51
+ */
52
+ export declare function getInputSchema(actor: string): Promise<ActorInputSchema>;
53
+ export declare const apify: {
54
+ run: typeof run;
55
+ search: typeof search;
56
+ getInputSchema: typeof getInputSchema;
57
+ };
package/dist/apify.js ADDED
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apify = void 0;
4
+ exports.run = run;
5
+ exports.search = search;
6
+ exports.getInputSchema = getInputSchema;
7
+ const queue_1 = require("./queue");
8
+ const API_URL = process.env.ORANGESLICE_API_URL
9
+ ? process.env.ORANGESLICE_API_URL.replace(/\?.*/, "") + "?functionId=apify"
10
+ : "https://orangeslice.ai/api/function?functionId=apify";
11
+ // Rate limit: 2 concurrent, 500ms between requests (Apify runs can be expensive)
12
+ const queue = (0, queue_1.createQueue)(2);
13
+ const rateLimiter = (0, queue_1.createRateLimiter)(500);
14
+ /**
15
+ * Helper to make POST request, handling redirects manually
16
+ */
17
+ async function fetchWithRedirect(url, body) {
18
+ let response = await fetch(url, {
19
+ method: "POST",
20
+ headers: { "Content-Type": "application/json" },
21
+ body,
22
+ redirect: "manual",
23
+ });
24
+ if (response.status >= 300 && response.status < 400) {
25
+ const location = response.headers.get("location");
26
+ if (location) {
27
+ response = await fetch(location, {
28
+ method: "POST",
29
+ headers: { "Content-Type": "application/json" },
30
+ body,
31
+ });
32
+ }
33
+ }
34
+ return response;
35
+ }
36
+ /**
37
+ * Run an Apify actor and get results
38
+ *
39
+ * @example
40
+ * // Scrape Google Maps reviews
41
+ * const reviews = await apify.run("compass/crawler-google-places", {
42
+ * searchStringsArray: ["restaurants in NYC"],
43
+ * maxReviews: 10
44
+ * });
45
+ */
46
+ async function run(actor, input = {}, datasetListParams = {}) {
47
+ return queue(async () => {
48
+ return rateLimiter(async () => {
49
+ const body = JSON.stringify({
50
+ operation: "runActor",
51
+ actor,
52
+ input,
53
+ datasetListParams,
54
+ });
55
+ const response = await fetchWithRedirect(API_URL, body);
56
+ if (!response.ok) {
57
+ const text = await response.text();
58
+ throw new Error(`Apify run failed: ${response.status} ${text}`);
59
+ }
60
+ const data = (await response.json());
61
+ if (data.error) {
62
+ throw new Error(`Apify error: ${data.error}`);
63
+ }
64
+ return data;
65
+ });
66
+ });
67
+ }
68
+ /**
69
+ * Search for Apify actors by keyword
70
+ *
71
+ * @example
72
+ * const actors = await apify.search("linkedin scraper");
73
+ */
74
+ async function search(query, limit = 10) {
75
+ return queue(async () => {
76
+ return rateLimiter(async () => {
77
+ const body = JSON.stringify({
78
+ operation: "searchActors",
79
+ query,
80
+ limit,
81
+ });
82
+ const response = await fetchWithRedirect(API_URL, body);
83
+ if (!response.ok) {
84
+ const text = await response.text();
85
+ throw new Error(`Apify search failed: ${response.status} ${text}`);
86
+ }
87
+ const data = (await response.json());
88
+ if (data.error) {
89
+ throw new Error(`Apify error: ${data.error}`);
90
+ }
91
+ return data;
92
+ });
93
+ });
94
+ }
95
+ /**
96
+ * Get the input schema for an actor (to understand what params it accepts)
97
+ *
98
+ * @example
99
+ * const schema = await apify.getInputSchema("apify/web-scraper");
100
+ * console.log(schema.inputProperties);
101
+ */
102
+ async function getInputSchema(actor) {
103
+ return queue(async () => {
104
+ return rateLimiter(async () => {
105
+ const body = JSON.stringify({
106
+ operation: "getInputSchema",
107
+ actor,
108
+ });
109
+ const response = await fetchWithRedirect(API_URL, body);
110
+ if (!response.ok) {
111
+ const text = await response.text();
112
+ throw new Error(`Apify getInputSchema failed: ${response.status} ${text}`);
113
+ }
114
+ const data = (await response.json());
115
+ if (data.error) {
116
+ throw new Error(`Apify error: ${data.error}`);
117
+ }
118
+ return data;
119
+ });
120
+ });
121
+ }
122
+ // Export as namespace
123
+ exports.apify = {
124
+ run,
125
+ search,
126
+ getInputSchema,
127
+ };
package/dist/cli.js CHANGED
@@ -42,7 +42,7 @@ const TARGET_DIR = path.join(process.cwd(), "orangeslice-docs");
42
42
  const AGENTS_MD = path.join(DOCS_DIR, "AGENTS.md");
43
43
  const ROOT_AGENTS_MD = path.join(process.cwd(), "AGENTS.md");
44
44
  async function main() {
45
- console.log("\n🍊 orangeslice - setting up sales agent for AI...\n");
45
+ console.log("\n🍊 orangeslice - setting up AI sales agent toolkit\n");
46
46
  // 1. Copy AGENTS.md to project root (for auto-detection by Claude Code, etc.)
47
47
  console.log("1. Installing AGENTS.md at project root...");
48
48
  if (fs.existsSync(AGENTS_MD)) {
@@ -50,7 +50,7 @@ async function main() {
50
50
  console.log(" ✓ AGENTS.md → ./AGENTS.md (auto-detected by AI agents)\n");
51
51
  }
52
52
  // 2. Copy full docs to orangeslice-docs/
53
- console.log("2. Copying detailed documentation...");
53
+ console.log("2. Copying tool documentation...");
54
54
  if (!fs.existsSync(TARGET_DIR)) {
55
55
  fs.mkdirSync(TARGET_DIR, { recursive: true });
56
56
  }
@@ -61,6 +61,13 @@ async function main() {
61
61
  fs.copyFileSync(src, dest);
62
62
  }
63
63
  console.log(` ✓ ${files.length} docs → ./orangeslice-docs/\n`);
64
+ console.log(" Docs created:");
65
+ console.log(" • AGENTS.md - Main overview + quick APIs");
66
+ console.log(" • b2b.md - LinkedIn database (1B+ profiles)");
67
+ console.log(" • serp.md - Google dorking cheatsheet");
68
+ console.log(" • browser.md - Playwright automation");
69
+ console.log(" • apify.md - Pre-built web scrapers");
70
+ console.log(" • strategies.md - Prospecting & enrichment patterns\n");
64
71
  // 3. Install package
65
72
  console.log("3. Installing orangeslice package...");
66
73
  try {
@@ -71,10 +78,14 @@ async function main() {
71
78
  }
72
79
  // 4. Done
73
80
  console.log("\n✅ Done! Your AI agent is now a sales research assistant.\n");
74
- console.log(" AGENTS.md is at your project root - Claude Code will auto-detect it.\n");
75
- console.log(" Your agent can now:\n");
76
- console.log(" • Query 1B+ LinkedIn profiles (orangeslice.b2b.sql)");
77
- console.log(" • Search Google (orangeslice.serp.search)");
78
- console.log(" • Scrape websites (orangeslice.firecrawl.scrape)\n");
81
+ console.log(" AGENTS.md at project root - Claude Code will auto-detect it.\n");
82
+ console.log(" Available tools:\n");
83
+ console.log(" • orangeslice.b2b.sql() - 1B+ LinkedIn profiles");
84
+ console.log(" • orangeslice.serp.search() - Google Search");
85
+ console.log(" • orangeslice.firecrawl.scrape() - Static web scraping");
86
+ console.log(" • orangeslice.browser.execute() - Playwright automation");
87
+ console.log(" • orangeslice.generateObject() - AI structured output");
88
+ console.log(" • orangeslice.apify.run() - Pre-built scrapers");
89
+ console.log(" • orangeslice.geo.parseAddress() - Geocoding\n");
79
90
  }
80
91
  main().catch(console.error);
@@ -0,0 +1,34 @@
1
+ export interface GenerateObjectOptions {
2
+ /** The prompt describing what to generate */
3
+ prompt: string;
4
+ /** JSON schema defining the output structure */
5
+ schema: Record<string, unknown>;
6
+ /** Model to use (default: "gpt-4o-mini") */
7
+ model?: string;
8
+ }
9
+ /**
10
+ * Generate a structured object using AI
11
+ *
12
+ * @example
13
+ * const result = await generateObject.generate({
14
+ * prompt: "Extract the company name and founding year from: Apple Inc was founded in 1976",
15
+ * schema: {
16
+ * type: "object",
17
+ * properties: {
18
+ * company: { type: "string" },
19
+ * year: { type: "number" }
20
+ * },
21
+ * required: ["company", "year"]
22
+ * }
23
+ * });
24
+ * // { company: "Apple Inc", year: 1976 }
25
+ */
26
+ export declare function generate<T = Record<string, unknown>>(options: GenerateObjectOptions): Promise<T>;
27
+ /**
28
+ * Convenience method for extracting data from text
29
+ */
30
+ export declare function extract<T = Record<string, unknown>>(text: string, schema: Record<string, unknown>, instructions?: string): Promise<T>;
31
+ export declare const generateObject: {
32
+ generate: typeof generate;
33
+ extract: typeof extract;
34
+ };
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateObject = void 0;
4
+ exports.generate = generate;
5
+ exports.extract = extract;
6
+ const queue_1 = require("./queue");
7
+ const API_URL = process.env.ORANGESLICE_API_URL
8
+ ? process.env.ORANGESLICE_API_URL.replace(/\?.*/, "") + "?functionId=generateObject"
9
+ : "https://orangeslice.ai/api/function?functionId=generateObject";
10
+ // Rate limit: 2 concurrent, 200ms between requests
11
+ const queue = (0, queue_1.createQueue)(2);
12
+ const rateLimiter = (0, queue_1.createRateLimiter)(200);
13
+ /**
14
+ * Helper to make POST request, handling redirects manually
15
+ */
16
+ async function fetchWithRedirect(url, body) {
17
+ let response = await fetch(url, {
18
+ method: "POST",
19
+ headers: { "Content-Type": "application/json" },
20
+ body,
21
+ redirect: "manual",
22
+ });
23
+ if (response.status >= 300 && response.status < 400) {
24
+ const location = response.headers.get("location");
25
+ if (location) {
26
+ response = await fetch(location, {
27
+ method: "POST",
28
+ headers: { "Content-Type": "application/json" },
29
+ body,
30
+ });
31
+ }
32
+ }
33
+ return response;
34
+ }
35
+ /**
36
+ * Generate a structured object using AI
37
+ *
38
+ * @example
39
+ * const result = await generateObject.generate({
40
+ * prompt: "Extract the company name and founding year from: Apple Inc was founded in 1976",
41
+ * schema: {
42
+ * type: "object",
43
+ * properties: {
44
+ * company: { type: "string" },
45
+ * year: { type: "number" }
46
+ * },
47
+ * required: ["company", "year"]
48
+ * }
49
+ * });
50
+ * // { company: "Apple Inc", year: 1976 }
51
+ */
52
+ async function generate(options) {
53
+ return queue(async () => {
54
+ return rateLimiter(async () => {
55
+ const body = JSON.stringify({
56
+ prompt: options.prompt,
57
+ schema: options.schema,
58
+ model: options.model,
59
+ });
60
+ const response = await fetchWithRedirect(API_URL, body);
61
+ if (!response.ok) {
62
+ const text = await response.text();
63
+ throw new Error(`generateObject request failed: ${response.status} ${text}`);
64
+ }
65
+ const data = (await response.json());
66
+ if (data.error) {
67
+ throw new Error(`generateObject error: ${data.error}`);
68
+ }
69
+ return data;
70
+ });
71
+ });
72
+ }
73
+ /**
74
+ * Convenience method for extracting data from text
75
+ */
76
+ async function extract(text, schema, instructions) {
77
+ const prompt = instructions
78
+ ? `${instructions}\n\nText:\n${text}`
79
+ : `Extract structured data from the following text:\n\n${text}`;
80
+ return generate({ prompt, schema });
81
+ }
82
+ // Export as namespace
83
+ exports.generateObject = {
84
+ generate,
85
+ extract,
86
+ };
package/dist/geo.d.ts ADDED
@@ -0,0 +1,50 @@
1
+ export interface ParsedAddress {
2
+ streetNumber: string;
3
+ route: string;
4
+ city: string;
5
+ state: string;
6
+ postalCode: string;
7
+ country: string;
8
+ lat: number;
9
+ lng: number;
10
+ }
11
+ /**
12
+ * Parse an address string into structured components using Google Maps Geocoding
13
+ *
14
+ * @example
15
+ * const parsed = await geo.parseAddress("1600 Amphitheatre Parkway, Mountain View, CA");
16
+ * // {
17
+ * // streetNumber: "1600",
18
+ * // route: "Amphitheatre Parkway",
19
+ * // city: "Mountain View",
20
+ * // state: "California",
21
+ * // postalCode: "94043",
22
+ * // country: "United States",
23
+ * // lat: 37.4224764,
24
+ * // lng: -122.0842499
25
+ * // }
26
+ */
27
+ export declare function parseAddress(address: string): Promise<ParsedAddress>;
28
+ /**
29
+ * Get coordinates (lat/lng) for an address
30
+ *
31
+ * @example
32
+ * const coords = await geo.geocode("Times Square, NYC");
33
+ * // { lat: 40.758896, lng: -73.985130 }
34
+ */
35
+ export declare function geocode(address: string): Promise<{
36
+ lat: number;
37
+ lng: number;
38
+ }>;
39
+ /**
40
+ * Get the city and state for an address
41
+ */
42
+ export declare function getCityState(address: string): Promise<{
43
+ city: string;
44
+ state: string;
45
+ }>;
46
+ export declare const geo: {
47
+ parseAddress: typeof parseAddress;
48
+ geocode: typeof geocode;
49
+ getCityState: typeof getCityState;
50
+ };
package/dist/geo.js ADDED
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.geo = void 0;
4
+ exports.parseAddress = parseAddress;
5
+ exports.geocode = geocode;
6
+ exports.getCityState = getCityState;
7
+ const queue_1 = require("./queue");
8
+ const API_URL = process.env.ORANGESLICE_API_URL
9
+ ? process.env.ORANGESLICE_API_URL.replace(/\?.*/, "") + "?functionId=geo"
10
+ : "https://orangeslice.ai/api/function?functionId=geo";
11
+ // Rate limit: 2 concurrent, 100ms between requests
12
+ const queue = (0, queue_1.createQueue)(2);
13
+ const rateLimiter = (0, queue_1.createRateLimiter)(100);
14
+ /**
15
+ * Helper to make POST request, handling redirects manually
16
+ */
17
+ async function fetchWithRedirect(url, body) {
18
+ let response = await fetch(url, {
19
+ method: "POST",
20
+ headers: { "Content-Type": "application/json" },
21
+ body,
22
+ redirect: "manual",
23
+ });
24
+ if (response.status >= 300 && response.status < 400) {
25
+ const location = response.headers.get("location");
26
+ if (location) {
27
+ response = await fetch(location, {
28
+ method: "POST",
29
+ headers: { "Content-Type": "application/json" },
30
+ body,
31
+ });
32
+ }
33
+ }
34
+ return response;
35
+ }
36
+ /**
37
+ * Parse an address string into structured components using Google Maps Geocoding
38
+ *
39
+ * @example
40
+ * const parsed = await geo.parseAddress("1600 Amphitheatre Parkway, Mountain View, CA");
41
+ * // {
42
+ * // streetNumber: "1600",
43
+ * // route: "Amphitheatre Parkway",
44
+ * // city: "Mountain View",
45
+ * // state: "California",
46
+ * // postalCode: "94043",
47
+ * // country: "United States",
48
+ * // lat: 37.4224764,
49
+ * // lng: -122.0842499
50
+ * // }
51
+ */
52
+ async function parseAddress(address) {
53
+ return queue(async () => {
54
+ return rateLimiter(async () => {
55
+ const body = JSON.stringify({ address });
56
+ const response = await fetchWithRedirect(API_URL, body);
57
+ if (!response.ok) {
58
+ const text = await response.text();
59
+ throw new Error(`Geo parseAddress failed: ${response.status} ${text}`);
60
+ }
61
+ const data = (await response.json());
62
+ if (data.error) {
63
+ throw new Error(`Geo error: ${data.error}`);
64
+ }
65
+ return data;
66
+ });
67
+ });
68
+ }
69
+ /**
70
+ * Get coordinates (lat/lng) for an address
71
+ *
72
+ * @example
73
+ * const coords = await geo.geocode("Times Square, NYC");
74
+ * // { lat: 40.758896, lng: -73.985130 }
75
+ */
76
+ async function geocode(address) {
77
+ const parsed = await parseAddress(address);
78
+ return { lat: parsed.lat, lng: parsed.lng };
79
+ }
80
+ /**
81
+ * Get the city and state for an address
82
+ */
83
+ async function getCityState(address) {
84
+ const parsed = await parseAddress(address);
85
+ return { city: parsed.city, state: parsed.state };
86
+ }
87
+ // Export as namespace
88
+ exports.geo = {
89
+ parseAddress,
90
+ geocode,
91
+ getCityState,
92
+ };
package/dist/index.d.ts CHANGED
@@ -2,7 +2,10 @@ import { b2b } from "./b2b";
2
2
  import { serp } from "./serp";
3
3
  import { firecrawl } from "./firecrawl";
4
4
  import { browser } from "./browser";
5
- export { b2b, serp, firecrawl, browser };
5
+ import { generateObject } from "./generateObject";
6
+ import { apify } from "./apify";
7
+ import { geo } from "./geo";
8
+ export { b2b, serp, firecrawl, browser, generateObject, apify, geo };
6
9
  /**
7
10
  * Main orangeslice namespace - AI sales agent toolkit
8
11
  *
@@ -15,15 +18,27 @@ export { b2b, serp, firecrawl, browser };
15
18
  * // Google Search
16
19
  * const results = await orangeslice.serp.search("best CRM software 2024");
17
20
  *
18
- * // Website Scraping (simple)
21
+ * // Website Scraping (static pages)
19
22
  * const page = await orangeslice.firecrawl.scrape("https://stripe.com/about");
20
23
  *
21
- * // Browser Automation (Playwright)
24
+ * // Browser Automation (dynamic pages, Playwright)
22
25
  * const data = await orangeslice.browser.execute(`
23
26
  * await page.goto("https://example.com", { waitUntil: 'domcontentloaded' });
24
27
  * return await page.evaluate(() => document.title);
25
28
  * `);
26
29
  *
30
+ * // AI Structured Output
31
+ * const extracted = await orangeslice.generateObject.generate({
32
+ * prompt: "Extract company info from: Apple was founded in 1976",
33
+ * schema: { type: "object", properties: { name: { type: "string" }, year: { type: "number" } } }
34
+ * });
35
+ *
36
+ * // Apify Actors (web scrapers)
37
+ * const reviews = await orangeslice.apify.run("compass/crawler-google-places", { searchStringsArray: ["cafes NYC"] });
38
+ *
39
+ * // Geocoding
40
+ * const location = await orangeslice.geo.parseAddress("1600 Amphitheatre Parkway, Mountain View, CA");
41
+ *
27
42
  * // All calls are automatically rate-limited and queued
28
43
  */
29
44
  export declare const orangeslice: {
@@ -46,5 +61,19 @@ export declare const orangeslice: {
46
61
  snapshot: typeof import("./browser").snapshot;
47
62
  text: typeof import("./browser").text;
48
63
  };
64
+ generateObject: {
65
+ generate: typeof import("./generateObject").generate;
66
+ extract: typeof import("./generateObject").extract;
67
+ };
68
+ apify: {
69
+ run: typeof import("./apify").run;
70
+ search: typeof import("./apify").search;
71
+ getInputSchema: typeof import("./apify").getInputSchema;
72
+ };
73
+ geo: {
74
+ parseAddress: typeof import("./geo").parseAddress;
75
+ geocode: typeof import("./geo").geocode;
76
+ getCityState: typeof import("./geo").getCityState;
77
+ };
49
78
  };
50
79
  export default orangeslice;
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.orangeslice = exports.browser = exports.firecrawl = exports.serp = exports.b2b = void 0;
3
+ exports.orangeslice = exports.geo = exports.apify = exports.generateObject = exports.browser = exports.firecrawl = exports.serp = exports.b2b = void 0;
4
4
  const b2b_1 = require("./b2b");
5
5
  Object.defineProperty(exports, "b2b", { enumerable: true, get: function () { return b2b_1.b2b; } });
6
6
  const serp_1 = require("./serp");
@@ -9,6 +9,12 @@ const firecrawl_1 = require("./firecrawl");
9
9
  Object.defineProperty(exports, "firecrawl", { enumerable: true, get: function () { return firecrawl_1.firecrawl; } });
10
10
  const browser_1 = require("./browser");
11
11
  Object.defineProperty(exports, "browser", { enumerable: true, get: function () { return browser_1.browser; } });
12
+ const generateObject_1 = require("./generateObject");
13
+ Object.defineProperty(exports, "generateObject", { enumerable: true, get: function () { return generateObject_1.generateObject; } });
14
+ const apify_1 = require("./apify");
15
+ Object.defineProperty(exports, "apify", { enumerable: true, get: function () { return apify_1.apify; } });
16
+ const geo_1 = require("./geo");
17
+ Object.defineProperty(exports, "geo", { enumerable: true, get: function () { return geo_1.geo; } });
12
18
  /**
13
19
  * Main orangeslice namespace - AI sales agent toolkit
14
20
  *
@@ -21,15 +27,27 @@ Object.defineProperty(exports, "browser", { enumerable: true, get: function () {
21
27
  * // Google Search
22
28
  * const results = await orangeslice.serp.search("best CRM software 2024");
23
29
  *
24
- * // Website Scraping (simple)
30
+ * // Website Scraping (static pages)
25
31
  * const page = await orangeslice.firecrawl.scrape("https://stripe.com/about");
26
32
  *
27
- * // Browser Automation (Playwright)
33
+ * // Browser Automation (dynamic pages, Playwright)
28
34
  * const data = await orangeslice.browser.execute(`
29
35
  * await page.goto("https://example.com", { waitUntil: 'domcontentloaded' });
30
36
  * return await page.evaluate(() => document.title);
31
37
  * `);
32
38
  *
39
+ * // AI Structured Output
40
+ * const extracted = await orangeslice.generateObject.generate({
41
+ * prompt: "Extract company info from: Apple was founded in 1976",
42
+ * schema: { type: "object", properties: { name: { type: "string" }, year: { type: "number" } } }
43
+ * });
44
+ *
45
+ * // Apify Actors (web scrapers)
46
+ * const reviews = await orangeslice.apify.run("compass/crawler-google-places", { searchStringsArray: ["cafes NYC"] });
47
+ *
48
+ * // Geocoding
49
+ * const location = await orangeslice.geo.parseAddress("1600 Amphitheatre Parkway, Mountain View, CA");
50
+ *
33
51
  * // All calls are automatically rate-limited and queued
34
52
  */
35
53
  exports.orangeslice = {
@@ -37,5 +55,8 @@ exports.orangeslice = {
37
55
  serp: serp_1.serp,
38
56
  firecrawl: firecrawl_1.firecrawl,
39
57
  browser: browser_1.browser,
58
+ generateObject: generateObject_1.generateObject,
59
+ apify: apify_1.apify,
60
+ geo: geo_1.geo,
40
61
  };
41
62
  exports.default = exports.orangeslice;