@adcp/client 4.20.0 ā 4.22.0
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/AGENTS.md +278 -0
- package/README.md +96 -61
- package/bin/adcp.js +342 -4
- package/dist/lib/agents/index.generated.d.ts +9 -1
- package/dist/lib/agents/index.generated.d.ts.map +1 -1
- package/dist/lib/agents/index.generated.js +12 -0
- package/dist/lib/agents/index.generated.js.map +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.ts +2 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +10 -1
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/discovery/property-crawler.d.ts +4 -0
- package/dist/lib/discovery/property-crawler.d.ts.map +1 -1
- package/dist/lib/discovery/property-crawler.js +10 -2
- package/dist/lib/discovery/property-crawler.js.map +1 -1
- package/dist/lib/index.d.ts +9 -9
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +13 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +8 -6
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +24 -11
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/registry/cursor-store.d.ts +19 -0
- package/dist/lib/registry/cursor-store.d.ts.map +1 -0
- package/dist/lib/registry/cursor-store.js +44 -0
- package/dist/lib/registry/cursor-store.js.map +1 -0
- package/dist/lib/registry/index.d.ts +21 -3
- package/dist/lib/registry/index.d.ts.map +1 -1
- package/dist/lib/registry/index.js +94 -1
- package/dist/lib/registry/index.js.map +1 -1
- package/dist/lib/registry/property-registry.d.ts +57 -0
- package/dist/lib/registry/property-registry.d.ts.map +1 -0
- package/dist/lib/registry/property-registry.js +92 -0
- package/dist/lib/registry/property-registry.js.map +1 -0
- package/dist/lib/registry/sync.d.ts +4 -0
- package/dist/lib/registry/sync.d.ts.map +1 -1
- package/dist/lib/registry/sync.js +14 -0
- package/dist/lib/registry/sync.js.map +1 -1
- package/dist/lib/registry/types.d.ts +35 -2
- package/dist/lib/registry/types.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.d.ts +349 -321
- package/dist/lib/registry/types.generated.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.js +1 -1
- package/dist/lib/server/index.d.ts +2 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +3 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/serve.d.ts +45 -0
- package/dist/lib/server/serve.d.ts.map +1 -0
- package/dist/lib/server/serve.js +86 -0
- package/dist/lib/server/serve.js.map +1 -0
- package/dist/lib/testing/agent-tester.d.ts +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +10 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +3 -0
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +158 -203
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts +24 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.js +157 -0
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -0
- package/dist/lib/testing/compliance/types.d.ts +1 -1
- package/dist/lib/testing/compliance/types.d.ts.map +1 -1
- package/dist/lib/testing/index.d.ts +2 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +26 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts +8 -0
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +11 -0
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts +23 -0
- package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/brand-rights.js +144 -0
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -0
- package/dist/lib/testing/scenarios/capabilities.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.js +11 -2
- package/dist/lib/testing/scenarios/capabilities.js.map +1 -1
- package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/governance.js +5 -0
- package/dist/lib/testing/scenarios/governance.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +2 -0
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +10 -2
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +22 -3
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.d.ts +22 -0
- package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -0
- package/dist/lib/testing/scenarios/trusted-match.js +128 -0
- package/dist/lib/testing/scenarios/trusted-match.js.map +1 -0
- package/dist/lib/testing/storyboard/context.d.ts +34 -0
- package/dist/lib/testing/storyboard/context.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/context.js +257 -0
- package/dist/lib/testing/storyboard/context.js.map +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +15 -0
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/index.js +48 -0
- package/dist/lib/testing/storyboard/index.js.map +1 -0
- package/dist/lib/testing/storyboard/loader.d.ts +53 -0
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/loader.js +114 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -0
- package/dist/lib/testing/storyboard/path.d.ts +29 -0
- package/dist/lib/testing/storyboard/path.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/path.js +121 -0
- package/dist/lib/testing/storyboard/path.js.map +1 -0
- package/dist/lib/testing/storyboard/request-builder.d.ts +28 -0
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-builder.js +410 -0
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -0
- package/dist/lib/testing/storyboard/runner.d.ts +24 -0
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/runner.js +280 -0
- package/dist/lib/testing/storyboard/runner.js.map +1 -0
- package/dist/lib/testing/storyboard/task-map.d.ts +21 -0
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/task-map.js +84 -0
- package/dist/lib/testing/storyboard/task-map.js.map +1 -0
- package/dist/lib/testing/storyboard/types.d.ts +156 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/types.js +10 -0
- package/dist/lib/testing/storyboard/types.js.map +1 -0
- package/dist/lib/testing/storyboard/validations.d.ts +17 -0
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/validations.js +166 -0
- package/dist/lib/testing/storyboard/validations.js.map +1 -0
- package/dist/lib/testing/types.d.ts +4 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +36 -23
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/schemas.generated.d.ts +1098 -770
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +163 -76
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +314 -24
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +4 -1
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +25 -1
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.js +34 -3
- package/dist/lib/utils/response-schemas.js.map +1 -1
- package/dist/lib/utils/validate-user-agent.d.ts +8 -0
- package/dist/lib/utils/validate-user-agent.d.ts.map +1 -0
- package/dist/lib/utils/validate-user-agent.js +15 -0
- package/dist/lib/utils/validate-user-agent.js.map +1 -0
- package/dist/lib/version.d.ts +9 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +10 -4
- package/dist/lib/version.js.map +1 -1
- package/docs/README.md +42 -0
- package/docs/guides/BUILD-AN-AGENT.md +292 -0
- package/docs/llms.txt +634 -0
- package/examples/README.md +106 -0
- package/examples/adcp.config.json +30 -0
- package/examples/basic-a2a.ts +76 -0
- package/examples/basic-mcp.ts +50 -0
- package/examples/batch-preview-test.ts +266 -0
- package/examples/conversation-client.ts +291 -0
- package/examples/debug-preview-response.ts +73 -0
- package/examples/debug-preview-with-logging.ts +50 -0
- package/examples/easy-config-demo.ts +242 -0
- package/examples/env-config.ts +51 -0
- package/examples/error-compliant-server.ts +237 -0
- package/examples/generative-creative-demo.ts +205 -0
- package/examples/inspect-card-formats.ts +161 -0
- package/examples/logger-usage.ts +165 -0
- package/examples/oauth-cli-example.ts +154 -0
- package/examples/pr78-async-patterns-demo.ts +247 -0
- package/examples/signals-agent.ts +162 -0
- package/examples/simple-getting-started.ts +225 -0
- package/examples/simple-protocol-demo.ts +75 -0
- package/examples/test-helpers-demo.ts +239 -0
- package/examples/zod-validation-example.ts +126 -0
- package/package.json +12 -2
- package/skills/adcp/SKILL.md +13 -2
- package/storyboards/audience_sync.yaml +199 -0
- package/storyboards/behavioral_analysis.yaml +244 -0
- package/storyboards/brand_rights.yaml +131 -0
- package/storyboards/creative_ad_server.yaml +171 -0
- package/storyboards/creative_sales_agent.yaml +169 -0
- package/storyboards/creative_template.yaml +306 -0
- package/storyboards/deterministic_testing.yaml +925 -0
- package/storyboards/error_compliance.yaml +231 -0
- package/storyboards/governance_content_standards.yaml +213 -0
- package/storyboards/governance_property_lists.yaml +372 -0
- package/storyboards/media_buy_catalog_creative.yaml +457 -0
- package/storyboards/media_buy_governance_escalation.yaml +467 -0
- package/storyboards/media_buy_guaranteed_approval.yaml +396 -0
- package/storyboards/media_buy_non_guaranteed.yaml +288 -0
- package/storyboards/media_buy_proposal_mode.yaml +369 -0
- package/storyboards/media_buy_seller.yaml +560 -0
- package/storyboards/media_buy_state_machine.yaml +254 -0
- package/storyboards/schema.yaml +65 -0
- package/storyboards/schema_validation.yaml +166 -0
- package/storyboards/si_session.yaml +384 -0
- package/storyboards/signal_marketplace.yaml +283 -0
- package/storyboards/signal_owned.yaml +211 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Signals Agent (Server)
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates building an AdCP signals agent that serves audience segments
|
|
5
|
+
* via the get_signals tool. Uses createTaskCapableServer for MCP task support
|
|
6
|
+
* and generated Zod schemas for type-safe input validation.
|
|
7
|
+
*
|
|
8
|
+
* Run with:
|
|
9
|
+
*
|
|
10
|
+
* npx tsx examples/signals-agent.ts
|
|
11
|
+
*
|
|
12
|
+
* Then test with:
|
|
13
|
+
*
|
|
14
|
+
* npx @adcp/client http://localhost:3001/mcp
|
|
15
|
+
* npx @adcp/client http://localhost:3001/mcp get_signals '{"signal_spec":"audience segments"}'
|
|
16
|
+
* npx @adcp/client http://localhost:3001/mcp get_signals '{"signal_spec":"shoppers"}'
|
|
17
|
+
* npx @adcp/client http://localhost:3001/mcp get_signals '{"filters":{"catalog_types":["marketplace"]}}'
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { createTaskCapableServer, taskToolResponse, serve, GetSignalsRequestSchema } from '@adcp/client';
|
|
21
|
+
import type { GetSignalsResponse } from '@adcp/client';
|
|
22
|
+
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Audience segment catalog ā typed to match the AdCP signals response schema
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
type Signal = GetSignalsResponse['signals'][number];
|
|
27
|
+
|
|
28
|
+
const SEGMENTS: Signal[] = [
|
|
29
|
+
{
|
|
30
|
+
signal_agent_segment_id: 'high_intent_shoppers',
|
|
31
|
+
signal_id: {
|
|
32
|
+
source: 'catalog',
|
|
33
|
+
data_provider_domain: 'example-signals.com',
|
|
34
|
+
id: 'high_intent_shoppers',
|
|
35
|
+
},
|
|
36
|
+
name: 'High Intent Shoppers',
|
|
37
|
+
description: 'Users who visited product pages 3+ times in the last 7 days without purchasing.',
|
|
38
|
+
value_type: 'binary',
|
|
39
|
+
signal_type: 'owned',
|
|
40
|
+
data_provider: 'Example Signals Agent',
|
|
41
|
+
coverage_percentage: 12,
|
|
42
|
+
deployments: [],
|
|
43
|
+
pricing_options: [
|
|
44
|
+
{
|
|
45
|
+
pricing_option_id: 'po_high_intent_cpm',
|
|
46
|
+
model: 'cpm',
|
|
47
|
+
currency: 'USD',
|
|
48
|
+
cpm: 6,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
signal_agent_segment_id: 'lapsed_subscribers',
|
|
54
|
+
signal_id: {
|
|
55
|
+
source: 'catalog',
|
|
56
|
+
data_provider_domain: 'example-signals.com',
|
|
57
|
+
id: 'lapsed_subscribers',
|
|
58
|
+
},
|
|
59
|
+
name: 'Lapsed Subscribers',
|
|
60
|
+
description: 'Email subscribers who have not opened in 90+ days but previously had high engagement.',
|
|
61
|
+
value_type: 'binary',
|
|
62
|
+
signal_type: 'custom',
|
|
63
|
+
data_provider: 'Example Signals Agent',
|
|
64
|
+
coverage_percentage: 8,
|
|
65
|
+
deployments: [],
|
|
66
|
+
pricing_options: [
|
|
67
|
+
{
|
|
68
|
+
pricing_option_id: 'po_lapsed_cpm',
|
|
69
|
+
model: 'cpm',
|
|
70
|
+
currency: 'USD',
|
|
71
|
+
cpm: 3,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
signal_agent_segment_id: 'geo_urban_commuters',
|
|
77
|
+
signal_id: {
|
|
78
|
+
source: 'catalog',
|
|
79
|
+
data_provider_domain: 'example-signals.com',
|
|
80
|
+
id: 'geo_urban_commuters',
|
|
81
|
+
},
|
|
82
|
+
name: 'Urban Commuters',
|
|
83
|
+
description: 'Users whose location data indicates daily commute patterns through major metro areas.',
|
|
84
|
+
value_type: 'binary',
|
|
85
|
+
signal_type: 'marketplace',
|
|
86
|
+
data_provider: 'Example Signals Agent',
|
|
87
|
+
coverage_percentage: 22,
|
|
88
|
+
deployments: [],
|
|
89
|
+
pricing_options: [
|
|
90
|
+
{
|
|
91
|
+
pricing_option_id: 'po_urban_cpm',
|
|
92
|
+
model: 'cpm',
|
|
93
|
+
currency: 'USD',
|
|
94
|
+
cpm: 5,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Query logic ā filters segments by spec, IDs, and catalog type
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
function querySegments(args: {
|
|
104
|
+
signal_spec?: string | null;
|
|
105
|
+
signal_ids?: Array<{ id: string }> | null;
|
|
106
|
+
catalog_types?: string[] | null;
|
|
107
|
+
max_results?: number | null;
|
|
108
|
+
}): Signal[] {
|
|
109
|
+
let results = [...SEGMENTS];
|
|
110
|
+
|
|
111
|
+
if (args.signal_ids?.length) {
|
|
112
|
+
const ids = new Set(args.signal_ids.map(s => s.id));
|
|
113
|
+
results = results.filter(s => ids.has(s.signal_agent_segment_id));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (args.catalog_types?.length) {
|
|
117
|
+
results = results.filter(s => args.catalog_types!.includes(s.signal_type));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (args.signal_spec) {
|
|
121
|
+
const spec = args.signal_spec.toLowerCase();
|
|
122
|
+
results = results.filter(s => s.name.toLowerCase().includes(spec) || s.description.toLowerCase().includes(spec));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (args.max_results) {
|
|
126
|
+
results = results.slice(0, args.max_results);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return results;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// Server factory
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
function createSignalsAgent() {
|
|
136
|
+
const server = createTaskCapableServer('Example Signals Agent', '1.0.0', {
|
|
137
|
+
instructions: 'Signals agent providing audience segment discovery via get_signals.',
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
server.tool(
|
|
141
|
+
'get_signals',
|
|
142
|
+
'Discover audience segments. Supports natural language discovery via signal_spec or exact lookup via signal_ids.',
|
|
143
|
+
GetSignalsRequestSchema.shape,
|
|
144
|
+
async args => {
|
|
145
|
+
const signals = querySegments({
|
|
146
|
+
signal_spec: args.signal_spec,
|
|
147
|
+
signal_ids: args.signal_ids,
|
|
148
|
+
catalog_types: args.filters?.catalog_types,
|
|
149
|
+
max_results: args.max_results,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
return taskToolResponse({ signals, sandbox: true }, `Found ${signals.length} audience segment(s)`);
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
return server;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Start the server
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
serve(createSignalsAgent);
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
// Simple Getting Started Example - Your First ADCP Client
|
|
3
|
+
// This example shows the absolute simplest way to use the ADCP client library
|
|
4
|
+
|
|
5
|
+
import { ADCPMultiAgentClient, createFieldHandler, type AgentConfig } from '../src/lib';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Example 1: Absolute Simplest Usage
|
|
9
|
+
* This shows how to make your first ADCP call with minimal setup
|
|
10
|
+
*/
|
|
11
|
+
async function gettingStarted() {
|
|
12
|
+
console.log('š ADCP Client Library - Getting Started');
|
|
13
|
+
console.log('=====================================\n');
|
|
14
|
+
|
|
15
|
+
// Step 1: Configure your ADCP agent
|
|
16
|
+
console.log('Step 1: Setting up your ADCP agent...');
|
|
17
|
+
|
|
18
|
+
const agents: AgentConfig[] = [
|
|
19
|
+
{
|
|
20
|
+
id: 'demo-agent',
|
|
21
|
+
name: 'Demo Advertising Agent',
|
|
22
|
+
agent_uri: 'https://demo-agent.adcontextprotocol.org', // This would be your real agent URL
|
|
23
|
+
protocol: 'mcp',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const client = new ADCPMultiAgentClient(agents);
|
|
28
|
+
console.log(`ā
Connected to ${client.agentCount} agent(s)\n`);
|
|
29
|
+
|
|
30
|
+
// Step 2: Make your first ADCP call
|
|
31
|
+
console.log('Step 2: Asking for advertising products...');
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const agent = client.agent('demo-agent');
|
|
35
|
+
|
|
36
|
+
// This is the simplest possible ADCP call
|
|
37
|
+
const result = await agent.getProducts({
|
|
38
|
+
brief: 'Coffee subscription service targeting busy professionals',
|
|
39
|
+
promoted_offering: 'Premium monthly coffee deliveries',
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (result.success) {
|
|
43
|
+
console.log(`ā
Success! Found ${result.data.products?.length || 0} advertising products`);
|
|
44
|
+
console.log(` Response time: ${result.metadata.responseTimeMs}ms`);
|
|
45
|
+
|
|
46
|
+
// Show first few products
|
|
47
|
+
result.data.products?.slice(0, 3).forEach((product, i) => {
|
|
48
|
+
console.log(` ${i + 1}. ${product.name} - ${product.publisher}`);
|
|
49
|
+
});
|
|
50
|
+
} else {
|
|
51
|
+
console.log(`ā Error: ${result.error}`);
|
|
52
|
+
}
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.log(`ā Network error: ${error.message}`);
|
|
55
|
+
console.log("\nš” This is expected with demo URLs. In real usage, you'd use actual agent endpoints.");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
console.log("\nš That's it! You've made your first ADCP call.\n");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Example 2: Adding Smart Responses
|
|
63
|
+
* This shows how to handle agent clarifications automatically
|
|
64
|
+
*/
|
|
65
|
+
async function withSmartHandler() {
|
|
66
|
+
console.log('š Example 2: Adding Smart Clarification Handling');
|
|
67
|
+
console.log('===============================================\n');
|
|
68
|
+
|
|
69
|
+
const client = new ADCPMultiAgentClient([
|
|
70
|
+
{
|
|
71
|
+
id: 'fashion-agent',
|
|
72
|
+
name: 'Fashion Network Agent',
|
|
73
|
+
agent_uri: 'https://fashion-network.example.com',
|
|
74
|
+
protocol: 'mcp',
|
|
75
|
+
},
|
|
76
|
+
]);
|
|
77
|
+
|
|
78
|
+
// Create a handler for common agent questions
|
|
79
|
+
const smartHandler = createFieldHandler({
|
|
80
|
+
budget: 25000, // Auto-answer budget questions
|
|
81
|
+
targeting: ['US', 'CA', 'UK'], // Auto-answer geographic targeting
|
|
82
|
+
approval: true, // Auto-approve when asked
|
|
83
|
+
timeframe: '30 days', // Campaign duration
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
console.log('⨠Created smart handler for automatic responses');
|
|
87
|
+
console.log(' - Budget questions ā $25,000');
|
|
88
|
+
console.log(' - Targeting questions ā US, CA, UK');
|
|
89
|
+
console.log(' - Approval questions ā Yes');
|
|
90
|
+
console.log(' - Timeframe questions ā 30 days\n');
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
const agent = client.agent('fashion-agent');
|
|
94
|
+
|
|
95
|
+
console.log('šÆ Requesting products with smart handler...');
|
|
96
|
+
const result = await agent.getProducts(
|
|
97
|
+
{
|
|
98
|
+
brief: 'Sustainable fashion brands for environmentally conscious millennials',
|
|
99
|
+
promoted_offering: 'Eco-friendly clothing and accessories',
|
|
100
|
+
},
|
|
101
|
+
smartHandler
|
|
102
|
+
); // <-- Handler will auto-respond to agent clarifications
|
|
103
|
+
|
|
104
|
+
if (result.success) {
|
|
105
|
+
console.log(
|
|
106
|
+
`ā
Smart handler success! ${result.metadata.clarificationRounds} clarifications handled automatically`
|
|
107
|
+
);
|
|
108
|
+
console.log(` Found ${result.data.products?.length || 0} products`);
|
|
109
|
+
}
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.log(`ā Expected error with demo URL: ${error.message}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
console.log('\nš” In production, the agent might ask clarifying questions like:');
|
|
115
|
+
console.log(' "What\'s your budget for this campaign?"');
|
|
116
|
+
console.log(' "Which geographic regions should we target?"');
|
|
117
|
+
console.log(' "Do you approve this targeting strategy?"');
|
|
118
|
+
console.log(' ā Your handler automatically provides the answers!\n');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Example 3: Real-World Workflow
|
|
123
|
+
* This shows a complete campaign planning workflow
|
|
124
|
+
*/
|
|
125
|
+
async function campaignWorkflow() {
|
|
126
|
+
console.log('šļø Example 3: Complete Campaign Planning Workflow');
|
|
127
|
+
console.log('================================================\n');
|
|
128
|
+
|
|
129
|
+
const client = new ADCPMultiAgentClient([
|
|
130
|
+
{
|
|
131
|
+
id: 'travel-agent',
|
|
132
|
+
name: 'Travel Industry Agent',
|
|
133
|
+
agent_uri: 'https://travel-ads.example.com',
|
|
134
|
+
protocol: 'mcp',
|
|
135
|
+
},
|
|
136
|
+
]);
|
|
137
|
+
|
|
138
|
+
const handler = createFieldHandler({
|
|
139
|
+
budget: 75000,
|
|
140
|
+
targeting: ['US', 'CA', 'UK', 'AU'],
|
|
141
|
+
approval: true,
|
|
142
|
+
objectives: ['brand_awareness', 'conversions'],
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
console.log('šÆ Planning a travel campaign...');
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const agent = client.agent('travel-agent');
|
|
149
|
+
|
|
150
|
+
// Step 1: Discover available advertising products
|
|
151
|
+
console.log('\n1ļøā£ Discovering available advertising products...');
|
|
152
|
+
const products = await agent.getProducts(
|
|
153
|
+
{
|
|
154
|
+
brief: 'Luxury European vacation packages for affluent travelers',
|
|
155
|
+
promoted_offering: 'Premium guided tours and boutique accommodations',
|
|
156
|
+
},
|
|
157
|
+
handler
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
console.log(` Found ${products.data?.products?.length || 0} advertising products`);
|
|
161
|
+
|
|
162
|
+
// Step 2: Check available creative formats
|
|
163
|
+
console.log('\n2ļøā£ Checking creative format options...');
|
|
164
|
+
const formats = await agent.listCreativeFormats(
|
|
165
|
+
{
|
|
166
|
+
type: 'video',
|
|
167
|
+
},
|
|
168
|
+
handler
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
console.log(` Found ${formats.data?.formats?.length || 0} video format options`);
|
|
172
|
+
|
|
173
|
+
// Step 3: Continue the conversation to refine
|
|
174
|
+
console.log('\n3ļøā£ Refining search based on initial results...');
|
|
175
|
+
const refined = await agent.continueConversation(
|
|
176
|
+
'Focus on Mediterranean destinations, budget-friendly options under $3000 per person'
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
console.log(` Refined search completed in ${refined.metadata.responseTimeMs}ms`);
|
|
180
|
+
|
|
181
|
+
// Step 4: Show conversation history
|
|
182
|
+
const history = agent.getHistory();
|
|
183
|
+
console.log(`\nš Conversation summary:`);
|
|
184
|
+
console.log(` Total messages exchanged: ${history?.length || 0}`);
|
|
185
|
+
console.log(` Clarifications handled: ${products.metadata.clarificationRounds}`);
|
|
186
|
+
|
|
187
|
+
console.log('\nā
Campaign planning workflow completed!');
|
|
188
|
+
} catch (error) {
|
|
189
|
+
console.log(`ā Expected error with demo URL: ${error.message}`);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
console.log('\nš” In a real scenario, you would:');
|
|
193
|
+
console.log(' ā Use actual ADCP agent endpoints');
|
|
194
|
+
console.log(' ā Create media buys from the discovered products');
|
|
195
|
+
console.log(' ā Monitor campaign performance');
|
|
196
|
+
console.log(' ā Optimize based on results\n');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Main function - run all examples
|
|
201
|
+
*/
|
|
202
|
+
async function main() {
|
|
203
|
+
console.log('šÆ ADCP TypeScript Client Library');
|
|
204
|
+
console.log('Simple Getting Started Examples');
|
|
205
|
+
console.log('================================\n');
|
|
206
|
+
|
|
207
|
+
await gettingStarted();
|
|
208
|
+
await withSmartHandler();
|
|
209
|
+
await campaignWorkflow();
|
|
210
|
+
|
|
211
|
+
console.log('š Next Steps:');
|
|
212
|
+
console.log(' 1. Get ADCP agent credentials from your advertising partner');
|
|
213
|
+
console.log(' 2. Replace demo URLs with real agent endpoints');
|
|
214
|
+
console.log(' 3. Customize input handlers for your specific needs');
|
|
215
|
+
console.log(' 4. Explore multi-agent operations for price comparison');
|
|
216
|
+
console.log(' 5. Add error handling and logging for production use');
|
|
217
|
+
console.log('\nš Learn more: Check the README.md for complete documentation');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Run examples if this file is executed directly
|
|
221
|
+
if (require.main === module) {
|
|
222
|
+
main().catch(console.error);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export { gettingStarted, withSmartHandler, campaignWorkflow };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Simple Protocol Detection Demo
|
|
5
|
+
*
|
|
6
|
+
* Shows how easy it is to detect input requests with ADCP spec PR #77
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { ProtocolResponseParser, ADCP_STATUS } from '../src/lib/index';
|
|
10
|
+
|
|
11
|
+
function main() {
|
|
12
|
+
console.log('šÆ Simple ADCP Protocol Detection\n');
|
|
13
|
+
|
|
14
|
+
const parser = new ProtocolResponseParser();
|
|
15
|
+
|
|
16
|
+
// Test cases showing the simplicity
|
|
17
|
+
const testCases = [
|
|
18
|
+
{
|
|
19
|
+
name: 'ADCP Standard: input-required',
|
|
20
|
+
response: {
|
|
21
|
+
status: 'input-required',
|
|
22
|
+
message: 'What is your budget?',
|
|
23
|
+
},
|
|
24
|
+
expected: true,
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
{
|
|
28
|
+
name: 'ADCP Standard: completed',
|
|
29
|
+
response: {
|
|
30
|
+
status: 'completed',
|
|
31
|
+
result: { products: ['Product A'] },
|
|
32
|
+
},
|
|
33
|
+
expected: false,
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
{
|
|
37
|
+
name: 'Legacy fallback',
|
|
38
|
+
response: {
|
|
39
|
+
type: 'input_request',
|
|
40
|
+
question: 'Select a format',
|
|
41
|
+
},
|
|
42
|
+
expected: true,
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
console.log('š Testing simplified detection:\n');
|
|
47
|
+
|
|
48
|
+
testCases.forEach(testCase => {
|
|
49
|
+
console.log(`š§Ŗ ${testCase.name}`);
|
|
50
|
+
console.log(` Response: ${JSON.stringify(testCase.response, null, 4)}`);
|
|
51
|
+
|
|
52
|
+
const needsInput = parser.isInputRequest(testCase.response);
|
|
53
|
+
const status = parser.getStatus(testCase.response);
|
|
54
|
+
|
|
55
|
+
console.log(` ā
Needs Input: ${needsInput} (expected: ${testCase.expected})`);
|
|
56
|
+
console.log(` š ADCP Status: ${status || 'null'}`);
|
|
57
|
+
|
|
58
|
+
if (needsInput) {
|
|
59
|
+
const parsed = parser.parseInputRequest(testCase.response);
|
|
60
|
+
console.log(` š Question: "${parsed.question}"`);
|
|
61
|
+
}
|
|
62
|
+
console.log('');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
console.log('š Key Takeaway: Just check status === "input-required"!');
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log('ADCP Status Values:');
|
|
68
|
+
Object.entries(ADCP_STATUS).forEach(([key, value]) => {
|
|
69
|
+
console.log(` ⢠${key}: "${value}"`);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (require.main === module) {
|
|
74
|
+
main();
|
|
75
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
// Test Helpers Demo - Using Pre-configured Test Agents
|
|
3
|
+
// This example shows how to use the built-in test helpers for quick testing and examples
|
|
4
|
+
|
|
5
|
+
import { testAgent, testAgentA2A, testAgentClient, createTestAgent, AdCPClient } from '../src/lib';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Example 1: Simplest Possible Usage
|
|
9
|
+
* Use the pre-configured test agent directly - no setup needed!
|
|
10
|
+
*/
|
|
11
|
+
async function simplestExample() {
|
|
12
|
+
console.log('šÆ Example 1: Simplest Usage with testAgent');
|
|
13
|
+
console.log('===========================================\n');
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
// Just import and use - that's it!
|
|
17
|
+
const result = await testAgent.getProducts({
|
|
18
|
+
brief: 'Premium coffee subscription service',
|
|
19
|
+
promoted_offering: 'Artisan coffee deliveries',
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
if (result.success) {
|
|
23
|
+
console.log(`ā
Success! Found ${result.data.products?.length || 0} products`);
|
|
24
|
+
console.log(` Response time: ${result.metadata.responseTimeMs}ms`);
|
|
25
|
+
console.log(` Protocol: MCP\n`);
|
|
26
|
+
} else {
|
|
27
|
+
console.log(`ā Error: ${result.error}\n`);
|
|
28
|
+
}
|
|
29
|
+
} catch (error: any) {
|
|
30
|
+
console.log(`ā Network error: ${error.message}\n`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Example 2: Testing Both Protocols
|
|
36
|
+
* Use both A2A and MCP test agents to compare behavior
|
|
37
|
+
*/
|
|
38
|
+
async function protocolComparison() {
|
|
39
|
+
console.log('š Example 2: Protocol Comparison (A2A vs MCP)');
|
|
40
|
+
console.log('==============================================\n');
|
|
41
|
+
|
|
42
|
+
const request = {
|
|
43
|
+
brief: 'Sustainable fashion brands',
|
|
44
|
+
promoted_offering: 'Eco-friendly clothing',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
console.log('Testing MCP protocol...');
|
|
49
|
+
const mcpResult = await testAgent.getProducts(request);
|
|
50
|
+
console.log(` MCP: ${mcpResult.success ? 'ā
' : 'ā'} ${mcpResult.metadata.responseTimeMs}ms`);
|
|
51
|
+
|
|
52
|
+
console.log('Testing A2A protocol...');
|
|
53
|
+
const a2aResult = await testAgentA2A.getProducts(request);
|
|
54
|
+
console.log(` A2A: ${a2aResult.success ? 'ā
' : 'ā'} ${a2aResult.metadata.responseTimeMs}ms\n`);
|
|
55
|
+
} catch (error: any) {
|
|
56
|
+
console.log(`ā Error: ${error.message}\n`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Example 3: Multi-Agent Testing
|
|
62
|
+
* Use the testAgentClient for parallel operations
|
|
63
|
+
*/
|
|
64
|
+
async function multiAgentExample() {
|
|
65
|
+
console.log('š Example 3: Multi-Agent Operations');
|
|
66
|
+
console.log('====================================\n');
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
console.log(`Testing with ${testAgentClient.agentCount} agents in parallel...`);
|
|
70
|
+
|
|
71
|
+
// Run the same query on both agents in parallel
|
|
72
|
+
const results = await testAgentClient.allAgents().getProducts({
|
|
73
|
+
brief: 'Tech gadgets for remote work',
|
|
74
|
+
promoted_offering: 'Ergonomic workspace solutions',
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
console.log('\nResults:');
|
|
78
|
+
results.forEach((result, i) => {
|
|
79
|
+
console.log(` ${i + 1}. ${result.success ? 'ā
' : 'ā'} ${result.metadata.responseTimeMs}ms`);
|
|
80
|
+
});
|
|
81
|
+
console.log();
|
|
82
|
+
} catch (error: any) {
|
|
83
|
+
console.log(`ā Error: ${error.message}\n`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Example 4: AI Test Orchestration
|
|
89
|
+
* Use natural language instructions to control test behavior
|
|
90
|
+
*/
|
|
91
|
+
async function aiTestOrchestration() {
|
|
92
|
+
console.log('š¤ Example 4: AI Test Orchestration');
|
|
93
|
+
console.log('===================================\n');
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
// Test with a delay instruction
|
|
97
|
+
console.log('Testing delayed response...');
|
|
98
|
+
const delayResult = await testAgent.createMediaBuy({
|
|
99
|
+
brief: 'Test campaign',
|
|
100
|
+
promoted_offering: 'Wait 10 seconds before responding', // AI understands this!
|
|
101
|
+
products: ['prod_test_001'],
|
|
102
|
+
budget: 10000,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
console.log(` Result: ${delayResult.success ? 'ā
Success' : 'ā Failed'}`);
|
|
106
|
+
console.log(` Time: ${delayResult.metadata.responseTimeMs}ms`);
|
|
107
|
+
|
|
108
|
+
// Test with a rejection instruction
|
|
109
|
+
console.log('\nTesting rejection scenario...');
|
|
110
|
+
const rejectResult = await testAgent.createMediaBuy({
|
|
111
|
+
brief: 'Test campaign',
|
|
112
|
+
promoted_offering: 'Reject this media buy with reason: Budget exceeds inventory',
|
|
113
|
+
products: ['prod_test_001'],
|
|
114
|
+
budget: 999999,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
console.log(` Result: ${rejectResult.success ? 'ā
Success' : 'ā Failed'}`);
|
|
118
|
+
if (!rejectResult.success) {
|
|
119
|
+
console.log(` Reason: ${rejectResult.error}`);
|
|
120
|
+
}
|
|
121
|
+
console.log();
|
|
122
|
+
} catch (error: any) {
|
|
123
|
+
console.log(`ā Error: ${error.message}\n`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Example 5: Custom Test Agent Configuration
|
|
129
|
+
* Create a custom test agent with modifications
|
|
130
|
+
*/
|
|
131
|
+
async function customTestAgent() {
|
|
132
|
+
console.log('āļø Example 5: Custom Test Agent Configuration');
|
|
133
|
+
console.log('==============================================\n');
|
|
134
|
+
|
|
135
|
+
// Create a custom config with your own ID
|
|
136
|
+
const customConfig = createTestAgent({
|
|
137
|
+
id: 'my-custom-test',
|
|
138
|
+
name: 'My Custom Test Agent',
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
console.log('Created custom config:');
|
|
142
|
+
console.log(` ID: ${customConfig.id}`);
|
|
143
|
+
console.log(` Name: ${customConfig.name}`);
|
|
144
|
+
console.log(` Protocol: ${customConfig.protocol}`);
|
|
145
|
+
console.log(` URI: ${customConfig.agent_uri}\n`);
|
|
146
|
+
|
|
147
|
+
// Use it with a client
|
|
148
|
+
const client = new AdCPClient([customConfig]);
|
|
149
|
+
const agent = client.agent('my-custom-test');
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
const result = await agent.getProducts({
|
|
153
|
+
brief: 'Travel packages',
|
|
154
|
+
promoted_offering: 'European vacations',
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
console.log(`Result: ${result.success ? 'ā
Success' : 'ā Failed'}`);
|
|
158
|
+
console.log();
|
|
159
|
+
} catch (error: any) {
|
|
160
|
+
console.log(`ā Error: ${error.message}\n`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Example 6: Testing Different Operations
|
|
166
|
+
* Show various ADCP operations with test agents
|
|
167
|
+
*/
|
|
168
|
+
async function variousOperations() {
|
|
169
|
+
console.log('š¬ Example 6: Various ADCP Operations');
|
|
170
|
+
console.log('=====================================\n');
|
|
171
|
+
|
|
172
|
+
try {
|
|
173
|
+
// Get products
|
|
174
|
+
console.log('1. Getting products...');
|
|
175
|
+
const products = await testAgent.getProducts({
|
|
176
|
+
brief: 'Coffee brands',
|
|
177
|
+
promoted_offering: 'Premium coffee',
|
|
178
|
+
});
|
|
179
|
+
console.log(` ${products.success ? 'ā
' : 'ā'} Products: ${products.data.products?.length || 0}`);
|
|
180
|
+
|
|
181
|
+
// List creative formats
|
|
182
|
+
console.log('2. Listing creative formats...');
|
|
183
|
+
const formats = await testAgent.listCreativeFormats({});
|
|
184
|
+
console.log(` ${formats.success ? 'ā
' : 'ā'} Formats: ${formats.data.formats?.length || 0}`);
|
|
185
|
+
|
|
186
|
+
// Create a media buy
|
|
187
|
+
console.log('3. Creating media buy...');
|
|
188
|
+
const mediaBuy = await testAgent.createMediaBuy({
|
|
189
|
+
brief: 'Test campaign',
|
|
190
|
+
promoted_offering: 'Test offering',
|
|
191
|
+
products: ['prod_test_001'],
|
|
192
|
+
budget: 5000,
|
|
193
|
+
});
|
|
194
|
+
console.log(` ${mediaBuy.success ? 'ā
' : 'ā'} Media buy: ${mediaBuy.data.media_buy_id || 'none'}`);
|
|
195
|
+
|
|
196
|
+
console.log();
|
|
197
|
+
} catch (error: any) {
|
|
198
|
+
console.log(`ā Error: ${error.message}\n`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Main function - run all examples
|
|
204
|
+
*/
|
|
205
|
+
async function main() {
|
|
206
|
+
console.log('\nš ADCP Test Helpers - Demo Examples');
|
|
207
|
+
console.log('=====================================');
|
|
208
|
+
console.log('These examples show how to use pre-configured test agents\n');
|
|
209
|
+
|
|
210
|
+
await simplestExample();
|
|
211
|
+
await protocolComparison();
|
|
212
|
+
await multiAgentExample();
|
|
213
|
+
await aiTestOrchestration();
|
|
214
|
+
await customTestAgent();
|
|
215
|
+
await variousOperations();
|
|
216
|
+
|
|
217
|
+
console.log('š” Key Takeaways:');
|
|
218
|
+
console.log(' ⢠testAgent = Pre-configured MCP test agent (ready to use!)');
|
|
219
|
+
console.log(' ⢠testAgentA2A = Pre-configured A2A test agent');
|
|
220
|
+
console.log(' ⢠testAgentClient = Multi-agent client with both protocols');
|
|
221
|
+
console.log(' ⢠createTestAgent() = Create custom test configurations');
|
|
222
|
+
console.log(' ⢠Perfect for examples, docs, and quick testing');
|
|
223
|
+
console.log('\nā ļø Remember: Test agents are rate-limited and for testing only!');
|
|
224
|
+
console.log(' DO NOT use in production applications.\n');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Run examples if this file is executed directly
|
|
228
|
+
if (require.main === module) {
|
|
229
|
+
main().catch(console.error);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export {
|
|
233
|
+
simplestExample,
|
|
234
|
+
protocolComparison,
|
|
235
|
+
multiAgentExample,
|
|
236
|
+
aiTestOrchestration,
|
|
237
|
+
customTestAgent,
|
|
238
|
+
variousOperations,
|
|
239
|
+
};
|