@squadbase/vite-server 0.1.17-dev.a107052 → 0.1.17
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/cli/index.js +3266 -730
- package/dist/connectors/airtable-oauth.js +48 -8
- package/dist/connectors/airtable.js +44 -8
- package/dist/connectors/amplitude.js +8 -8
- package/dist/connectors/anthropic.js +2 -2
- package/dist/connectors/asana.js +37 -10
- package/dist/connectors/attio.js +30 -13
- package/dist/connectors/aws-billing.js +8 -8
- package/dist/connectors/azure-sql.js +31 -7
- package/dist/connectors/backlog-api-key.js +40 -15
- package/dist/connectors/clickup.js +50 -10
- package/dist/connectors/cosmosdb.js +12 -12
- package/dist/connectors/customerio.js +8 -8
- package/dist/connectors/dbt.js +686 -25
- package/dist/connectors/freshdesk.js +82 -8
- package/dist/connectors/freshsales.js +8 -8
- package/dist/connectors/freshservice.js +8 -8
- package/dist/connectors/gamma.js +15 -15
- package/dist/connectors/gemini.js +2 -2
- package/dist/connectors/github.js +12 -12
- package/dist/connectors/gmail-oauth.js +10 -10
- package/dist/connectors/gmail.js +4 -4
- package/dist/connectors/google-ads.js +8 -8
- package/dist/connectors/google-analytics-oauth.js +152 -25
- package/dist/connectors/google-analytics.js +475 -95
- package/dist/connectors/google-audit-log.js +4 -4
- package/dist/connectors/google-calendar-oauth.js +61 -15
- package/dist/connectors/google-calendar.js +61 -11
- package/dist/connectors/google-docs.js +10 -10
- package/dist/connectors/google-drive.js +32 -10
- package/dist/connectors/google-search-console-oauth.js +126 -17
- package/dist/connectors/google-sheets.js +6 -6
- package/dist/connectors/google-slides.js +10 -10
- package/dist/connectors/grafana.js +45 -10
- package/dist/connectors/hubspot-oauth.js +41 -9
- package/dist/connectors/hubspot.js +25 -9
- package/dist/connectors/influxdb.js +8 -8
- package/dist/connectors/intercom-oauth.js +72 -12
- package/dist/connectors/intercom.js +12 -12
- package/dist/connectors/jdbc.js +6 -6
- package/dist/connectors/jira-api-key.js +68 -11
- package/dist/connectors/kintone-api-token.js +66 -18
- package/dist/connectors/kintone.js +54 -11
- package/dist/connectors/linear.js +54 -12
- package/dist/connectors/linkedin-ads.js +41 -14
- package/dist/connectors/mailchimp-oauth.js +6 -6
- package/dist/connectors/mailchimp.js +6 -6
- package/dist/connectors/meta-ads-oauth.js +33 -14
- package/dist/connectors/meta-ads.js +35 -14
- package/dist/connectors/mixpanel.js +8 -8
- package/dist/connectors/monday.js +9 -9
- package/dist/connectors/mongodb.js +8 -8
- package/dist/connectors/notion-oauth.js +60 -11
- package/dist/connectors/notion.js +60 -11
- package/dist/connectors/openai.js +2 -2
- package/dist/connectors/oracle.js +23 -7
- package/dist/connectors/outlook-oauth.js +20 -20
- package/dist/connectors/powerbi-oauth.js +12 -12
- package/dist/connectors/salesforce.js +42 -9
- package/dist/connectors/semrush.js +6 -6
- package/dist/connectors/sentry.js +36 -10
- package/dist/connectors/shopify-oauth.js +43 -10
- package/dist/connectors/shopify.js +8 -8
- package/dist/connectors/sqlserver.js +31 -7
- package/dist/connectors/stripe-api-key.js +66 -15
- package/dist/connectors/stripe-oauth.js +70 -19
- package/dist/connectors/supabase.js +22 -5
- package/dist/connectors/tableau.js +14 -14
- package/dist/connectors/tiktok-ads.js +37 -16
- package/dist/connectors/wix-store.js +8 -8
- package/dist/connectors/zendesk-oauth.js +55 -12
- package/dist/connectors/zendesk.js +12 -12
- package/dist/index.js +3284 -728
- package/dist/main.js +3284 -728
- package/dist/vite-plugin.js +3264 -728
- package/package.json +1 -1
|
@@ -268,7 +268,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
268
268
|
/**
|
|
269
269
|
* Create tools for connections that belong to this connector.
|
|
270
270
|
* Filters connections by connectorKey internally.
|
|
271
|
-
* Returns tools keyed as
|
|
271
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
272
272
|
*/
|
|
273
273
|
createTools(connections, config, opts) {
|
|
274
274
|
const myConnections = connections.filter(
|
|
@@ -278,7 +278,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
278
278
|
for (const t of Object.values(this.tools)) {
|
|
279
279
|
const tool = t.createTool(myConnections, config);
|
|
280
280
|
const originalToModelOutput = tool.toModelOutput;
|
|
281
|
-
result[
|
|
281
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
282
282
|
...tool,
|
|
283
283
|
toModelOutput: async (options) => {
|
|
284
284
|
if (!originalToModelOutput) {
|
|
@@ -408,15 +408,15 @@ var AUTH_TYPES = {
|
|
|
408
408
|
// ../connectors/src/connectors/linear/setup.ts
|
|
409
409
|
var linearOnboarding = new ConnectorOnboarding({
|
|
410
410
|
dataOverviewInstructions: {
|
|
411
|
-
en: `1. Call
|
|
412
|
-
2. Call
|
|
413
|
-
3. Call
|
|
414
|
-
4. Call
|
|
411
|
+
en: `1. Call connector_linear_request with query \`{ teams { nodes { id name } } }\` to list all teams
|
|
412
|
+
2. Call connector_linear_request with query \`{ workflowStates { nodes { id name type } } }\` to list workflow states
|
|
413
|
+
3. Call connector_linear_request with query \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` to sample recent issues
|
|
414
|
+
4. Call connector_linear_request with query \`{ projects(first: 5) { nodes { id name state } } }\` to list projects
|
|
415
415
|
5. Explore other resources (cycles, labels, users) as needed`,
|
|
416
|
-
ja: `1.
|
|
417
|
-
2.
|
|
418
|
-
3.
|
|
419
|
-
4.
|
|
416
|
+
ja: `1. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ teams { nodes { id name } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30C1\u30FC\u30E0\u4E00\u89A7\u3092\u53D6\u5F97
|
|
417
|
+
2. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ workflowStates { nodes { id name type } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u4E00\u89A7\u3092\u53D6\u5F97
|
|
418
|
+
3. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306EIssue\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
|
|
419
|
+
4. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ projects(first: 5) { nodes { id name state } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
|
|
420
420
|
5. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30EA\u30BD\u30FC\u30B9\uFF08cycles\u3001labels\u3001users\uFF09\u3092\u63A2\u7D22`
|
|
421
421
|
}
|
|
422
422
|
});
|
|
@@ -473,6 +473,35 @@ async function getTeamDetail(params, teamId) {
|
|
|
473
473
|
);
|
|
474
474
|
return data.team ?? null;
|
|
475
475
|
}
|
|
476
|
+
async function getIssueBreakdown(params, teamId) {
|
|
477
|
+
try {
|
|
478
|
+
const data = await gqlFetch(
|
|
479
|
+
params,
|
|
480
|
+
`query($id: String!) {
|
|
481
|
+
team(id: $id) {
|
|
482
|
+
issues(first: 250) { nodes { state { name type } } }
|
|
483
|
+
}
|
|
484
|
+
}`,
|
|
485
|
+
{ id: teamId }
|
|
486
|
+
);
|
|
487
|
+
const nodes = data.team?.issues?.nodes ?? [];
|
|
488
|
+
const counts = /* @__PURE__ */ new Map();
|
|
489
|
+
for (const n of nodes) {
|
|
490
|
+
const key = `${n.state?.name ?? "Unknown"}|${n.state?.type ?? "unknown"}`;
|
|
491
|
+
const existing = counts.get(key);
|
|
492
|
+
if (existing) existing.count++;
|
|
493
|
+
else
|
|
494
|
+
counts.set(key, {
|
|
495
|
+
stateName: n.state?.name ?? "Unknown",
|
|
496
|
+
stateType: n.state?.type ?? "unknown",
|
|
497
|
+
count: 1
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
return { total: nodes.length, byState: Array.from(counts.values()) };
|
|
501
|
+
} catch {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
476
505
|
var linearSetupFlow = {
|
|
477
506
|
initialState: () => ({}),
|
|
478
507
|
steps: [
|
|
@@ -529,6 +558,19 @@ var linearSetupFlow = {
|
|
|
529
558
|
sections.push(` - ${s.name} (${s.type})`);
|
|
530
559
|
}
|
|
531
560
|
sections.push("");
|
|
561
|
+
const breakdown = await getIssueBreakdown(rt.params, teamId);
|
|
562
|
+
if (breakdown && breakdown.byState.length > 0) {
|
|
563
|
+
sections.push(
|
|
564
|
+
`#### Issues (${breakdown.total}${breakdown.total === 250 ? "+" : ""})`,
|
|
565
|
+
""
|
|
566
|
+
);
|
|
567
|
+
sections.push("| State | Type | Count |");
|
|
568
|
+
sections.push("|-------|------|-------|");
|
|
569
|
+
for (const b of breakdown.byState) {
|
|
570
|
+
sections.push(`| ${b.stateName} | ${b.stateType} | ${b.count} |`);
|
|
571
|
+
}
|
|
572
|
+
sections.push("");
|
|
573
|
+
}
|
|
532
574
|
}
|
|
533
575
|
return sections.join("\n");
|
|
534
576
|
}
|
|
@@ -639,7 +681,7 @@ var linearConnector = new ConnectorPlugin({
|
|
|
639
681
|
systemPrompt: {
|
|
640
682
|
en: `### Tools
|
|
641
683
|
|
|
642
|
-
- \`
|
|
684
|
+
- \`connector_linear_request\`: The only way to call the Linear GraphQL API. Use it to query and mutate all Linear resources: issues, projects, teams, cycles, users, labels, workflow states, and comments. Authentication is configured automatically. Linear's API is GraphQL-only \u2014 send a query string and optional variables. Pagination uses Relay-style cursors with \`first\`/\`after\` and \`last\`/\`before\` arguments. Archived resources are hidden by default; pass \`includeArchived: true\` to include them.
|
|
643
685
|
|
|
644
686
|
### Business Logic
|
|
645
687
|
|
|
@@ -700,7 +742,7 @@ export default async function handler(c: Context) {
|
|
|
700
742
|
- \`mutation { commentCreate(input: { issueId: "...", body: "..." }) { success comment { id body } } }\` \u2014 add comment`,
|
|
701
743
|
ja: `### \u30C4\u30FC\u30EB
|
|
702
744
|
|
|
703
|
-
- \`
|
|
745
|
+
- \`connector_linear_request\`: Linear GraphQL API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002Issue\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u30C1\u30FC\u30E0\u3001\u30B5\u30A4\u30AF\u30EB\u3001\u30E6\u30FC\u30B6\u30FC\u3001\u30E9\u30D9\u30EB\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u3001\u30B3\u30E1\u30F3\u30C8\u306A\u3069\u3059\u3079\u3066\u306ELinear\u30EA\u30BD\u30FC\u30B9\u306E\u30AF\u30A8\u30EA\u3068\u30DF\u30E5\u30FC\u30C6\u30FC\u30B7\u30E7\u30F3\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Linear\u306EAPI\u306FGraphQL\u306E\u307F\u3067\u3059\u3002\u30AF\u30A8\u30EA\u6587\u5B57\u5217\u3068\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5909\u6570\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u306FRelay\u5F62\u5F0F\u306E\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u3067\u3001\`first\`/\`after\`\u304A\u3088\u3073\`last\`/\`before\`\u5F15\u6570\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30EA\u30BD\u30FC\u30B9\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u975E\u8868\u793A\u3067\u3059\u3002\`includeArchived: true\`\u3092\u6E21\u3059\u3068\u542B\u3081\u3089\u308C\u307E\u3059\u3002
|
|
704
746
|
|
|
705
747
|
### Business Logic
|
|
706
748
|
|
|
@@ -171,7 +171,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
171
171
|
/**
|
|
172
172
|
* Create tools for connections that belong to this connector.
|
|
173
173
|
* Filters connections by connectorKey internally.
|
|
174
|
-
* Returns tools keyed as
|
|
174
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
175
175
|
*/
|
|
176
176
|
createTools(connections, config, opts) {
|
|
177
177
|
const myConnections = connections.filter(
|
|
@@ -181,7 +181,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
181
181
|
for (const t of Object.values(this.tools)) {
|
|
182
182
|
const tool = t.createTool(myConnections, config);
|
|
183
183
|
const originalToModelOutput = tool.toModelOutput;
|
|
184
|
-
result[
|
|
184
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
185
185
|
...tool,
|
|
186
186
|
toModelOutput: async (options) => {
|
|
187
187
|
if (!originalToModelOutput) {
|
|
@@ -453,11 +453,11 @@ var linkedinAdsOnboarding = new ConnectorOnboarding({
|
|
|
453
453
|
- Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
|
|
454
454
|
},
|
|
455
455
|
dataOverviewInstructions: {
|
|
456
|
-
en: `1. Call
|
|
457
|
-
2. Call
|
|
456
|
+
en: `1. Call connector_linkedin-ads_request with GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 to explore campaigns
|
|
457
|
+
2. Call connector_linkedin-ads_request with GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues to check recent performance
|
|
458
458
|
3. Explore campaign groups and creatives as needed to understand the data structure`,
|
|
459
|
-
ja: `1.
|
|
460
|
-
2.
|
|
459
|
+
ja: `1. connector_linkedin-ads_request \u3067 GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
|
|
460
|
+
2. connector_linkedin-ads_request \u3067 GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
|
|
461
461
|
3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30B0\u30EB\u30FC\u30D7\u3084\u30AF\u30EA\u30A8\u30A4\u30C6\u30A3\u30D6\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
|
|
462
462
|
}
|
|
463
463
|
});
|
|
@@ -502,6 +502,24 @@ async function listAdAccounts(proxyFetch) {
|
|
|
502
502
|
const data = await res.json();
|
|
503
503
|
return data.elements ?? [];
|
|
504
504
|
}
|
|
505
|
+
async function fetchCampaignCount(proxyFetch, accountId) {
|
|
506
|
+
try {
|
|
507
|
+
const account = encodeURIComponent(
|
|
508
|
+
`urn:li:sponsoredAccount:${accountId}`
|
|
509
|
+
);
|
|
510
|
+
const url = `${BASE_URL3}/adCampaigns?q=search&search.account.values[0]=${account}&count=1`;
|
|
511
|
+
const res = await proxyFetch(url, {
|
|
512
|
+
method: "GET",
|
|
513
|
+
headers: defaultHeaders()
|
|
514
|
+
});
|
|
515
|
+
if (!res.ok) return null;
|
|
516
|
+
const data = await res.json();
|
|
517
|
+
const total = data.paging?.total;
|
|
518
|
+
return typeof total === "number" ? total : null;
|
|
519
|
+
} catch {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
505
523
|
var linkedinAdsSetupFlow = {
|
|
506
524
|
initialState: () => ({}),
|
|
507
525
|
steps: [
|
|
@@ -549,16 +567,25 @@ var linkedinAdsSetupFlow = {
|
|
|
549
567
|
sections.push("_No ad accounts selected._", "");
|
|
550
568
|
return sections.join("\n");
|
|
551
569
|
}
|
|
552
|
-
sections.push(
|
|
553
|
-
|
|
554
|
-
|
|
570
|
+
sections.push(
|
|
571
|
+
"| Ad Account ID | Name | Currency | Type | Status | Campaigns |"
|
|
572
|
+
);
|
|
573
|
+
sections.push(
|
|
574
|
+
"|---------------|------|----------|------|--------|-----------|"
|
|
575
|
+
);
|
|
576
|
+
const campaignCounts = await Promise.all(
|
|
577
|
+
targetIds.map((id) => fetchCampaignCount(rt.config.proxyFetch, id))
|
|
578
|
+
);
|
|
579
|
+
for (let i = 0; i < targetIds.length; i++) {
|
|
580
|
+
const id = targetIds[i];
|
|
555
581
|
const account = byId.get(id);
|
|
556
582
|
const name = (account?.name ?? "-").replace(/\|/g, "\\|");
|
|
557
583
|
const currency = account?.currency ?? "-";
|
|
558
584
|
const type = account?.type ?? "-";
|
|
559
585
|
const status = account?.status ?? "-";
|
|
586
|
+
const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
|
|
560
587
|
sections.push(
|
|
561
|
-
`| ${id} | ${name} | ${currency} | ${type} | ${status} |`
|
|
588
|
+
`| ${id} | ${name} | ${currency} | ${type} | ${status} | ${campaigns} |`
|
|
562
589
|
);
|
|
563
590
|
}
|
|
564
591
|
sections.push("");
|
|
@@ -726,8 +753,8 @@ var linkedinAdsConnector = new ConnectorPlugin({
|
|
|
726
753
|
systemPrompt: {
|
|
727
754
|
en: `### Tools
|
|
728
755
|
|
|
729
|
-
- \`
|
|
730
|
-
- \`
|
|
756
|
+
- \`connector_linkedin-ads_request\`: Send authenticated requests to the LinkedIn Marketing API (REST). The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy. Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.
|
|
757
|
+
- \`connector_linkedin-ads_listAdAccounts\`: List accessible LinkedIn ad accounts. Use this during setup to discover available accounts.
|
|
731
758
|
|
|
732
759
|
### LinkedIn Marketing API Reference
|
|
733
760
|
|
|
@@ -819,8 +846,8 @@ const data = await res.json();
|
|
|
819
846
|
\`\`\``,
|
|
820
847
|
ja: `### \u30C4\u30FC\u30EB
|
|
821
848
|
|
|
822
|
-
- \`
|
|
823
|
-
- \`
|
|
849
|
+
- \`connector_linkedin-ads_request\`: LinkedIn Marketing API\uFF08REST\uFF09\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u5FC5\u9808\u30D8\u30C3\u30C0\u30FC\uFF08LinkedIn-Version\u3001X-Restli-Protocol-Version\uFF09\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
850
|
+
- \`connector_linkedin-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306ALinkedIn\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
824
851
|
|
|
825
852
|
### LinkedIn Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
826
853
|
|
|
@@ -177,7 +177,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
177
177
|
/**
|
|
178
178
|
* Create tools for connections that belong to this connector.
|
|
179
179
|
* Filters connections by connectorKey internally.
|
|
180
|
-
* Returns tools keyed as
|
|
180
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
181
181
|
*/
|
|
182
182
|
createTools(connections, config, opts) {
|
|
183
183
|
const myConnections = connections.filter(
|
|
@@ -187,7 +187,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
187
187
|
for (const t of Object.values(this.tools)) {
|
|
188
188
|
const tool = t.createTool(myConnections, config);
|
|
189
189
|
const originalToModelOutput = tool.toModelOutput;
|
|
190
|
-
result[
|
|
190
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
191
191
|
...tool,
|
|
192
192
|
toModelOutput: async (options) => {
|
|
193
193
|
if (!originalToModelOutput) {
|
|
@@ -317,11 +317,11 @@ var AUTH_TYPES = {
|
|
|
317
317
|
// ../connectors/src/connectors/mailchimp-oauth/setup.ts
|
|
318
318
|
var mailchimpOauthOnboarding = new ConnectorOnboarding({
|
|
319
319
|
dataOverviewInstructions: {
|
|
320
|
-
en: `1. Call
|
|
320
|
+
en: `1. Call connector_mailchimp-oauth_request with GET /lists to list all audiences
|
|
321
321
|
2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
|
|
322
322
|
3. Call GET /campaigns?count=5 to list recent campaigns
|
|
323
323
|
4. Call GET /reports?count=5 to view campaign reports`,
|
|
324
|
-
ja: `1.
|
|
324
|
+
ja: `1. connector_mailchimp-oauth_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
|
|
325
325
|
2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
|
|
326
326
|
3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
|
|
327
327
|
4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
|
|
@@ -576,7 +576,7 @@ var mailchimpOauthConnector = new ConnectorPlugin({
|
|
|
576
576
|
systemPrompt: {
|
|
577
577
|
en: `### Tools
|
|
578
578
|
|
|
579
|
-
- \`
|
|
579
|
+
- \`connector_mailchimp-oauth_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication is configured automatically via OAuth.
|
|
580
580
|
|
|
581
581
|
### Mailchimp Marketing API v3 Reference
|
|
582
582
|
|
|
@@ -634,7 +634,7 @@ const data = await res.json();
|
|
|
634
634
|
\`\`\``,
|
|
635
635
|
ja: `### \u30C4\u30FC\u30EB
|
|
636
636
|
|
|
637
|
-
- \`
|
|
637
|
+
- \`connector_mailchimp-oauth_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
638
638
|
|
|
639
639
|
### Mailchimp Marketing API v3 \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
640
640
|
|
|
@@ -282,7 +282,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
282
282
|
/**
|
|
283
283
|
* Create tools for connections that belong to this connector.
|
|
284
284
|
* Filters connections by connectorKey internally.
|
|
285
|
-
* Returns tools keyed as
|
|
285
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
286
286
|
*/
|
|
287
287
|
createTools(connections, config, opts) {
|
|
288
288
|
const myConnections = connections.filter(
|
|
@@ -292,7 +292,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
292
292
|
for (const t of Object.values(this.tools)) {
|
|
293
293
|
const tool = t.createTool(myConnections, config);
|
|
294
294
|
const originalToModelOutput = tool.toModelOutput;
|
|
295
|
-
result[
|
|
295
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
296
296
|
...tool,
|
|
297
297
|
toModelOutput: async (options) => {
|
|
298
298
|
if (!originalToModelOutput) {
|
|
@@ -422,11 +422,11 @@ var AUTH_TYPES = {
|
|
|
422
422
|
// ../connectors/src/connectors/mailchimp/setup.ts
|
|
423
423
|
var mailchimpOnboarding = new ConnectorOnboarding({
|
|
424
424
|
dataOverviewInstructions: {
|
|
425
|
-
en: `1. Call
|
|
425
|
+
en: `1. Call connector_mailchimp_request with GET /lists to list all audiences
|
|
426
426
|
2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
|
|
427
427
|
3. Call GET /campaigns?count=5 to list recent campaigns
|
|
428
428
|
4. Call GET /reports?count=5 to view campaign reports`,
|
|
429
|
-
ja: `1.
|
|
429
|
+
ja: `1. connector_mailchimp_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
|
|
430
430
|
2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
|
|
431
431
|
3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
|
|
432
432
|
4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
|
|
@@ -647,7 +647,7 @@ var mailchimpConnector = new ConnectorPlugin({
|
|
|
647
647
|
systemPrompt: {
|
|
648
648
|
en: `### Tools
|
|
649
649
|
|
|
650
|
-
- \`
|
|
650
|
+
- \`connector_mailchimp_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication (Basic Auth with API key) is configured automatically. The datacenter is extracted from the API key suffix.
|
|
651
651
|
|
|
652
652
|
### Business Logic
|
|
653
653
|
|
|
@@ -744,7 +744,7 @@ export default async function handler(c: Context) {
|
|
|
744
744
|
- Errors return \`type\`, \`title\`, \`status\`, \`detail\`, and \`instance\` fields`,
|
|
745
745
|
ja: `### \u30C4\u30FC\u30EB
|
|
746
746
|
|
|
747
|
-
- \`
|
|
747
|
+
- \`connector_mailchimp_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u306B\u3088\u308BBasic Auth\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30C7\u30FC\u30BF\u30BB\u30F3\u30BF\u30FC\u306FAPI\u30AD\u30FC\u306E\u30B5\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u81EA\u52D5\u691C\u51FA\u3055\u308C\u307E\u3059\u3002
|
|
748
748
|
|
|
749
749
|
### Business Logic
|
|
750
750
|
|
|
@@ -171,7 +171,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
171
171
|
/**
|
|
172
172
|
* Create tools for connections that belong to this connector.
|
|
173
173
|
* Filters connections by connectorKey internally.
|
|
174
|
-
* Returns tools keyed as
|
|
174
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
175
175
|
*/
|
|
176
176
|
createTools(connections, config, opts) {
|
|
177
177
|
const myConnections = connections.filter(
|
|
@@ -181,7 +181,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
181
181
|
for (const t of Object.values(this.tools)) {
|
|
182
182
|
const tool = t.createTool(myConnections, config);
|
|
183
183
|
const originalToModelOutput = tool.toModelOutput;
|
|
184
|
-
result[
|
|
184
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
185
185
|
...tool,
|
|
186
186
|
toModelOutput: async (options) => {
|
|
187
187
|
if (!originalToModelOutput) {
|
|
@@ -448,11 +448,11 @@ var metaAdsOauthOnboarding = new ConnectorOnboarding({
|
|
|
448
448
|
- Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
|
|
449
449
|
},
|
|
450
450
|
dataOverviewInstructions: {
|
|
451
|
-
en: `1. Call
|
|
452
|
-
2. Call
|
|
451
|
+
en: `1. Call connector_meta-ads-oauth_request with GET act_{adAccountId}/campaigns?fields=id,name,status,objective to explore campaign data
|
|
452
|
+
2. Call connector_meta-ads-oauth_request with GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d to check recent performance
|
|
453
453
|
3. Explore ad sets and ads as needed to understand the data structure`,
|
|
454
|
-
ja: `1.
|
|
455
|
-
2.
|
|
454
|
+
ja: `1. connector_meta-ads-oauth_request \u3067 GET act_{adAccountId}/campaigns?fields=id,name,status,objective \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
|
|
455
|
+
2. connector_meta-ads-oauth_request \u3067 GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
|
|
456
456
|
3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u5E83\u544A\u30BB\u30C3\u30C8\u3084\u5E83\u544A\u30C7\u30FC\u30BF\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
|
|
457
457
|
}
|
|
458
458
|
});
|
|
@@ -503,6 +503,18 @@ async function listAdAccounts(proxyFetch) {
|
|
|
503
503
|
const data = await res.json();
|
|
504
504
|
return data.data ?? [];
|
|
505
505
|
}
|
|
506
|
+
async function fetchCampaignCount(proxyFetch, accountId) {
|
|
507
|
+
try {
|
|
508
|
+
const url = `${BASE_URL3}/act_${encodeURIComponent(accountId)}/campaigns?summary=total_count&limit=0`;
|
|
509
|
+
const res = await proxyFetch(url, { method: "GET" });
|
|
510
|
+
if (!res.ok) return null;
|
|
511
|
+
const data = await res.json();
|
|
512
|
+
const total = data.summary?.total_count;
|
|
513
|
+
return typeof total === "number" ? total : null;
|
|
514
|
+
} catch {
|
|
515
|
+
return null;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
506
518
|
function bareAdAccountId(account) {
|
|
507
519
|
if (account.account_id) return account.account_id;
|
|
508
520
|
return (account.id ?? "").replace(/^act_/, "");
|
|
@@ -554,14 +566,21 @@ var metaAdsOauthSetupFlow = {
|
|
|
554
566
|
sections.push("_No ad accounts selected._", "");
|
|
555
567
|
return sections.join("\n");
|
|
556
568
|
}
|
|
557
|
-
sections.push("| Ad Account ID | Name | Currency | Status |");
|
|
558
|
-
sections.push("
|
|
559
|
-
|
|
569
|
+
sections.push("| Ad Account ID | Name | Currency | Status | Campaigns |");
|
|
570
|
+
sections.push("|---------------|------|----------|--------|-----------|");
|
|
571
|
+
const campaignCounts = await Promise.all(
|
|
572
|
+
targetIds.map((id) => fetchCampaignCount(rt.config.proxyFetch, id))
|
|
573
|
+
);
|
|
574
|
+
for (let i = 0; i < targetIds.length; i++) {
|
|
575
|
+
const id = targetIds[i];
|
|
560
576
|
const account = byId.get(id);
|
|
561
577
|
const name = (account?.name ?? "-").replace(/\|/g, "\\|");
|
|
562
578
|
const currency = account?.currency ?? "-";
|
|
563
579
|
const status = statusLabel(account?.account_status);
|
|
564
|
-
|
|
580
|
+
const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
|
|
581
|
+
sections.push(
|
|
582
|
+
`| ${id} | ${name} | ${currency} | ${status} | ${campaigns} |`
|
|
583
|
+
);
|
|
565
584
|
}
|
|
566
585
|
sections.push("");
|
|
567
586
|
return sections.join("\n");
|
|
@@ -716,8 +735,8 @@ var metaAdsOauthConnector = new ConnectorPlugin({
|
|
|
716
735
|
systemPrompt: {
|
|
717
736
|
en: `### Tools
|
|
718
737
|
|
|
719
|
-
- \`
|
|
720
|
-
- \`
|
|
738
|
+
- \`connector_meta-ads-oauth_request\`: Send authenticated requests to the Meta Marketing API v21.0. The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy.
|
|
739
|
+
- \`connector_meta-ads-oauth_listAdAccounts\`: List accessible Meta ad accounts. Use this during setup to discover available accounts.
|
|
721
740
|
|
|
722
741
|
### Meta Marketing API Reference
|
|
723
742
|
|
|
@@ -773,8 +792,8 @@ const data = await res.json();
|
|
|
773
792
|
\`\`\``,
|
|
774
793
|
ja: `### \u30C4\u30FC\u30EB
|
|
775
794
|
|
|
776
|
-
- \`
|
|
777
|
-
- \`
|
|
795
|
+
- \`connector_meta-ads-oauth_request\`: Meta Marketing API v21.0\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002
|
|
796
|
+
- \`connector_meta-ads-oauth_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AMeta\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
778
797
|
|
|
779
798
|
### Meta Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
780
799
|
|
|
@@ -242,7 +242,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
242
242
|
/**
|
|
243
243
|
* Create tools for connections that belong to this connector.
|
|
244
244
|
* Filters connections by connectorKey internally.
|
|
245
|
-
* Returns tools keyed as
|
|
245
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
246
246
|
*/
|
|
247
247
|
createTools(connections, config, opts) {
|
|
248
248
|
const myConnections = connections.filter(
|
|
@@ -252,7 +252,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
252
252
|
for (const t of Object.values(this.tools)) {
|
|
253
253
|
const tool = t.createTool(myConnections, config);
|
|
254
254
|
const originalToModelOutput = tool.toModelOutput;
|
|
255
|
-
result[
|
|
255
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
256
256
|
...tool,
|
|
257
257
|
toModelOutput: async (options) => {
|
|
258
258
|
if (!originalToModelOutput) {
|
|
@@ -480,11 +480,11 @@ var metaAdsOnboarding = new ConnectorOnboarding({
|
|
|
480
480
|
- Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
|
|
481
481
|
},
|
|
482
482
|
dataOverviewInstructions: {
|
|
483
|
-
en: `1. Call
|
|
484
|
-
2. Call
|
|
483
|
+
en: `1. Call connector_meta-ads_request with GET act_{adAccountId}/campaigns?fields=id,name,status,objective to explore campaign data
|
|
484
|
+
2. Call connector_meta-ads_request with GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d to check recent performance
|
|
485
485
|
3. Explore ad sets and ads as needed to understand the data structure`,
|
|
486
|
-
ja: `1.
|
|
487
|
-
2.
|
|
486
|
+
ja: `1. connector_meta-ads_request \u3067 GET act_{adAccountId}/campaigns?fields=id,name,status,objective \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
|
|
487
|
+
2. connector_meta-ads_request \u3067 GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
|
|
488
488
|
3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u5E83\u544A\u30BB\u30C3\u30C8\u3084\u5E83\u544A\u30C7\u30FC\u30BF\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
|
|
489
489
|
}
|
|
490
490
|
});
|
|
@@ -532,6 +532,20 @@ async function listAdAccounts(params) {
|
|
|
532
532
|
const data = await res.json();
|
|
533
533
|
return data.data ?? [];
|
|
534
534
|
}
|
|
535
|
+
async function fetchCampaignCount(params, accountId) {
|
|
536
|
+
try {
|
|
537
|
+
const res = await apiFetch(
|
|
538
|
+
params,
|
|
539
|
+
`/act_${encodeURIComponent(accountId)}/campaigns?summary=total_count&limit=0`
|
|
540
|
+
);
|
|
541
|
+
if (!res.ok) return null;
|
|
542
|
+
const data = await res.json();
|
|
543
|
+
const total = data.summary?.total_count;
|
|
544
|
+
return typeof total === "number" ? total : null;
|
|
545
|
+
} catch {
|
|
546
|
+
return null;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
535
549
|
function bareAdAccountId(account) {
|
|
536
550
|
if (account.account_id) return account.account_id;
|
|
537
551
|
return (account.id ?? "").replace(/^act_/, "");
|
|
@@ -583,14 +597,21 @@ var metaAdsSetupFlow = {
|
|
|
583
597
|
sections.push("_No ad accounts selected._", "");
|
|
584
598
|
return sections.join("\n");
|
|
585
599
|
}
|
|
586
|
-
sections.push("| Ad Account ID | Name | Currency | Status |");
|
|
587
|
-
sections.push("
|
|
588
|
-
|
|
600
|
+
sections.push("| Ad Account ID | Name | Currency | Status | Campaigns |");
|
|
601
|
+
sections.push("|---------------|------|----------|--------|-----------|");
|
|
602
|
+
const campaignCounts = await Promise.all(
|
|
603
|
+
targetIds.map((id) => fetchCampaignCount(rt.params, id))
|
|
604
|
+
);
|
|
605
|
+
for (let i = 0; i < targetIds.length; i++) {
|
|
606
|
+
const id = targetIds[i];
|
|
589
607
|
const account = byId.get(id);
|
|
590
608
|
const name = (account?.name ?? "-").replace(/\|/g, "\\|");
|
|
591
609
|
const currency = account?.currency ?? "-";
|
|
592
610
|
const status = statusLabel(account?.account_status);
|
|
593
|
-
|
|
611
|
+
const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
|
|
612
|
+
sections.push(
|
|
613
|
+
`| ${id} | ${name} | ${currency} | ${status} | ${campaigns} |`
|
|
614
|
+
);
|
|
594
615
|
}
|
|
595
616
|
sections.push("");
|
|
596
617
|
return sections.join("\n");
|
|
@@ -698,8 +719,8 @@ var metaAdsConnector = new ConnectorPlugin({
|
|
|
698
719
|
systemPrompt: {
|
|
699
720
|
en: `### Tools
|
|
700
721
|
|
|
701
|
-
- \`
|
|
702
|
-
- \`
|
|
722
|
+
- \`connector_meta-ads_request\`: Send authenticated requests to the Meta Marketing API v21.0. The {adAccountId} placeholder in paths is automatically replaced. Authentication is configured via the access token parameter.
|
|
723
|
+
- \`connector_meta-ads_listAdAccounts\`: List accessible Meta ad accounts. Use this during setup to discover available accounts.
|
|
703
724
|
|
|
704
725
|
### Meta Marketing API Reference
|
|
705
726
|
|
|
@@ -760,8 +781,8 @@ const accounts = await meta.listAdAccounts();
|
|
|
760
781
|
\`\`\``,
|
|
761
782
|
ja: `### \u30C4\u30FC\u30EB
|
|
762
783
|
|
|
763
|
-
- \`
|
|
764
|
-
- \`
|
|
784
|
+
- \`connector_meta-ads_request\`: Meta Marketing API v21.0\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
785
|
+
- \`connector_meta-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AMeta\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
765
786
|
|
|
766
787
|
### Meta Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
767
788
|
|
|
@@ -334,7 +334,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
334
334
|
/**
|
|
335
335
|
* Create tools for connections that belong to this connector.
|
|
336
336
|
* Filters connections by connectorKey internally.
|
|
337
|
-
* Returns tools keyed as
|
|
337
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
338
338
|
*/
|
|
339
339
|
createTools(connections, config, opts) {
|
|
340
340
|
const myConnections = connections.filter(
|
|
@@ -344,7 +344,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
344
344
|
for (const t of Object.values(this.tools)) {
|
|
345
345
|
const tool = t.createTool(myConnections, config);
|
|
346
346
|
const originalToModelOutput = tool.toModelOutput;
|
|
347
|
-
result[
|
|
347
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
348
348
|
...tool,
|
|
349
349
|
toModelOutput: async (options) => {
|
|
350
350
|
if (!originalToModelOutput) {
|
|
@@ -473,15 +473,15 @@ var mixpanelOnboarding = new ConnectorOnboarding({
|
|
|
473
473
|
- US (default): https://mixpanel.com/api/query (Query API), https://data.mixpanel.com/api/2.0/export (Export API)
|
|
474
474
|
- EU: https://eu.mixpanel.com/api/query, https://data-eu.mixpanel.com/api/2.0/export
|
|
475
475
|
- India: https://in.mixpanel.com/api/query, https://data-in.mixpanel.com/api/2.0/export
|
|
476
|
-
2. Call
|
|
477
|
-
3. Call
|
|
476
|
+
2. Call connector_mixpanel_request with GET {exportBase}?from_date=YYYY-MM-DD&to_date=YYYY-MM-DD (use a short recent date range, e.g. 1-2 days) to export raw events and discover available event types and properties
|
|
477
|
+
3. Call connector_mixpanel_request with POST {queryBase}/engage to query user profiles and understand user properties
|
|
478
478
|
NOTE: The Query API endpoints (insights, funnels, retention) require a bookmark_id or funnel_id from existing reports in Mixpanel. Use the Export API to retrieve raw events and aggregate in code if you need ad-hoc analysis.`,
|
|
479
479
|
ja: `1. \u63A5\u7D9A\u306Eregion\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u78BA\u8A8D\u3057\u3066\u30D9\u30FC\u30B9URL\u3092\u6C7A\u5B9A\uFF1A
|
|
480
480
|
- US\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09: https://mixpanel.com/api/query\uFF08Query API\uFF09\u3001https://data.mixpanel.com/api/2.0/export\uFF08Export API\uFF09
|
|
481
481
|
- EU: https://eu.mixpanel.com/api/query\u3001https://data-eu.mixpanel.com/api/2.0/export
|
|
482
482
|
- India: https://in.mixpanel.com/api/query\u3001https://data-in.mixpanel.com/api/2.0/export
|
|
483
|
-
2.
|
|
484
|
-
3.
|
|
483
|
+
2. connector_mixpanel_request \u3067 GET {exportBase}?from_date=YYYY-MM-DD&to_date=YYYY-MM-DD \u3092\u547C\u3073\u51FA\u3057\uFF08\u76F4\u8FD11-2\u65E5\u306E\u77ED\u3044\u671F\u9593\u3092\u4F7F\u7528\uFF09\u3001\u751F\u30A4\u30D9\u30F3\u30C8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u3066\u5229\u7528\u53EF\u80FD\u306A\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u3068\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u78BA\u8A8D
|
|
484
|
+
3. connector_mixpanel_request \u3067 POST {queryBase}/engage \u3092\u547C\u3073\u51FA\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3092\u7167\u4F1A\u3057\u3066\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u628A\u63E1
|
|
485
485
|
\u6CE8\u610F: Query API\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08insights\u3001funnels\u3001retention\uFF09\u306FMixpanel\u5185\u306E\u65E2\u5B58\u30EC\u30DD\u30FC\u30C8\u306Ebookmark_id\u307E\u305F\u306Ffunnel_id\u304C\u5FC5\u8981\u3067\u3059\u3002\u30A2\u30C9\u30DB\u30C3\u30AF\u5206\u6790\u304C\u5FC5\u8981\u306A\u5834\u5408\u306F\u3001Export API\u3067\u751F\u30A4\u30D9\u30F3\u30C8\u3092\u53D6\u5F97\u3057\u3001\u30B3\u30FC\u30C9\u4E0A\u3067\u96C6\u8A08\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
|
|
486
486
|
}
|
|
487
487
|
});
|
|
@@ -757,7 +757,7 @@ var mixpanelConnector = new ConnectorPlugin({
|
|
|
757
757
|
systemPrompt: {
|
|
758
758
|
en: `### Tools
|
|
759
759
|
|
|
760
|
-
- \`
|
|
760
|
+
- \`connector_mixpanel_request\`: The only way to call the Mixpanel REST API. Use it for exporting raw events, querying insights/funnels/retention reports, and querying user profiles. Authentication (Basic auth with Service Account username + secret) is configured automatically. The project_id query parameter is appended automatically. Provide the full URL including query parameters \u2014 the base URL varies by region and endpoint type.
|
|
761
761
|
|
|
762
762
|
### Business Logic
|
|
763
763
|
|
|
@@ -816,7 +816,7 @@ export default async function handler(c: Context) {
|
|
|
816
816
|
IMPORTANT: The Insights endpoint requires a bookmark_id from an existing report in the Mixpanel UI. For ad-hoc event analysis, use the Export API to retrieve raw events and aggregate them in code. The Export API is the most flexible and universally accessible endpoint.`,
|
|
817
817
|
ja: `### \u30C4\u30FC\u30EB
|
|
818
818
|
|
|
819
|
-
- \`
|
|
819
|
+
- \`connector_mixpanel_request\`: Mixpanel REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u751F\u30A4\u30D9\u30F3\u30C8\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3001\u30A4\u30F3\u30B5\u30A4\u30C8/\u30D5\u30A1\u30CD\u30EB/\u30EA\u30C6\u30F3\u30B7\u30E7\u30F3\u30EC\u30DD\u30FC\u30C8\u306E\u7167\u4F1A\u3001\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u7167\u4F1A\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Service Account\u306E\u30E6\u30FC\u30B6\u30FC\u540D+\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u306B\u3088\u308BBasic\u8A8D\u8A3C\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002project_id\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u306F\u81EA\u52D5\u7684\u306B\u4ED8\u52A0\u3055\u308C\u307E\u3059\u3002\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u542B\u3080\u5B8C\u5168\u306AURL\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 \u2014 \u30D9\u30FC\u30B9URL\u306F\u30EA\u30FC\u30B8\u30E7\u30F3\u3068\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30BF\u30A4\u30D7\u306B\u3088\u3063\u3066\u7570\u306A\u308A\u307E\u3059\u3002
|
|
820
820
|
|
|
821
821
|
### Business Logic
|
|
822
822
|
|