signalwire-agents 0.1.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/CLAUDE.md +112 -0
- package/README.md +417 -0
- package/dist/AgentBase.d.ts +481 -0
- package/dist/AgentBase.js +1155 -0
- package/dist/AgentBase.js.map +1 -0
- package/dist/AgentServer.d.ts +60 -0
- package/dist/AgentServer.js +128 -0
- package/dist/AgentServer.js.map +1 -0
- package/dist/AuthHandler.d.ts +56 -0
- package/dist/AuthHandler.js +119 -0
- package/dist/AuthHandler.js.map +1 -0
- package/dist/ConfigLoader.d.ts +68 -0
- package/dist/ConfigLoader.js +150 -0
- package/dist/ConfigLoader.js.map +1 -0
- package/dist/ContextBuilder.d.ts +431 -0
- package/dist/ContextBuilder.js +751 -0
- package/dist/ContextBuilder.js.map +1 -0
- package/dist/DataMap.d.ts +179 -0
- package/dist/DataMap.js +321 -0
- package/dist/DataMap.js.map +1 -0
- package/dist/Logger.d.ts +91 -0
- package/dist/Logger.js +191 -0
- package/dist/Logger.js.map +1 -0
- package/dist/PomBuilder.d.ts +144 -0
- package/dist/PomBuilder.js +249 -0
- package/dist/PomBuilder.js.map +1 -0
- package/dist/PromptManager.d.ts +85 -0
- package/dist/PromptManager.js +108 -0
- package/dist/PromptManager.js.map +1 -0
- package/dist/SchemaUtils.d.ts +42 -0
- package/dist/SchemaUtils.js +148 -0
- package/dist/SchemaUtils.js.map +1 -0
- package/dist/ServerlessAdapter.d.ts +100 -0
- package/dist/ServerlessAdapter.js +166 -0
- package/dist/ServerlessAdapter.js.map +1 -0
- package/dist/SessionManager.d.ts +86 -0
- package/dist/SessionManager.js +155 -0
- package/dist/SessionManager.js.map +1 -0
- package/dist/SslConfig.d.ts +77 -0
- package/dist/SslConfig.js +100 -0
- package/dist/SslConfig.js.map +1 -0
- package/dist/SwaigFunction.d.ts +88 -0
- package/dist/SwaigFunction.js +125 -0
- package/dist/SwaigFunction.js.map +1 -0
- package/dist/SwaigFunctionResult.d.ts +442 -0
- package/dist/SwaigFunctionResult.js +735 -0
- package/dist/SwaigFunctionResult.js.map +1 -0
- package/dist/SwmlBuilder.d.ts +37 -0
- package/dist/SwmlBuilder.js +55 -0
- package/dist/SwmlBuilder.js.map +1 -0
- package/dist/cli/agent-loader.d.ts +22 -0
- package/dist/cli/agent-loader.js +106 -0
- package/dist/cli/agent-loader.js.map +1 -0
- package/dist/cli/mock-data.d.ts +37 -0
- package/dist/cli/mock-data.js +79 -0
- package/dist/cli/mock-data.js.map +1 -0
- package/dist/cli/swaig-test.d.ts +32 -0
- package/dist/cli/swaig-test.js +405 -0
- package/dist/cli/swaig-test.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/prefabs/ConciergeAgent.d.ts +64 -0
- package/dist/prefabs/ConciergeAgent.js +188 -0
- package/dist/prefabs/ConciergeAgent.js.map +1 -0
- package/dist/prefabs/FAQBotAgent.d.ts +68 -0
- package/dist/prefabs/FAQBotAgent.js +206 -0
- package/dist/prefabs/FAQBotAgent.js.map +1 -0
- package/dist/prefabs/InfoGathererAgent.d.ts +73 -0
- package/dist/prefabs/InfoGathererAgent.js +202 -0
- package/dist/prefabs/InfoGathererAgent.js.map +1 -0
- package/dist/prefabs/ReceptionistAgent.d.ts +65 -0
- package/dist/prefabs/ReceptionistAgent.js +205 -0
- package/dist/prefabs/ReceptionistAgent.js.map +1 -0
- package/dist/prefabs/SurveyAgent.d.ts +84 -0
- package/dist/prefabs/SurveyAgent.js +324 -0
- package/dist/prefabs/SurveyAgent.js.map +1 -0
- package/dist/prefabs/index.d.ts +13 -0
- package/dist/prefabs/index.js +14 -0
- package/dist/prefabs/index.js.map +1 -0
- package/dist/skills/SkillBase.d.ts +134 -0
- package/dist/skills/SkillBase.js +105 -0
- package/dist/skills/SkillBase.js.map +1 -0
- package/dist/skills/SkillManager.d.ts +83 -0
- package/dist/skills/SkillManager.js +159 -0
- package/dist/skills/SkillManager.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +105 -0
- package/dist/skills/SkillRegistry.js +195 -0
- package/dist/skills/SkillRegistry.js.map +1 -0
- package/dist/skills/builtin/api_ninjas_trivia.d.ts +35 -0
- package/dist/skills/builtin/api_ninjas_trivia.js +161 -0
- package/dist/skills/builtin/api_ninjas_trivia.js.map +1 -0
- package/dist/skills/builtin/claude_skills.d.ts +34 -0
- package/dist/skills/builtin/claude_skills.js +156 -0
- package/dist/skills/builtin/claude_skills.js.map +1 -0
- package/dist/skills/builtin/custom_skills.d.ts +59 -0
- package/dist/skills/builtin/custom_skills.js +231 -0
- package/dist/skills/builtin/custom_skills.js.map +1 -0
- package/dist/skills/builtin/datasphere.d.ts +34 -0
- package/dist/skills/builtin/datasphere.js +163 -0
- package/dist/skills/builtin/datasphere.js.map +1 -0
- package/dist/skills/builtin/datasphere_serverless.d.ts +54 -0
- package/dist/skills/builtin/datasphere_serverless.js +155 -0
- package/dist/skills/builtin/datasphere_serverless.js.map +1 -0
- package/dist/skills/builtin/datetime.d.ts +31 -0
- package/dist/skills/builtin/datetime.js +95 -0
- package/dist/skills/builtin/datetime.js.map +1 -0
- package/dist/skills/builtin/google_maps.d.ts +33 -0
- package/dist/skills/builtin/google_maps.js +233 -0
- package/dist/skills/builtin/google_maps.js.map +1 -0
- package/dist/skills/builtin/index.d.ts +28 -0
- package/dist/skills/builtin/index.js +75 -0
- package/dist/skills/builtin/index.js.map +1 -0
- package/dist/skills/builtin/info_gatherer.d.ts +52 -0
- package/dist/skills/builtin/info_gatherer.js +237 -0
- package/dist/skills/builtin/info_gatherer.js.map +1 -0
- package/dist/skills/builtin/joke.d.ts +32 -0
- package/dist/skills/builtin/joke.js +142 -0
- package/dist/skills/builtin/joke.js.map +1 -0
- package/dist/skills/builtin/math.d.ts +33 -0
- package/dist/skills/builtin/math.js +120 -0
- package/dist/skills/builtin/math.js.map +1 -0
- package/dist/skills/builtin/mcp_gateway.d.ts +35 -0
- package/dist/skills/builtin/mcp_gateway.js +85 -0
- package/dist/skills/builtin/mcp_gateway.js.map +1 -0
- package/dist/skills/builtin/native_vector_search.d.ts +44 -0
- package/dist/skills/builtin/native_vector_search.js +248 -0
- package/dist/skills/builtin/native_vector_search.js.map +1 -0
- package/dist/skills/builtin/play_background_file.d.ts +34 -0
- package/dist/skills/builtin/play_background_file.js +135 -0
- package/dist/skills/builtin/play_background_file.js.map +1 -0
- package/dist/skills/builtin/spider.d.ts +34 -0
- package/dist/skills/builtin/spider.js +164 -0
- package/dist/skills/builtin/spider.js.map +1 -0
- package/dist/skills/builtin/swml_transfer.d.ts +44 -0
- package/dist/skills/builtin/swml_transfer.js +204 -0
- package/dist/skills/builtin/swml_transfer.js.map +1 -0
- package/dist/skills/builtin/weather_api.d.ts +34 -0
- package/dist/skills/builtin/weather_api.js +136 -0
- package/dist/skills/builtin/weather_api.js.map +1 -0
- package/dist/skills/builtin/web_search.d.ts +34 -0
- package/dist/skills/builtin/web_search.js +141 -0
- package/dist/skills/builtin/web_search.js.map +1 -0
- package/dist/skills/builtin/wikipedia_search.d.ts +34 -0
- package/dist/skills/builtin/wikipedia_search.js +166 -0
- package/dist/skills/builtin/wikipedia_search.js.map +1 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.js +10 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/docs/agent-guide.md +869 -0
- package/docs/api-reference.md +2419 -0
- package/docs/architecture.md +843 -0
- package/docs/cli-guide.md +579 -0
- package/docs/configuration.md +422 -0
- package/docs/contexts-guide.md +787 -0
- package/docs/datamap-guide.md +1141 -0
- package/docs/prefabs-guide.md +830 -0
- package/docs/security.md +436 -0
- package/docs/serverless-guide.md +513 -0
- package/docs/skills-guide.md +845 -0
- package/docs/swaig-reference.md +1627 -0
- package/examples/call-flow.ts +60 -0
- package/examples/contexts-steps.ts +62 -0
- package/examples/datamap-tools.ts +52 -0
- package/examples/dynamic-config.ts +51 -0
- package/examples/multi-agent.ts +67 -0
- package/examples/pom-prompt.ts +68 -0
- package/examples/simple-agent.ts +33 -0
- package/package.json +35 -0
- package/src/AgentBase.ts +1279 -0
- package/src/AgentServer.ts +149 -0
- package/src/AuthHandler.ts +141 -0
- package/src/ConfigLoader.ts +165 -0
- package/src/ContextBuilder.ts +796 -0
- package/src/DataMap.ts +365 -0
- package/src/Logger.ts +197 -0
- package/src/PomBuilder.ts +298 -0
- package/src/PromptManager.ts +133 -0
- package/src/SchemaUtils.ts +170 -0
- package/src/ServerlessAdapter.ts +218 -0
- package/src/SessionManager.ts +161 -0
- package/src/SslConfig.ts +118 -0
- package/src/SwaigFunction.ts +168 -0
- package/src/SwaigFunctionResult.ts +864 -0
- package/src/SwmlBuilder.ts +62 -0
- package/src/cli/agent-loader.ts +122 -0
- package/src/cli/mock-data.ts +110 -0
- package/src/cli/swaig-test.ts +440 -0
- package/src/index.ts +99 -0
- package/src/prefabs/ConciergeAgent.ts +251 -0
- package/src/prefabs/FAQBotAgent.ts +263 -0
- package/src/prefabs/InfoGathererAgent.ts +276 -0
- package/src/prefabs/ReceptionistAgent.ts +277 -0
- package/src/prefabs/SurveyAgent.ts +413 -0
- package/src/prefabs/index.ts +23 -0
- package/src/skills/SkillBase.ts +184 -0
- package/src/skills/SkillManager.ts +177 -0
- package/src/skills/SkillRegistry.ts +231 -0
- package/src/skills/builtin/api_ninjas_trivia.ts +230 -0
- package/src/skills/builtin/claude_skills.ts +239 -0
- package/src/skills/builtin/custom_skills.ts +326 -0
- package/src/skills/builtin/datasphere.ts +225 -0
- package/src/skills/builtin/datasphere_serverless.ts +194 -0
- package/src/skills/builtin/datetime.ts +115 -0
- package/src/skills/builtin/google_maps.ts +347 -0
- package/src/skills/builtin/index.ts +79 -0
- package/src/skills/builtin/info_gatherer.ts +331 -0
- package/src/skills/builtin/joke.ts +180 -0
- package/src/skills/builtin/math.ts +150 -0
- package/src/skills/builtin/mcp_gateway.ts +99 -0
- package/src/skills/builtin/native_vector_search.ts +327 -0
- package/src/skills/builtin/play_background_file.ts +189 -0
- package/src/skills/builtin/spider.ts +232 -0
- package/src/skills/builtin/swml_transfer.ts +285 -0
- package/src/skills/builtin/weather_api.ts +193 -0
- package/src/skills/builtin/web_search.ts +212 -0
- package/src/skills/builtin/wikipedia_search.ts +248 -0
- package/src/skills/index.ts +12 -0
- package/src/types.ts +99 -0
- package/tests/AgentBase.test.ts +693 -0
- package/tests/AgentServer.test.ts +102 -0
- package/tests/AuthHandler.test.ts +121 -0
- package/tests/ConfigLoader.test.ts +121 -0
- package/tests/DataMap.test.ts +286 -0
- package/tests/Logger.test.ts +218 -0
- package/tests/PomBuilder.test.ts +164 -0
- package/tests/ProxyDetection.test.ts +185 -0
- package/tests/SchemaUtils.test.ts +106 -0
- package/tests/ServerlessAdapter.test.ts +200 -0
- package/tests/SessionManager.test.ts +139 -0
- package/tests/SslConfig.test.ts +97 -0
- package/tests/SwaigFunctionResult.test.ts +298 -0
- package/tests/cli/mock-data.test.ts +94 -0
- package/tests/cli/swaig-test.test.ts +96 -0
- package/tests/prefabs/prefabs.test.ts +854 -0
- package/tests/setup.ts +6 -0
- package/tests/skills/SkillBase.test.ts +118 -0
- package/tests/skills/SkillManager.test.ts +164 -0
- package/tests/skills/SkillRegistry.test.ts +124 -0
- package/tests/skills/builtin.test.ts +924 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWML Transfer Skill - Transfers calls using SWML transfer actions.
|
|
3
|
+
*
|
|
4
|
+
* Tier 2 built-in skill: no external dependencies required.
|
|
5
|
+
* Supports both direct destination transfers and named pattern-based transfers.
|
|
6
|
+
* Named patterns allow configuring a set of known transfer destinations
|
|
7
|
+
* that the AI can use by name rather than requiring raw phone numbers or SIP URIs.
|
|
8
|
+
*/
|
|
9
|
+
import { SkillBase } from '../SkillBase.js';
|
|
10
|
+
import type { SkillManifest, SkillToolDefinition, SkillPromptSection, SkillConfig } from '../SkillBase.js';
|
|
11
|
+
/**
|
|
12
|
+
* Transfers calls using SWML transfer actions.
|
|
13
|
+
*
|
|
14
|
+
* Tier 2 built-in skill with no external dependencies. Supports both direct
|
|
15
|
+
* destination transfers and named pattern-based transfers configured via the
|
|
16
|
+
* `patterns` config array. Optionally restricts to named destinations only
|
|
17
|
+
* via `allow_arbitrary`.
|
|
18
|
+
*/
|
|
19
|
+
export declare class SwmlTransferSkill extends SkillBase {
|
|
20
|
+
/**
|
|
21
|
+
* @param config - Optional configuration; supports `patterns`, `allow_arbitrary`, `default_message`.
|
|
22
|
+
*/
|
|
23
|
+
constructor(config?: SkillConfig);
|
|
24
|
+
/** @returns Manifest with config schema for patterns, allow_arbitrary, and default_message. */
|
|
25
|
+
getManifest(): SkillManifest;
|
|
26
|
+
/** @returns A `transfer_call` tool, plus `list_transfer_destinations` when patterns are configured. */
|
|
27
|
+
getTools(): SkillToolDefinition[];
|
|
28
|
+
/** @returns Prompt section describing call transfer capabilities and available destinations. */
|
|
29
|
+
getPromptSections(): SkillPromptSection[];
|
|
30
|
+
/**
|
|
31
|
+
* Build the tool description based on available patterns.
|
|
32
|
+
*/
|
|
33
|
+
private _buildTransferDescription;
|
|
34
|
+
/**
|
|
35
|
+
* Build the destination parameter description based on available patterns.
|
|
36
|
+
*/
|
|
37
|
+
private _buildDestinationDescription;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Factory function for creating SwmlTransferSkill instances.
|
|
41
|
+
* @param config - Optional skill configuration.
|
|
42
|
+
* @returns A new SwmlTransferSkill instance.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createSkill(config?: SkillConfig): SwmlTransferSkill;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWML Transfer Skill - Transfers calls using SWML transfer actions.
|
|
3
|
+
*
|
|
4
|
+
* Tier 2 built-in skill: no external dependencies required.
|
|
5
|
+
* Supports both direct destination transfers and named pattern-based transfers.
|
|
6
|
+
* Named patterns allow configuring a set of known transfer destinations
|
|
7
|
+
* that the AI can use by name rather than requiring raw phone numbers or SIP URIs.
|
|
8
|
+
*/
|
|
9
|
+
import { SkillBase } from '../SkillBase.js';
|
|
10
|
+
import { SwaigFunctionResult } from '../../SwaigFunctionResult.js';
|
|
11
|
+
/**
|
|
12
|
+
* Transfers calls using SWML transfer actions.
|
|
13
|
+
*
|
|
14
|
+
* Tier 2 built-in skill with no external dependencies. Supports both direct
|
|
15
|
+
* destination transfers and named pattern-based transfers configured via the
|
|
16
|
+
* `patterns` config array. Optionally restricts to named destinations only
|
|
17
|
+
* via `allow_arbitrary`.
|
|
18
|
+
*/
|
|
19
|
+
export class SwmlTransferSkill extends SkillBase {
|
|
20
|
+
/**
|
|
21
|
+
* @param config - Optional configuration; supports `patterns`, `allow_arbitrary`, `default_message`.
|
|
22
|
+
*/
|
|
23
|
+
constructor(config) {
|
|
24
|
+
super('swml_transfer', config);
|
|
25
|
+
}
|
|
26
|
+
/** @returns Manifest with config schema for patterns, allow_arbitrary, and default_message. */
|
|
27
|
+
getManifest() {
|
|
28
|
+
return {
|
|
29
|
+
name: 'swml_transfer',
|
|
30
|
+
description: 'Transfers calls using SWML transfer actions. Supports direct destination transfers and named pattern-based routing.',
|
|
31
|
+
version: '1.0.0',
|
|
32
|
+
author: 'SignalWire',
|
|
33
|
+
tags: ['call-control', 'transfer', 'swml', 'routing'],
|
|
34
|
+
configSchema: {
|
|
35
|
+
patterns: {
|
|
36
|
+
type: 'array',
|
|
37
|
+
description: 'Array of named transfer patterns: { name, destination, description? }. When configured, the AI can transfer to named destinations.',
|
|
38
|
+
items: {
|
|
39
|
+
type: 'object',
|
|
40
|
+
properties: {
|
|
41
|
+
name: { type: 'string', description: 'Friendly name for the destination.' },
|
|
42
|
+
destination: { type: 'string', description: 'SIP URI, phone number, or agent URL.' },
|
|
43
|
+
description: { type: 'string', description: 'Optional description of this destination.' },
|
|
44
|
+
},
|
|
45
|
+
required: ['name', 'destination'],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
allow_arbitrary: {
|
|
49
|
+
type: 'boolean',
|
|
50
|
+
description: 'Whether to allow transfers to arbitrary destinations not in the patterns list. Defaults to true if no patterns are configured, false if patterns are configured.',
|
|
51
|
+
},
|
|
52
|
+
default_message: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'Default message to say before transferring. Defaults to "Transferring your call now.".',
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** @returns A `transfer_call` tool, plus `list_transfer_destinations` when patterns are configured. */
|
|
60
|
+
getTools() {
|
|
61
|
+
const patterns = this.getConfig('patterns', []);
|
|
62
|
+
const defaultMessage = this.getConfig('default_message', 'Transferring your call now.');
|
|
63
|
+
const allowArbitrary = this.getConfig('allow_arbitrary', undefined);
|
|
64
|
+
// If patterns are defined and allow_arbitrary is not explicitly set, default to false
|
|
65
|
+
const canUseArbitrary = allowArbitrary !== undefined
|
|
66
|
+
? allowArbitrary
|
|
67
|
+
: patterns.length === 0;
|
|
68
|
+
// Build the pattern lookup map
|
|
69
|
+
const patternMap = new Map();
|
|
70
|
+
for (const pattern of patterns) {
|
|
71
|
+
patternMap.set(pattern.name.toLowerCase(), pattern);
|
|
72
|
+
}
|
|
73
|
+
const tools = [
|
|
74
|
+
{
|
|
75
|
+
name: 'transfer_call',
|
|
76
|
+
description: this._buildTransferDescription(patterns, canUseArbitrary),
|
|
77
|
+
parameters: {
|
|
78
|
+
destination: {
|
|
79
|
+
type: 'string',
|
|
80
|
+
description: this._buildDestinationDescription(patterns, canUseArbitrary),
|
|
81
|
+
},
|
|
82
|
+
message: {
|
|
83
|
+
type: 'string',
|
|
84
|
+
description: 'An optional message to say to the caller before the transfer. If not provided, a default transfer message is used.',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ['destination'],
|
|
88
|
+
handler: (args) => {
|
|
89
|
+
const destination = args.destination;
|
|
90
|
+
const message = args.message ?? defaultMessage;
|
|
91
|
+
if (!destination ||
|
|
92
|
+
typeof destination !== 'string' ||
|
|
93
|
+
destination.trim().length === 0) {
|
|
94
|
+
return new SwaigFunctionResult('Please specify a destination for the transfer.');
|
|
95
|
+
}
|
|
96
|
+
const trimmedDest = destination.trim();
|
|
97
|
+
// Check if this matches a named pattern
|
|
98
|
+
const matchedPattern = patternMap.get(trimmedDest.toLowerCase());
|
|
99
|
+
if (matchedPattern) {
|
|
100
|
+
const result = new SwaigFunctionResult(message);
|
|
101
|
+
result.swmlTransfer(matchedPattern.destination, message);
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
// No matching pattern - check if arbitrary transfers are allowed
|
|
105
|
+
if (!canUseArbitrary) {
|
|
106
|
+
const availableNames = patterns
|
|
107
|
+
.map((p) => `"${p.name}"`)
|
|
108
|
+
.join(', ');
|
|
109
|
+
return new SwaigFunctionResult(`Unknown transfer destination "${trimmedDest}". Available destinations: ${availableNames}.`);
|
|
110
|
+
}
|
|
111
|
+
// Arbitrary transfer
|
|
112
|
+
const result = new SwaigFunctionResult(message);
|
|
113
|
+
result.swmlTransfer(trimmedDest, message);
|
|
114
|
+
return result;
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
// Add a list_destinations tool if patterns are configured
|
|
119
|
+
if (patterns.length > 0) {
|
|
120
|
+
tools.push({
|
|
121
|
+
name: 'list_transfer_destinations',
|
|
122
|
+
description: 'List all available named transfer destinations that calls can be routed to.',
|
|
123
|
+
parameters: {},
|
|
124
|
+
handler: () => {
|
|
125
|
+
const lines = patterns.map((p) => {
|
|
126
|
+
const desc = p.description ? ` - ${p.description}` : '';
|
|
127
|
+
return `${p.name}${desc}`;
|
|
128
|
+
});
|
|
129
|
+
return new SwaigFunctionResult(`Available transfer destinations:\n${lines.join('\n')}`);
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return tools;
|
|
134
|
+
}
|
|
135
|
+
/** @returns Prompt section describing call transfer capabilities and available destinations. */
|
|
136
|
+
getPromptSections() {
|
|
137
|
+
const patterns = this.getConfig('patterns', []);
|
|
138
|
+
const allowArbitrary = this.getConfig('allow_arbitrary', undefined);
|
|
139
|
+
const canUseArbitrary = allowArbitrary !== undefined
|
|
140
|
+
? allowArbitrary
|
|
141
|
+
: patterns.length === 0;
|
|
142
|
+
const bullets = [
|
|
143
|
+
'Use the transfer_call tool to transfer the current call to another destination.',
|
|
144
|
+
'You can optionally provide a message to say to the caller before the transfer.',
|
|
145
|
+
];
|
|
146
|
+
if (patterns.length > 0) {
|
|
147
|
+
const patternNames = patterns.map((p) => `"${p.name}"`).join(', ');
|
|
148
|
+
bullets.push(`Named transfer destinations are available: ${patternNames}. Use these names as the destination.`);
|
|
149
|
+
for (const pattern of patterns) {
|
|
150
|
+
if (pattern.description) {
|
|
151
|
+
bullets.push(`${pattern.name}: ${pattern.description}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (canUseArbitrary) {
|
|
155
|
+
bullets.push('You can also transfer to arbitrary phone numbers or SIP URIs.');
|
|
156
|
+
}
|
|
157
|
+
bullets.push('Use list_transfer_destinations to see all available named destinations.');
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
bullets.push('Provide a phone number, SIP URI, or agent URL as the transfer destination.');
|
|
161
|
+
}
|
|
162
|
+
return [
|
|
163
|
+
{
|
|
164
|
+
title: 'Call Transfer',
|
|
165
|
+
body: 'You can transfer the current call to another destination.',
|
|
166
|
+
bullets,
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build the tool description based on available patterns.
|
|
172
|
+
*/
|
|
173
|
+
_buildTransferDescription(patterns, canUseArbitrary) {
|
|
174
|
+
if (patterns.length === 0) {
|
|
175
|
+
return 'Transfer the current call to a specified destination (phone number, SIP URI, or agent URL).';
|
|
176
|
+
}
|
|
177
|
+
const names = patterns.map((p) => `"${p.name}"`).join(', ');
|
|
178
|
+
const base = `Transfer the current call. Named destinations: ${names}.`;
|
|
179
|
+
return canUseArbitrary
|
|
180
|
+
? `${base} You may also use arbitrary phone numbers or SIP URIs.`
|
|
181
|
+
: base;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Build the destination parameter description based on available patterns.
|
|
185
|
+
*/
|
|
186
|
+
_buildDestinationDescription(patterns, canUseArbitrary) {
|
|
187
|
+
if (patterns.length === 0) {
|
|
188
|
+
return 'The transfer destination: a phone number (e.g., +15551234567), SIP URI, or agent URL.';
|
|
189
|
+
}
|
|
190
|
+
const names = patterns.map((p) => `"${p.name}"`).join(', ');
|
|
191
|
+
return canUseArbitrary
|
|
192
|
+
? `A named destination (${names}) or an arbitrary phone number / SIP URI.`
|
|
193
|
+
: `One of the named destinations: ${names}.`;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Factory function for creating SwmlTransferSkill instances.
|
|
198
|
+
* @param config - Optional skill configuration.
|
|
199
|
+
* @returns A new SwmlTransferSkill instance.
|
|
200
|
+
*/
|
|
201
|
+
export function createSkill(config) {
|
|
202
|
+
return new SwmlTransferSkill(config);
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=swml_transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swml_transfer.js","sourceRoot":"","sources":["../../../src/skills/builtin/swml_transfer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAYnE;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C;;OAEG;IACH,YAAY,MAAoB;QAC9B,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,+FAA+F;IAC/F,WAAW;QACT,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,WAAW,EACT,qHAAqH;YACvH,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC;YACrD,YAAY,EAAE;gBACZ,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,oIAAoI;oBACtI,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;4BAC3E,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;4BACpF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;yBAC1F;wBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;qBAClC;iBACF;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,SAAS;oBACf,WAAW,EACT,kKAAkK;iBACrK;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,wFAAwF;iBAC3F;aACF;SACF,CAAC;IACJ,CAAC;IAED,uGAAuG;IACvG,QAAQ;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAoB,UAAU,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CACnC,iBAAiB,EACjB,6BAA6B,CAC9B,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CACnC,iBAAiB,EACjB,SAAS,CACV,CAAC;QAEF,sFAAsF;QACtF,MAAM,eAAe,GACnB,cAAc,KAAK,SAAS;YAC1B,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAE5B,+BAA+B;QAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;QACtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,KAAK,GAA0B;YACnC;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,eAAe,CAAC;gBACtE,UAAU,EAAE;oBACV,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,eAAe,CAAC;qBAC1E;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,oHAAoH;qBACvH;iBACF;gBACD,QAAQ,EAAE,CAAC,aAAa,CAAC;gBACzB,OAAO,EAAE,CAAC,IAA6B,EAAE,EAAE;oBACzC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAiC,CAAC;oBAC3D,MAAM,OAAO,GAAI,IAAI,CAAC,OAA8B,IAAI,cAAc,CAAC;oBAEvE,IACE,CAAC,WAAW;wBACZ,OAAO,WAAW,KAAK,QAAQ;wBAC/B,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC/B,CAAC;wBACD,OAAO,IAAI,mBAAmB,CAC5B,gDAAgD,CACjD,CAAC;oBACJ,CAAC;oBAED,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;oBAEvC,wCAAwC;oBACxC,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;oBAEjE,IAAI,cAAc,EAAE,CAAC;wBACnB,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;wBAChD,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;wBACzD,OAAO,MAAM,CAAC;oBAChB,CAAC;oBAED,iEAAiE;oBACjE,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,MAAM,cAAc,GAAG,QAAQ;6BAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;6BACzB,IAAI,CAAC,IAAI,CAAC,CAAC;wBACd,OAAO,IAAI,mBAAmB,CAC5B,iCAAiC,WAAW,8BAA8B,cAAc,GAAG,CAC5F,CAAC;oBACJ,CAAC;oBAED,qBAAqB;oBACrB,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;oBAChD,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBAC1C,OAAO,MAAM,CAAC;gBAChB,CAAC;aACF;SACF,CAAC;QAEF,0DAA0D;QAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,4BAA4B;gBAClC,WAAW,EACT,6EAA6E;gBAC/E,UAAU,EAAE,EAAE;gBACd,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxD,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;oBAC5B,CAAC,CAAC,CAAC;oBAEH,OAAO,IAAI,mBAAmB,CAC5B,qCAAqC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxD,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gGAAgG;IAChG,iBAAiB;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAoB,UAAU,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CACnC,iBAAiB,EACjB,SAAS,CACV,CAAC;QACF,MAAM,eAAe,GACnB,cAAc,KAAK,SAAS;YAC1B,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAE5B,MAAM,OAAO,GAAa;YACxB,iFAAiF;YACjF,gFAAgF;SACjF,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CACV,8CAA8C,YAAY,uCAAuC,CAClG,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACxB,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CACV,+DAA+D,CAChE,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,IAAI,CACV,yEAAyE,CAC1E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAED,OAAO;YACL;gBACE,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,2DAA2D;gBACjE,OAAO;aACR;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,yBAAyB,CAC/B,QAA2B,EAC3B,eAAwB;QAExB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,6FAA6F,CAAC;QACvG,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,kDAAkD,KAAK,GAAG,CAAC;QACxE,OAAO,eAAe;YACpB,CAAC,CAAC,GAAG,IAAI,wDAAwD;YACjE,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAED;;OAEG;IACK,4BAA4B,CAClC,QAA2B,EAC3B,eAAwB;QAExB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,uFAAuF,CAAC;QACjG,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,eAAe;YACpB,CAAC,CAAC,wBAAwB,KAAK,2CAA2C;YAC1E,CAAC,CAAC,kCAAkC,KAAK,GAAG,CAAC;IACjD,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Weather API Skill - Fetches current weather data from OpenWeatherMap.
|
|
3
|
+
*
|
|
4
|
+
* Tier 2 built-in skill: requires WEATHER_API_KEY environment variable.
|
|
5
|
+
* Uses the OpenWeatherMap API to retrieve current weather conditions
|
|
6
|
+
* for a specified location.
|
|
7
|
+
*/
|
|
8
|
+
import { SkillBase } from '../SkillBase.js';
|
|
9
|
+
import type { SkillManifest, SkillToolDefinition, SkillPromptSection, SkillConfig } from '../SkillBase.js';
|
|
10
|
+
/**
|
|
11
|
+
* Fetches current weather data from OpenWeatherMap for any location worldwide.
|
|
12
|
+
*
|
|
13
|
+
* Tier 2 built-in skill. Requires the `WEATHER_API_KEY` environment variable
|
|
14
|
+
* containing a valid OpenWeatherMap API key. Supports metric, imperial, and
|
|
15
|
+
* standard temperature units via the `units` config option.
|
|
16
|
+
*/
|
|
17
|
+
export declare class WeatherApiSkill extends SkillBase {
|
|
18
|
+
/**
|
|
19
|
+
* @param config - Optional configuration; supports `units` ("metric"|"imperial"|"standard").
|
|
20
|
+
*/
|
|
21
|
+
constructor(config?: SkillConfig);
|
|
22
|
+
/** @returns Manifest declaring WEATHER_API_KEY as required and config schema for units. */
|
|
23
|
+
getManifest(): SkillManifest;
|
|
24
|
+
/** @returns A single `get_weather` tool that fetches current weather for a location. */
|
|
25
|
+
getTools(): SkillToolDefinition[];
|
|
26
|
+
/** @returns Prompt section describing weather lookup capabilities and configured units. */
|
|
27
|
+
getPromptSections(): SkillPromptSection[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Factory function for creating WeatherApiSkill instances.
|
|
31
|
+
* @param config - Optional skill configuration.
|
|
32
|
+
* @returns A new WeatherApiSkill instance.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createSkill(config?: SkillConfig): WeatherApiSkill;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Weather API Skill - Fetches current weather data from OpenWeatherMap.
|
|
3
|
+
*
|
|
4
|
+
* Tier 2 built-in skill: requires WEATHER_API_KEY environment variable.
|
|
5
|
+
* Uses the OpenWeatherMap API to retrieve current weather conditions
|
|
6
|
+
* for a specified location.
|
|
7
|
+
*/
|
|
8
|
+
import { SkillBase } from '../SkillBase.js';
|
|
9
|
+
import { SwaigFunctionResult } from '../../SwaigFunctionResult.js';
|
|
10
|
+
/**
|
|
11
|
+
* Fetches current weather data from OpenWeatherMap for any location worldwide.
|
|
12
|
+
*
|
|
13
|
+
* Tier 2 built-in skill. Requires the `WEATHER_API_KEY` environment variable
|
|
14
|
+
* containing a valid OpenWeatherMap API key. Supports metric, imperial, and
|
|
15
|
+
* standard temperature units via the `units` config option.
|
|
16
|
+
*/
|
|
17
|
+
export class WeatherApiSkill extends SkillBase {
|
|
18
|
+
/**
|
|
19
|
+
* @param config - Optional configuration; supports `units` ("metric"|"imperial"|"standard").
|
|
20
|
+
*/
|
|
21
|
+
constructor(config) {
|
|
22
|
+
super('weather_api', config);
|
|
23
|
+
}
|
|
24
|
+
/** @returns Manifest declaring WEATHER_API_KEY as required and config schema for units. */
|
|
25
|
+
getManifest() {
|
|
26
|
+
return {
|
|
27
|
+
name: 'weather_api',
|
|
28
|
+
description: 'Fetches current weather data from OpenWeatherMap for any location worldwide.',
|
|
29
|
+
version: '1.0.0',
|
|
30
|
+
author: 'SignalWire',
|
|
31
|
+
tags: ['weather', 'api', 'openweathermap', 'external'],
|
|
32
|
+
requiredEnvVars: ['WEATHER_API_KEY'],
|
|
33
|
+
configSchema: {
|
|
34
|
+
units: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Temperature units: "metric" (Celsius), "imperial" (Fahrenheit), or "standard" (Kelvin).',
|
|
37
|
+
default: 'metric',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** @returns A single `get_weather` tool that fetches current weather for a location. */
|
|
43
|
+
getTools() {
|
|
44
|
+
const units = this.getConfig('units', 'metric');
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
name: 'get_weather',
|
|
48
|
+
description: 'Get the current weather conditions for a specified location. Returns temperature, humidity, wind speed, and weather description.',
|
|
49
|
+
parameters: {
|
|
50
|
+
location: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: 'The city name, optionally with country code (e.g., "London", "Paris,FR", "New York,US").',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
required: ['location'],
|
|
56
|
+
handler: async (args) => {
|
|
57
|
+
const location = args.location;
|
|
58
|
+
if (!location || typeof location !== 'string' || location.trim().length === 0) {
|
|
59
|
+
return new SwaigFunctionResult('Please provide a location to get the weather for.');
|
|
60
|
+
}
|
|
61
|
+
const apiKey = process.env['WEATHER_API_KEY'];
|
|
62
|
+
if (!apiKey) {
|
|
63
|
+
return new SwaigFunctionResult('Weather service is not configured. The WEATHER_API_KEY environment variable is missing.');
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const encodedLocation = encodeURIComponent(location.trim());
|
|
67
|
+
const url = `https://api.openweathermap.org/data/2.5/weather?q=${encodedLocation}&appid=${apiKey}&units=${units}`;
|
|
68
|
+
const response = await fetch(url);
|
|
69
|
+
const data = (await response.json());
|
|
70
|
+
if (!response.ok || data.cod !== 200) {
|
|
71
|
+
const errorMessage = data.message ?? `HTTP ${response.status}`;
|
|
72
|
+
return new SwaigFunctionResult(`Could not retrieve weather for "${location}": ${errorMessage}. Please check the location name and try again.`);
|
|
73
|
+
}
|
|
74
|
+
const unitLabel = units === 'imperial' ? 'F' : units === 'standard' ? 'K' : 'C';
|
|
75
|
+
const speedUnit = units === 'imperial' ? 'mph' : 'm/s';
|
|
76
|
+
const weatherDesc = data.weather.length > 0
|
|
77
|
+
? data.weather.map((w) => w.description).join(', ')
|
|
78
|
+
: 'unknown';
|
|
79
|
+
const parts = [
|
|
80
|
+
`Weather for ${data.name}, ${data.sys.country}:`,
|
|
81
|
+
`Conditions: ${weatherDesc}.`,
|
|
82
|
+
`Temperature: ${data.main.temp}\u00B0${unitLabel} (feels like ${data.main.feels_like}\u00B0${unitLabel}).`,
|
|
83
|
+
`High: ${data.main.temp_max}\u00B0${unitLabel}, Low: ${data.main.temp_min}\u00B0${unitLabel}.`,
|
|
84
|
+
`Humidity: ${data.main.humidity}%.`,
|
|
85
|
+
`Wind: ${data.wind.speed} ${speedUnit}.`,
|
|
86
|
+
`Pressure: ${data.main.pressure} hPa.`,
|
|
87
|
+
];
|
|
88
|
+
if (data.visibility !== undefined) {
|
|
89
|
+
const visKm = (data.visibility / 1000).toFixed(1);
|
|
90
|
+
parts.push(`Visibility: ${visKm} km.`);
|
|
91
|
+
}
|
|
92
|
+
if (data.clouds?.all !== undefined) {
|
|
93
|
+
parts.push(`Cloud cover: ${data.clouds.all}%.`);
|
|
94
|
+
}
|
|
95
|
+
return new SwaigFunctionResult(parts.join(' '));
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
99
|
+
return new SwaigFunctionResult(`Failed to fetch weather data for "${location}": ${message}`);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
/** @returns Prompt section describing weather lookup capabilities and configured units. */
|
|
106
|
+
getPromptSections() {
|
|
107
|
+
const units = this.getConfig('units', 'metric');
|
|
108
|
+
const unitDesc = units === 'imperial'
|
|
109
|
+
? 'Fahrenheit'
|
|
110
|
+
: units === 'standard'
|
|
111
|
+
? 'Kelvin'
|
|
112
|
+
: 'Celsius';
|
|
113
|
+
return [
|
|
114
|
+
{
|
|
115
|
+
title: 'Weather Information',
|
|
116
|
+
body: 'You can look up current weather conditions for any location worldwide.',
|
|
117
|
+
bullets: [
|
|
118
|
+
'Use the get_weather tool when a user asks about current weather conditions.',
|
|
119
|
+
'You can specify a city name, optionally with a country code (e.g., "London", "Paris,FR").',
|
|
120
|
+
`Temperature is reported in ${unitDesc}.`,
|
|
121
|
+
'The weather data includes temperature, humidity, wind speed, pressure, and general conditions.',
|
|
122
|
+
'If the user asks about a forecast or future weather, let them know you can only provide current conditions.',
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Factory function for creating WeatherApiSkill instances.
|
|
130
|
+
* @param config - Optional skill configuration.
|
|
131
|
+
* @returns A new WeatherApiSkill instance.
|
|
132
|
+
*/
|
|
133
|
+
export function createSkill(config) {
|
|
134
|
+
return new WeatherApiSkill(config);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=weather_api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather_api.js","sourceRoot":"","sources":["../../../src/skills/builtin/weather_api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Search Skill - Searches the web using Google Custom Search API.
|
|
3
|
+
*
|
|
4
|
+
* Tier 3 built-in skill: requires GOOGLE_SEARCH_API_KEY and GOOGLE_SEARCH_CX
|
|
5
|
+
* environment variables. Uses the Google Custom Search JSON API to perform
|
|
6
|
+
* web searches and return formatted results.
|
|
7
|
+
*/
|
|
8
|
+
import { SkillBase } from '../SkillBase.js';
|
|
9
|
+
import type { SkillManifest, SkillToolDefinition, SkillPromptSection, SkillConfig } from '../SkillBase.js';
|
|
10
|
+
/**
|
|
11
|
+
* Searches the web using the Google Custom Search JSON API.
|
|
12
|
+
*
|
|
13
|
+
* Tier 3 built-in skill. Requires `GOOGLE_SEARCH_API_KEY` and `GOOGLE_SEARCH_CX`
|
|
14
|
+
* environment variables. Supports `max_results` (1-10) and `safe_search`
|
|
15
|
+
* ("off"|"medium"|"high") config options.
|
|
16
|
+
*/
|
|
17
|
+
export declare class WebSearchSkill extends SkillBase {
|
|
18
|
+
/**
|
|
19
|
+
* @param config - Optional configuration; supports `max_results` and `safe_search`.
|
|
20
|
+
*/
|
|
21
|
+
constructor(config?: SkillConfig);
|
|
22
|
+
/** @returns Manifest declaring GOOGLE_SEARCH_API_KEY and GOOGLE_SEARCH_CX as required. */
|
|
23
|
+
getManifest(): SkillManifest;
|
|
24
|
+
/** @returns A single `web_search` tool that performs a Google search and returns formatted results. */
|
|
25
|
+
getTools(): SkillToolDefinition[];
|
|
26
|
+
/** @returns Prompt section describing web search capabilities and usage guidance. */
|
|
27
|
+
getPromptSections(): SkillPromptSection[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Factory function for creating WebSearchSkill instances.
|
|
31
|
+
* @param config - Optional skill configuration.
|
|
32
|
+
* @returns A new WebSearchSkill instance.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createSkill(config?: SkillConfig): WebSearchSkill;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Search Skill - Searches the web using Google Custom Search API.
|
|
3
|
+
*
|
|
4
|
+
* Tier 3 built-in skill: requires GOOGLE_SEARCH_API_KEY and GOOGLE_SEARCH_CX
|
|
5
|
+
* environment variables. Uses the Google Custom Search JSON API to perform
|
|
6
|
+
* web searches and return formatted results.
|
|
7
|
+
*/
|
|
8
|
+
import { SkillBase } from '../SkillBase.js';
|
|
9
|
+
import { SwaigFunctionResult } from '../../SwaigFunctionResult.js';
|
|
10
|
+
/**
|
|
11
|
+
* Searches the web using the Google Custom Search JSON API.
|
|
12
|
+
*
|
|
13
|
+
* Tier 3 built-in skill. Requires `GOOGLE_SEARCH_API_KEY` and `GOOGLE_SEARCH_CX`
|
|
14
|
+
* environment variables. Supports `max_results` (1-10) and `safe_search`
|
|
15
|
+
* ("off"|"medium"|"high") config options.
|
|
16
|
+
*/
|
|
17
|
+
export class WebSearchSkill extends SkillBase {
|
|
18
|
+
/**
|
|
19
|
+
* @param config - Optional configuration; supports `max_results` and `safe_search`.
|
|
20
|
+
*/
|
|
21
|
+
constructor(config) {
|
|
22
|
+
super('web_search', config);
|
|
23
|
+
}
|
|
24
|
+
/** @returns Manifest declaring GOOGLE_SEARCH_API_KEY and GOOGLE_SEARCH_CX as required. */
|
|
25
|
+
getManifest() {
|
|
26
|
+
return {
|
|
27
|
+
name: 'web_search',
|
|
28
|
+
description: 'Searches the web using Google Custom Search API and returns formatted results with titles, links, and snippets.',
|
|
29
|
+
version: '1.0.0',
|
|
30
|
+
author: 'SignalWire',
|
|
31
|
+
tags: ['search', 'web', 'google', 'api', 'external'],
|
|
32
|
+
requiredEnvVars: ['GOOGLE_SEARCH_API_KEY', 'GOOGLE_SEARCH_CX'],
|
|
33
|
+
configSchema: {
|
|
34
|
+
max_results: {
|
|
35
|
+
type: 'number',
|
|
36
|
+
description: 'Maximum number of results to return (1-10). Defaults to 5.',
|
|
37
|
+
default: 5,
|
|
38
|
+
},
|
|
39
|
+
safe_search: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Safe search level: "off", "medium", or "high". Defaults to "medium".',
|
|
42
|
+
default: 'medium',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** @returns A single `web_search` tool that performs a Google search and returns formatted results. */
|
|
48
|
+
getTools() {
|
|
49
|
+
const configMaxResults = this.getConfig('max_results', 5);
|
|
50
|
+
const safeSearch = this.getConfig('safe_search', 'medium');
|
|
51
|
+
return [
|
|
52
|
+
{
|
|
53
|
+
name: 'web_search',
|
|
54
|
+
description: 'Search the web for information on any topic. Returns a list of results with titles, links, and brief descriptions.',
|
|
55
|
+
parameters: {
|
|
56
|
+
query: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'The search query to look up on the web.',
|
|
59
|
+
},
|
|
60
|
+
num_results: {
|
|
61
|
+
type: 'number',
|
|
62
|
+
description: `Number of results to return (1-10). Defaults to ${configMaxResults}.`,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
required: ['query'],
|
|
66
|
+
handler: async (args) => {
|
|
67
|
+
const query = args.query;
|
|
68
|
+
const numResults = args.num_results;
|
|
69
|
+
if (!query || typeof query !== 'string' || query.trim().length === 0) {
|
|
70
|
+
return new SwaigFunctionResult('Please provide a search query.');
|
|
71
|
+
}
|
|
72
|
+
const apiKey = process.env['GOOGLE_SEARCH_API_KEY'];
|
|
73
|
+
const cx = process.env['GOOGLE_SEARCH_CX'];
|
|
74
|
+
if (!apiKey || !cx) {
|
|
75
|
+
return new SwaigFunctionResult('Web search is not configured. The GOOGLE_SEARCH_API_KEY and GOOGLE_SEARCH_CX environment variables are required.');
|
|
76
|
+
}
|
|
77
|
+
const count = Math.max(1, Math.min(10, numResults ?? configMaxResults));
|
|
78
|
+
try {
|
|
79
|
+
const encodedQuery = encodeURIComponent(query.trim());
|
|
80
|
+
const safeParam = safeSearch !== 'off' ? `&safe=${safeSearch}` : '';
|
|
81
|
+
const url = `https://www.googleapis.com/customsearch/v1` +
|
|
82
|
+
`?key=${apiKey}&cx=${cx}&q=${encodedQuery}&num=${count}${safeParam}`;
|
|
83
|
+
const response = await fetch(url);
|
|
84
|
+
const data = (await response.json());
|
|
85
|
+
if (data.error) {
|
|
86
|
+
return new SwaigFunctionResult(`Web search failed: ${data.error.message}`);
|
|
87
|
+
}
|
|
88
|
+
if (!data.items || data.items.length === 0) {
|
|
89
|
+
return new SwaigFunctionResult(`No results found for "${query}".`);
|
|
90
|
+
}
|
|
91
|
+
const totalResults = data.searchInformation?.formattedTotalResults ?? 'unknown';
|
|
92
|
+
const searchTime = data.searchInformation?.formattedSearchTime ?? 'unknown';
|
|
93
|
+
const parts = [
|
|
94
|
+
`Web search results for "${query}" (${totalResults} results in ${searchTime} seconds):`,
|
|
95
|
+
'',
|
|
96
|
+
];
|
|
97
|
+
for (let i = 0; i < data.items.length; i++) {
|
|
98
|
+
const item = data.items[i];
|
|
99
|
+
parts.push(`${i + 1}. ${item.title}`);
|
|
100
|
+
parts.push(` URL: ${item.link}`);
|
|
101
|
+
if (item.snippet) {
|
|
102
|
+
parts.push(` ${item.snippet.replace(/\n/g, ' ').trim()}`);
|
|
103
|
+
}
|
|
104
|
+
parts.push('');
|
|
105
|
+
}
|
|
106
|
+
return new SwaigFunctionResult(parts.join('\n').trim());
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
110
|
+
return new SwaigFunctionResult(`Failed to perform web search for "${query}": ${message}`);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
/** @returns Prompt section describing web search capabilities and usage guidance. */
|
|
117
|
+
getPromptSections() {
|
|
118
|
+
return [
|
|
119
|
+
{
|
|
120
|
+
title: 'Web Search',
|
|
121
|
+
body: 'You can search the web for current information on any topic.',
|
|
122
|
+
bullets: [
|
|
123
|
+
'Use the web_search tool when the user asks about current events, facts, or any information you may not have.',
|
|
124
|
+
'You can specify the number of results to return (1-10).',
|
|
125
|
+
'Results include titles, URLs, and brief descriptions/snippets.',
|
|
126
|
+
'If a search returns no results, try rephrasing the query or using different terms.',
|
|
127
|
+
'Summarize the search results for the user rather than reading them verbatim.',
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Factory function for creating WebSearchSkill instances.
|
|
135
|
+
* @param config - Optional skill configuration.
|
|
136
|
+
* @returns A new WebSearchSkill instance.
|
|
137
|
+
*/
|
|
138
|
+
export function createSkill(config) {
|
|
139
|
+
return new WebSearchSkill(config);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=web_search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web_search.js","sourceRoot":"","sources":["../../../src/skills/builtin/web_search.ts"],"names":[],"mappings":"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"}
|