machinaos 0.0.10 → 0.0.13
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/.env.template +16 -0
- package/client/package.json +1 -1
- package/client/src/Dashboard.tsx +3 -3
- package/client/src/components/AIAgentNode.tsx +24 -12
- package/client/src/components/OutputPanel.tsx +3 -2
- package/client/src/components/parameterPanel/InputSection.tsx +16 -3
- package/client/src/nodeDefinitions/aiAgentNodes.ts +12 -0
- package/client/src/nodeDefinitions/specializedAgentNodes.ts +68 -320
- package/client/src/nodeDefinitions/toolNodes.ts +87 -1
- package/client/src/nodeDefinitions/workflowNodes.ts +55 -1
- package/package.json +12 -3
- package/scripts/daemon.js +427 -0
- package/scripts/start.js +7 -1
- package/scripts/sync-version.js +108 -0
- package/server/Dockerfile +6 -7
- package/server/constants.py +2 -0
- package/server/core/cleanup.py +123 -0
- package/server/core/config.py +16 -0
- package/server/core/database.py +92 -1
- package/server/core/health.py +121 -0
- package/server/examples/__init__.py +1 -0
- package/server/gunicorn.conf.py +46 -0
- package/server/main.py +38 -3
- package/server/models/database.py +1 -0
- package/server/models/nodes.py +18 -2
- package/server/requirements-docker.txt +86 -0
- package/server/routers/database.py +16 -0
- package/server/routers/websocket.py +6 -5
- package/server/services/ai.py +115 -14
- package/server/services/auth.py +6 -1
- package/server/services/deployment/manager.py +14 -0
- package/server/services/event_waiter.py +55 -0
- package/server/services/example_loader.py +60 -0
- package/server/services/execution/executor.py +2 -0
- package/server/services/execution/models.py +8 -0
- package/server/services/handlers/__init__.py +2 -0
- package/server/services/handlers/ai.py +164 -11
- package/server/services/handlers/document.py +13 -4
- package/server/services/handlers/tools.py +445 -14
- package/server/services/node_executor.py +3 -0
- package/server/services/temporal/activities.py +3 -0
- package/server/services/workflow.py +2 -0
- package/server/skills/android_agent/app-launcher-skill/SKILL.md +137 -0
- package/server/skills/android_agent/app-list-skill/SKILL.md +148 -0
- package/server/skills/android_agent/audio-skill/SKILL.md +169 -0
- package/server/skills/android_agent/battery-skill/SKILL.md +114 -0
- package/server/skills/android_agent/bluetooth-skill/SKILL.md +151 -0
- package/server/skills/android_agent/camera-skill/SKILL.md +148 -0
- package/server/skills/android_agent/environmental-skill/SKILL.md +140 -0
- package/server/skills/android_agent/location-skill/SKILL.md +163 -0
- package/server/skills/android_agent/motion-skill/SKILL.md +141 -0
- package/server/skills/android_agent/screen-control-skill/SKILL.md +164 -0
- package/server/skills/android_agent/wifi-skill/SKILL.md +182 -0
- package/server/skills/assistant/subagent-skill/SKILL.md +205 -0
- package/server/skills/coding_agent/javascript-skill/SKILL.md +196 -0
- package/server/skills/coding_agent/python-skill/SKILL.md +165 -0
- package/server/skills/social_agent/whatsapp-db-skill/SKILL.md +284 -0
- package/server/skills/social_agent/whatsapp-send-skill/SKILL.md +180 -0
- package/server/skills/task_agent/cron-scheduler-skill/SKILL.md +215 -0
- package/server/skills/task_agent/task-manager-skill/SKILL.md +251 -0
- package/server/skills/task_agent/timer-skill/SKILL.md +168 -0
- package/server/skills/travel_agent/geocoding-skill/SKILL.md +186 -0
- package/server/skills/travel_agent/nearby-places-skill/SKILL.md +234 -0
- package/server/skills/web_agent/http-request-skill/SKILL.md +211 -0
- package/server/skills/android/skill/SKILL.md +0 -84
- package/server/skills/assistant/code-skill/SKILL.md +0 -176
- package/server/skills/assistant/http-skill/SKILL.md +0 -163
- package/server/skills/assistant/maps-skill/SKILL.md +0 -172
- package/server/skills/assistant/scheduler-skill/SKILL.md +0 -86
- package/server/skills/assistant/whatsapp-skill/SKILL.md +0 -285
- /package/server/skills/{android → android_agent}/personality/SKILL.md +0 -0
- /package/server/skills/{assistant → web_agent}/web-search-skill/SKILL.md +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: timer-skill
|
|
3
|
+
description: Set one-time delayed timers. Execute actions after a specified duration (seconds, minutes, hours, days).
|
|
4
|
+
allowed-tools: timer
|
|
5
|
+
metadata:
|
|
6
|
+
author: machina
|
|
7
|
+
version: "1.0"
|
|
8
|
+
category: automation
|
|
9
|
+
icon: "⏱️"
|
|
10
|
+
color: "#10B981"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Timer Tool
|
|
14
|
+
|
|
15
|
+
Set one-time delayed execution timers.
|
|
16
|
+
|
|
17
|
+
## How It Works
|
|
18
|
+
|
|
19
|
+
This skill provides instructions for the **Timer** tool node. Connect the **Timer** node to Zeenie's `input-tools` handle to enable timed delays.
|
|
20
|
+
|
|
21
|
+
## timer Tool
|
|
22
|
+
|
|
23
|
+
Create a one-time timer that triggers after a specified duration.
|
|
24
|
+
|
|
25
|
+
### Schema Fields
|
|
26
|
+
|
|
27
|
+
| Field | Type | Required | Description |
|
|
28
|
+
|-------|------|----------|-------------|
|
|
29
|
+
| duration | number | Yes | Time value for the delay |
|
|
30
|
+
| unit | string | Yes | Time unit: `"seconds"`, `"minutes"`, `"hours"`, `"days"` |
|
|
31
|
+
|
|
32
|
+
### Time Units
|
|
33
|
+
|
|
34
|
+
| Unit | Range | Use Case |
|
|
35
|
+
|------|-------|----------|
|
|
36
|
+
| `seconds` | 1-3600 | Short delays, testing |
|
|
37
|
+
| `minutes` | 1-1440 | Task reminders, short waits |
|
|
38
|
+
| `hours` | 1-168 | Scheduled checks, delayed notifications |
|
|
39
|
+
| `days` | 1-30 | Long-term reminders, follow-ups |
|
|
40
|
+
|
|
41
|
+
### Examples
|
|
42
|
+
|
|
43
|
+
**30 second delay:**
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"duration": 30,
|
|
47
|
+
"unit": "seconds"
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**5 minute reminder:**
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"duration": 5,
|
|
55
|
+
"unit": "minutes"
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**1 hour delay:**
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"duration": 1,
|
|
63
|
+
"unit": "hours"
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**2 day follow-up:**
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"duration": 2,
|
|
71
|
+
"unit": "days"
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Response Format
|
|
76
|
+
|
|
77
|
+
**Timer set:**
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"success": true,
|
|
81
|
+
"message": "Timer set for 5 minutes",
|
|
82
|
+
"duration": 5,
|
|
83
|
+
"unit": "minutes",
|
|
84
|
+
"duration_seconds": 300,
|
|
85
|
+
"trigger_at": "2025-01-30T12:05:00Z"
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Timer triggered:**
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"success": true,
|
|
93
|
+
"triggered": true,
|
|
94
|
+
"message": "Timer completed after 5 minutes",
|
|
95
|
+
"duration": 5,
|
|
96
|
+
"unit": "minutes"
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Error Response
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"error": "Duration must be a positive number"
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Use Cases
|
|
109
|
+
|
|
110
|
+
| Use Case | Duration | Unit | Description |
|
|
111
|
+
|----------|----------|------|-------------|
|
|
112
|
+
| Quick test | 10-30 | seconds | Testing workflow execution |
|
|
113
|
+
| Reminder | 5-30 | minutes | Short-term reminders |
|
|
114
|
+
| Rate limit | 60 | seconds | Wait between API calls |
|
|
115
|
+
| Daily check | 24 | hours | Daily automation |
|
|
116
|
+
| Follow-up | 2-7 | days | Long-term follow-ups |
|
|
117
|
+
|
|
118
|
+
## Common Workflows
|
|
119
|
+
|
|
120
|
+
### Delayed notification
|
|
121
|
+
|
|
122
|
+
1. Receive user request for reminder
|
|
123
|
+
2. Set timer with requested duration
|
|
124
|
+
3. Timer triggers → send notification
|
|
125
|
+
|
|
126
|
+
### Rate-limited API calls
|
|
127
|
+
|
|
128
|
+
1. Make API call
|
|
129
|
+
2. Set 60-second timer
|
|
130
|
+
3. Timer triggers → make next call
|
|
131
|
+
|
|
132
|
+
### Scheduled workflow
|
|
133
|
+
|
|
134
|
+
1. Set timer for desired delay
|
|
135
|
+
2. Timer triggers → execute workflow nodes
|
|
136
|
+
|
|
137
|
+
## Integration with Workflow
|
|
138
|
+
|
|
139
|
+
When used as a trigger node in a workflow:
|
|
140
|
+
1. Deploy the workflow
|
|
141
|
+
2. Timer countdown begins
|
|
142
|
+
3. After duration, downstream nodes execute
|
|
143
|
+
|
|
144
|
+
When used as AI tool:
|
|
145
|
+
1. Agent decides to set timer
|
|
146
|
+
2. Timer is scheduled
|
|
147
|
+
3. Agent can proceed with other work
|
|
148
|
+
4. Notification when timer triggers
|
|
149
|
+
|
|
150
|
+
## Best Practices
|
|
151
|
+
|
|
152
|
+
1. **Use appropriate units**: Don't use 3600 seconds when 1 hour is clearer
|
|
153
|
+
2. **Consider time zones**: Timers use server time
|
|
154
|
+
3. **Account for drift**: Long timers may have slight variance
|
|
155
|
+
4. **Test short first**: Start with seconds before days
|
|
156
|
+
5. **Chain timers carefully**: Avoid infinite loops
|
|
157
|
+
|
|
158
|
+
## Limitations
|
|
159
|
+
|
|
160
|
+
- Timers are not persistent across server restarts
|
|
161
|
+
- Maximum practical delay depends on server uptime
|
|
162
|
+
- Timers are one-time (use cron for recurring)
|
|
163
|
+
|
|
164
|
+
## Setup Requirements
|
|
165
|
+
|
|
166
|
+
1. Connect the **Timer** node to Zeenie's `input-tools` handle
|
|
167
|
+
2. For workflow triggers, connect Timer as the first node
|
|
168
|
+
3. Deploy workflow to activate timer
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: geocoding-skill
|
|
3
|
+
description: Convert addresses to coordinates (geocoding) or coordinates to addresses (reverse geocoding) using Google Maps API.
|
|
4
|
+
allowed-tools: add_locations
|
|
5
|
+
metadata:
|
|
6
|
+
author: machina
|
|
7
|
+
version: "1.0"
|
|
8
|
+
category: location
|
|
9
|
+
icon: "📍"
|
|
10
|
+
color: "#4285F4"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Geocoding Tool
|
|
14
|
+
|
|
15
|
+
Convert addresses to GPS coordinates or coordinates to addresses using Google Maps Geocoding API.
|
|
16
|
+
|
|
17
|
+
## How It Works
|
|
18
|
+
|
|
19
|
+
This skill provides instructions for the **Add Locations** (gmaps_locations) tool node. Connect the **Add Locations** node to Zeenie's `input-tools` handle to enable geocoding operations.
|
|
20
|
+
|
|
21
|
+
## add_locations Tool
|
|
22
|
+
|
|
23
|
+
Geocode addresses or reverse geocode coordinates.
|
|
24
|
+
|
|
25
|
+
### Schema Fields
|
|
26
|
+
|
|
27
|
+
| Field | Type | Required | Description |
|
|
28
|
+
|-------|------|----------|-------------|
|
|
29
|
+
| service_type | string | Yes | `"geocode"` (address to coordinates) or `"reverse_geocode"` (coordinates to address) |
|
|
30
|
+
| address | string | If geocode | Address to convert to coordinates |
|
|
31
|
+
| lat | float | If reverse_geocode | Latitude coordinate |
|
|
32
|
+
| lng | float | If reverse_geocode | Longitude coordinate |
|
|
33
|
+
|
|
34
|
+
### Operations
|
|
35
|
+
|
|
36
|
+
| Service Type | Input | Output |
|
|
37
|
+
|--------------|-------|--------|
|
|
38
|
+
| `geocode` | Address string | Coordinates (lat, lng) |
|
|
39
|
+
| `reverse_geocode` | Coordinates (lat, lng) | Formatted address |
|
|
40
|
+
|
|
41
|
+
### Examples
|
|
42
|
+
|
|
43
|
+
**Geocode an address:**
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"service_type": "geocode",
|
|
47
|
+
"address": "1600 Amphitheatre Parkway, Mountain View, CA"
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Geocode a landmark:**
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"service_type": "geocode",
|
|
55
|
+
"address": "Eiffel Tower, Paris"
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Geocode a city:**
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"service_type": "geocode",
|
|
63
|
+
"address": "New York City, USA"
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Reverse geocode (coordinates to address):**
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"service_type": "reverse_geocode",
|
|
71
|
+
"lat": 48.8584,
|
|
72
|
+
"lng": 2.2945
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Response Format
|
|
77
|
+
|
|
78
|
+
**Geocode response:**
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"success": true,
|
|
82
|
+
"service_type": "geocoding",
|
|
83
|
+
"input": {"address": "Eiffel Tower, Paris"},
|
|
84
|
+
"results": [
|
|
85
|
+
{
|
|
86
|
+
"formatted_address": "Champ de Mars, 5 Av. Anatole France, 75007 Paris, France",
|
|
87
|
+
"geometry": {
|
|
88
|
+
"location": {"lat": 48.8583701, "lng": 2.2944813}
|
|
89
|
+
},
|
|
90
|
+
"address_components": [
|
|
91
|
+
{"long_name": "5", "short_name": "5", "types": ["street_number"]},
|
|
92
|
+
{"long_name": "Avenue Anatole France", "short_name": "Av. Anatole France", "types": ["route"]},
|
|
93
|
+
{"long_name": "Paris", "short_name": "Paris", "types": ["locality"]}
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"status": "OK"
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Reverse geocode response:**
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"success": true,
|
|
105
|
+
"service_type": "reverse_geocoding",
|
|
106
|
+
"input": {"lat": 48.8584, "lng": 2.2945},
|
|
107
|
+
"results": [
|
|
108
|
+
{
|
|
109
|
+
"formatted_address": "Champ de Mars, 5 Av. Anatole France, 75007 Paris, France",
|
|
110
|
+
"geometry": {
|
|
111
|
+
"location": {"lat": 48.8583701, "lng": 2.2944813}
|
|
112
|
+
},
|
|
113
|
+
"address_components": [...]
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"status": "OK"
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Error Response
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{
|
|
124
|
+
"error": "address is required for geocoding"
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"error": "Geocoding failed: ZERO_RESULTS"
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Use Cases
|
|
135
|
+
|
|
136
|
+
| Use Case | Service Type | Description |
|
|
137
|
+
|----------|--------------|-------------|
|
|
138
|
+
| Find location | geocode | Get coordinates for an address |
|
|
139
|
+
| Validate address | geocode | Get standardized address format |
|
|
140
|
+
| Get address | reverse_geocode | Find address from GPS coordinates |
|
|
141
|
+
| Location lookup | geocode | Search for landmarks, POIs |
|
|
142
|
+
|
|
143
|
+
## Common Workflows
|
|
144
|
+
|
|
145
|
+
### Get coordinates for sending location via WhatsApp
|
|
146
|
+
|
|
147
|
+
1. Use `geocode` to convert address to coordinates
|
|
148
|
+
2. Extract `lat` and `lng` from response
|
|
149
|
+
3. Use `whatsapp_send` with message_type="location"
|
|
150
|
+
|
|
151
|
+
### Identify a GPS location
|
|
152
|
+
|
|
153
|
+
1. Use `reverse_geocode` with lat/lng coordinates
|
|
154
|
+
2. Get formatted address from response
|
|
155
|
+
|
|
156
|
+
### Search for nearby places
|
|
157
|
+
|
|
158
|
+
1. Use `geocode` to get coordinates from address
|
|
159
|
+
2. Use `nearby_places` tool with those coordinates
|
|
160
|
+
|
|
161
|
+
## Address Format Guidelines
|
|
162
|
+
|
|
163
|
+
**Good address formats:**
|
|
164
|
+
- `"123 Main Street, New York, NY 10001"`
|
|
165
|
+
- `"Eiffel Tower, Paris, France"`
|
|
166
|
+
- `"Times Square, NYC"`
|
|
167
|
+
- `"Tokyo Station, Japan"`
|
|
168
|
+
|
|
169
|
+
**Tips:**
|
|
170
|
+
- Include city and country for better accuracy
|
|
171
|
+
- Landmarks and POIs work well
|
|
172
|
+
- Postal codes improve precision
|
|
173
|
+
- Use local language or English
|
|
174
|
+
|
|
175
|
+
## Coordinate Guidelines
|
|
176
|
+
|
|
177
|
+
- Latitude range: -90 to 90
|
|
178
|
+
- Longitude range: -180 to 180
|
|
179
|
+
- More decimal places = higher precision
|
|
180
|
+
- Standard precision: 6 decimal places
|
|
181
|
+
|
|
182
|
+
## Setup Requirements
|
|
183
|
+
|
|
184
|
+
1. Connect the **Add Locations** (gmaps_locations) node to Zeenie's `input-tools` handle
|
|
185
|
+
2. Google Maps API key must be configured in Credentials
|
|
186
|
+
3. Geocoding API must be enabled in Google Cloud Console
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nearby-places-skill
|
|
3
|
+
description: Search for nearby places like restaurants, cafes, stores, and services using Google Places API. Find places by type and location.
|
|
4
|
+
allowed-tools: show_nearby_places
|
|
5
|
+
metadata:
|
|
6
|
+
author: machina
|
|
7
|
+
version: "1.0"
|
|
8
|
+
category: location
|
|
9
|
+
icon: "🗺️"
|
|
10
|
+
color: "#34A853"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Nearby Places Tool
|
|
14
|
+
|
|
15
|
+
Search for places near a location using Google Places API.
|
|
16
|
+
|
|
17
|
+
## How It Works
|
|
18
|
+
|
|
19
|
+
This skill provides instructions for the **Show Nearby Places** (gmaps_nearby_places) tool node. Connect the **Show Nearby Places** node to Zeenie's `input-tools` handle to enable place search.
|
|
20
|
+
|
|
21
|
+
## show_nearby_places Tool
|
|
22
|
+
|
|
23
|
+
Search for places near GPS coordinates.
|
|
24
|
+
|
|
25
|
+
### Schema Fields
|
|
26
|
+
|
|
27
|
+
| Field | Type | Required | Description |
|
|
28
|
+
|-------|------|----------|-------------|
|
|
29
|
+
| lat | float | Yes | Center latitude for search |
|
|
30
|
+
| lng | float | Yes | Center longitude for search |
|
|
31
|
+
| radius | int | No | Search radius in meters (default: 500, max: 50000) |
|
|
32
|
+
| type | string | No | Place type to search for (default: "restaurant") |
|
|
33
|
+
| keyword | string | No | Keyword to filter results |
|
|
34
|
+
|
|
35
|
+
### Place Types
|
|
36
|
+
|
|
37
|
+
**Food & Drink:**
|
|
38
|
+
- `restaurant` - Restaurants
|
|
39
|
+
- `cafe` - Coffee shops
|
|
40
|
+
- `bar` - Bars and pubs
|
|
41
|
+
- `bakery` - Bakeries
|
|
42
|
+
- `meal_takeaway` - Takeout restaurants
|
|
43
|
+
|
|
44
|
+
**Shopping:**
|
|
45
|
+
- `store` - General stores
|
|
46
|
+
- `supermarket` - Grocery stores
|
|
47
|
+
- `shopping_mall` - Shopping centers
|
|
48
|
+
- `clothing_store` - Clothing shops
|
|
49
|
+
- `convenience_store` - Convenience stores
|
|
50
|
+
|
|
51
|
+
**Services:**
|
|
52
|
+
- `bank` - Banks
|
|
53
|
+
- `atm` - ATMs
|
|
54
|
+
- `gas_station` - Gas/petrol stations
|
|
55
|
+
- `pharmacy` - Pharmacies
|
|
56
|
+
- `post_office` - Post offices
|
|
57
|
+
|
|
58
|
+
**Health:**
|
|
59
|
+
- `hospital` - Hospitals
|
|
60
|
+
- `doctor` - Doctor's offices
|
|
61
|
+
- `dentist` - Dental clinics
|
|
62
|
+
|
|
63
|
+
**Transport:**
|
|
64
|
+
- `bus_station` - Bus stations
|
|
65
|
+
- `train_station` - Train stations
|
|
66
|
+
- `airport` - Airports
|
|
67
|
+
- `taxi_stand` - Taxi stands
|
|
68
|
+
- `parking` - Parking lots
|
|
69
|
+
|
|
70
|
+
**Entertainment:**
|
|
71
|
+
- `movie_theater` - Cinemas
|
|
72
|
+
- `gym` - Fitness centers
|
|
73
|
+
- `park` - Parks
|
|
74
|
+
- `museum` - Museums
|
|
75
|
+
- `zoo` - Zoos
|
|
76
|
+
|
|
77
|
+
**Accommodation:**
|
|
78
|
+
- `hotel` - Hotels
|
|
79
|
+
- `lodging` - All lodging types
|
|
80
|
+
|
|
81
|
+
### Examples
|
|
82
|
+
|
|
83
|
+
**Find nearby restaurants:**
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"lat": 40.7484,
|
|
87
|
+
"lng": -73.9857,
|
|
88
|
+
"radius": 500,
|
|
89
|
+
"type": "restaurant"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Find coffee shops:**
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"lat": 37.7749,
|
|
97
|
+
"lng": -122.4194,
|
|
98
|
+
"type": "cafe",
|
|
99
|
+
"radius": 1000
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Find specific chain:**
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"lat": 37.7749,
|
|
107
|
+
"lng": -122.4194,
|
|
108
|
+
"type": "cafe",
|
|
109
|
+
"keyword": "starbucks"
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Find gas stations:**
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"lat": 34.0522,
|
|
117
|
+
"lng": -118.2437,
|
|
118
|
+
"type": "gas_station",
|
|
119
|
+
"radius": 2000
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Find hotels:**
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"lat": 51.5074,
|
|
127
|
+
"lng": -0.1278,
|
|
128
|
+
"type": "hotel",
|
|
129
|
+
"radius": 1000
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Response Format
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"success": true,
|
|
138
|
+
"type": "restaurant",
|
|
139
|
+
"search_parameters": {
|
|
140
|
+
"location": {"lat": 40.7484, "lng": -73.9857},
|
|
141
|
+
"radius": 500,
|
|
142
|
+
"type": "restaurant"
|
|
143
|
+
},
|
|
144
|
+
"results": [
|
|
145
|
+
{
|
|
146
|
+
"name": "Example Restaurant",
|
|
147
|
+
"vicinity": "123 Main St, New York",
|
|
148
|
+
"rating": 4.5,
|
|
149
|
+
"user_ratings_total": 150,
|
|
150
|
+
"price_level": 2,
|
|
151
|
+
"geometry": {
|
|
152
|
+
"location": {"lat": 40.7485, "lng": -73.9860}
|
|
153
|
+
},
|
|
154
|
+
"types": ["restaurant", "food", "establishment"],
|
|
155
|
+
"opening_hours": {"open_now": true}
|
|
156
|
+
}
|
|
157
|
+
],
|
|
158
|
+
"total_results": 10,
|
|
159
|
+
"status": "OK"
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Response Fields
|
|
164
|
+
|
|
165
|
+
| Field | Description |
|
|
166
|
+
|-------|-------------|
|
|
167
|
+
| name | Place name |
|
|
168
|
+
| vicinity | Address or location description |
|
|
169
|
+
| rating | Average rating (1-5) |
|
|
170
|
+
| user_ratings_total | Number of reviews |
|
|
171
|
+
| price_level | Price level (0-4, 0=free, 4=very expensive) |
|
|
172
|
+
| geometry.location | Place coordinates |
|
|
173
|
+
| types | Place type categories |
|
|
174
|
+
| opening_hours.open_now | Whether currently open |
|
|
175
|
+
|
|
176
|
+
### Error Response
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"error": "lat and lng are required for nearby places search"
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Price Level Guide
|
|
185
|
+
|
|
186
|
+
| Level | Meaning |
|
|
187
|
+
|-------|---------|
|
|
188
|
+
| 0 | Free |
|
|
189
|
+
| 1 | Inexpensive ($) |
|
|
190
|
+
| 2 | Moderate ($$) |
|
|
191
|
+
| 3 | Expensive ($$$) |
|
|
192
|
+
| 4 | Very Expensive ($$$$) |
|
|
193
|
+
|
|
194
|
+
## Common Workflows
|
|
195
|
+
|
|
196
|
+
### Find places near an address
|
|
197
|
+
|
|
198
|
+
1. Use `geocoding` tool to convert address to coordinates
|
|
199
|
+
2. Use `nearby_places` with the lat/lng from step 1
|
|
200
|
+
|
|
201
|
+
### Find best-rated places
|
|
202
|
+
|
|
203
|
+
1. Search with appropriate type and radius
|
|
204
|
+
2. Sort results by rating in response
|
|
205
|
+
3. Filter by minimum rating threshold
|
|
206
|
+
|
|
207
|
+
### Find open places now
|
|
208
|
+
|
|
209
|
+
1. Search with desired type
|
|
210
|
+
2. Check `opening_hours.open_now` in results
|
|
211
|
+
|
|
212
|
+
## Radius Guidelines
|
|
213
|
+
|
|
214
|
+
| Radius | Use Case |
|
|
215
|
+
|--------|----------|
|
|
216
|
+
| 100-500m | Walking distance |
|
|
217
|
+
| 500-1000m | Short walk |
|
|
218
|
+
| 1000-2000m | 5-10 min walk |
|
|
219
|
+
| 2000-5000m | Driving distance |
|
|
220
|
+
| 5000-50000m | City-wide search |
|
|
221
|
+
|
|
222
|
+
## Tips
|
|
223
|
+
|
|
224
|
+
1. **Use specific types**: "cafe" not "coffee"
|
|
225
|
+
2. **Add keywords**: Filter by chain name or cuisine
|
|
226
|
+
3. **Adjust radius**: Start small, expand if needed
|
|
227
|
+
4. **Check ratings**: Higher ratings usually mean better quality
|
|
228
|
+
5. **Verify open_now**: Important for time-sensitive searches
|
|
229
|
+
|
|
230
|
+
## Setup Requirements
|
|
231
|
+
|
|
232
|
+
1. Connect the **Show Nearby Places** (gmaps_nearby_places) node to Zeenie's `input-tools` handle
|
|
233
|
+
2. Google Maps API key must be configured in Credentials
|
|
234
|
+
3. Places API must be enabled in Google Cloud Console
|