autotouch-cli 0.2.86__tar.gz → 0.2.88__tar.gz
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.
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/PKG-INFO +24 -6
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/README.md +23 -5
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/agents.py +36 -19
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/search.py +13 -7
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/data/CLI_REFERENCE.md +18 -16
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/data/cli-manifest.json +33 -16
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/templates.py +69 -1
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/PKG-INFO +24 -6
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/linkedin_contract.py +2 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/provider_registry.py +32 -1
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/search_contract.py +25 -22
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/pyproject.toml +1 -1
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/MANIFEST.in +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/__init__.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/cli.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/cli_contracts.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/__init__.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/auth.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/cells.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/columns.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/jobs.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/leads.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/linkedin.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/list_build.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/prompts.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/rows.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/sequences.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/tables.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/tasks.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/webhooks.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/commands/workspace_secrets.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/__init__.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/auth.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/config.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/csv_import.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/http.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/io.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/output.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/polling.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/run.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/core/validation.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/exceptions.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/mongo_status.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/parser.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/parser_groups.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli/sequence_support.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/SOURCES.txt +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/dependency_links.txt +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/entry_points.txt +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/requires.txt +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_cli.egg-info/top_level.txt +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/__init__.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/linkedin_filters.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/autotouch_shared/list_build_contract.py +0 -0
- {autotouch_cli-0.2.86 → autotouch_cli-0.2.88}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: autotouch-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.88
|
|
4
4
|
Summary: Autotouch Smart Table CLI
|
|
5
5
|
Project-URL: Homepage, https://app.autotouch.ai
|
|
6
6
|
Project-URL: Documentation, https://github.com/nicolonic/autotouch_main/tree/main/docs/research-table/reference
|
|
@@ -36,6 +36,8 @@ For a shipped human-readable reference generated from the installed parser, use
|
|
|
36
36
|
|
|
37
37
|
## Install
|
|
38
38
|
|
|
39
|
+
Released package:
|
|
40
|
+
|
|
39
41
|
```bash
|
|
40
42
|
pipx install autotouch-cli
|
|
41
43
|
# or
|
|
@@ -44,6 +46,16 @@ pip install autotouch-cli
|
|
|
44
46
|
pip install -U autotouch-cli
|
|
45
47
|
```
|
|
46
48
|
|
|
49
|
+
Unreleased branch or pre-publish build:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
pipx install --force "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
|
|
53
|
+
# or
|
|
54
|
+
python -m pip install -U "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The `autotouch-cli` package name installs the latest published package from the configured package index. Use the git/source install form when testing a version bump before the release tag has published.
|
|
58
|
+
|
|
47
59
|
## First Run
|
|
48
60
|
|
|
49
61
|
Existing developer key:
|
|
@@ -132,7 +144,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
|
|
|
132
144
|
- Inspect rows: `autotouch rows list`, `autotouch rows get`
|
|
133
145
|
- Inspect one cell: `autotouch cells get`
|
|
134
146
|
- Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
|
|
135
|
-
- Run
|
|
147
|
+
- Run Exa Company Search for basic company discovery, competitors, and lookalikes: `autotouch search companies`, `autotouch search similar-companies`
|
|
136
148
|
- Inspect list-build inputs: `autotouch list-build inputs`
|
|
137
149
|
- Build durable company and lead lists on Smart Table workers: `autotouch list-build companies`, `autotouch list-build leads`
|
|
138
150
|
- Check connected LinkedIn account status/limits: `autotouch linkedin status`, `autotouch linkedin limits`
|
|
@@ -146,13 +158,19 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
|
|
|
146
158
|
|
|
147
159
|
Autotouch has two different company/people discovery paths.
|
|
148
160
|
|
|
149
|
-
Use `autotouch search companies`
|
|
161
|
+
Use `autotouch search companies` for Exa Company Search when the target is basic company discovery, competitors, lookalikes, or a semantic company search. Put company constraints directly in natural language: industry, geography, funding, headcount, technology, founded date, and similarity. Examples: "AI workflow platforms for healthcare", "US education software startups focused on AI math tutoring with 1-50 employees", or "companies like Rippling for HR and workforce management". Exa company search returns up to 100 results per API call and costs 1 credit per 10 returned results.
|
|
162
|
+
|
|
163
|
+
Use `autotouch search similar-companies` as a convenience wrapper for Exa Company Search similarity. Prefer `--query` for Exa's documented semantic patterns, such as "companies like Notion", "competitors of Stripe", or "companies working on making space travel cheaper". The older seed fields `company_name`, `company_domain`, and `company_description` remain available when you want the CLI/API to compose that query; it does not use Exa `/findSimilar`.
|
|
150
164
|
|
|
151
|
-
Use `autotouch
|
|
165
|
+
Use `autotouch search people` for provider-hidden people search when the target is niche, semantic, or hard to express with structured filters. People search currently returns at most 10 results per API call and costs 1 credit per API call.
|
|
166
|
+
|
|
167
|
+
Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable LinkedIn/Sales Navigator list construction. This is the only CLI path for building LinkedIn-sourced company and lead lists. Treat list builds as the sourcing step for the Smart Table research workspace: build company/account records first by default, add the records to a research table, then enrich, score, segment, find related leads, attach signals/notes, and continue downstream workflows from that table. Use lead builds directly when the request is explicitly person/contact focused. This path uses Autotouch-managed provider access, so users do not need to connect their own LinkedIn account. Use filters like geography IDs, company size, industry IDs, title/persona, and current company IDs; call `autotouch list-build inputs` for supported values. Durable list builds run as background jobs with status/results endpoints and cost 1 credit per successful non-empty result page.
|
|
152
168
|
|
|
153
169
|
For structured company builds, start with industry IDs plus geo/company-size filters. User-supplied `keywords` are optional when structured filters are present; use them only to refine, disambiguate, or recover hard-to-classify targets instead of carrying the whole target definition.
|
|
154
170
|
|
|
155
|
-
For account-first prospecting, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use
|
|
171
|
+
For account-first prospecting from LinkedIn/Sales Navigator, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use Exa company search as a default pre-step for every LinkedIn list build; use it when the user's target is genuinely semantic, niche, competitor-based, or not meant to be LinkedIn-sourced.
|
|
172
|
+
|
|
173
|
+
Use `autotouch agents ...` for recurring signal-based discovery. Scheduled agents support `--target ACCOUNTS` for company/account output and `--target LEADS` for people output. Every agent writes a source/signal table for the evidence it used; lead agents then write `candidate_research.candidates[]` on source rows and list-sync those candidates into the lead/candidate output table. See the agent playbook for the full source-table and candidate-sync contract.
|
|
156
174
|
|
|
157
175
|
## More
|
|
158
176
|
|
|
@@ -160,7 +178,7 @@ For automation or agent-driven setup, use:
|
|
|
160
178
|
- `autotouch cli-manifest --output json` for the local machine-readable command contract
|
|
161
179
|
- `autotouch cli-reference` for the shipped parser-generated reference
|
|
162
180
|
- `autotouch capabilities --output json` for provider/workflow contracts
|
|
163
|
-
- `autotouch --version` should be `0.2.
|
|
181
|
+
- `autotouch --version` should be `0.2.88` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, the cleaned single LinkedIn-sourced list-build path, Exa Company Search up to 100 results, and scheduled agent `--target ACCOUNTS|LEADS`
|
|
164
182
|
- `autotouch capabilities --output json --select list_builds` for documented list-build inputs such as geography IDs, company size buckets, profile language, and company IDs
|
|
165
183
|
- `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
|
|
166
184
|
- `autotouch list-build companies` and `autotouch list-build leads` for durable LinkedIn-sourced company and lead list builds with Smart Table-owned background workers, visible progress, and no user-owned LinkedIn connection requirement
|
|
@@ -11,6 +11,8 @@ For a shipped human-readable reference generated from the installed parser, use
|
|
|
11
11
|
|
|
12
12
|
## Install
|
|
13
13
|
|
|
14
|
+
Released package:
|
|
15
|
+
|
|
14
16
|
```bash
|
|
15
17
|
pipx install autotouch-cli
|
|
16
18
|
# or
|
|
@@ -19,6 +21,16 @@ pip install autotouch-cli
|
|
|
19
21
|
pip install -U autotouch-cli
|
|
20
22
|
```
|
|
21
23
|
|
|
24
|
+
Unreleased branch or pre-publish build:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pipx install --force "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
|
|
28
|
+
# or
|
|
29
|
+
python -m pip install -U "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The `autotouch-cli` package name installs the latest published package from the configured package index. Use the git/source install form when testing a version bump before the release tag has published.
|
|
33
|
+
|
|
22
34
|
## First Run
|
|
23
35
|
|
|
24
36
|
Existing developer key:
|
|
@@ -107,7 +119,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
|
|
|
107
119
|
- Inspect rows: `autotouch rows list`, `autotouch rows get`
|
|
108
120
|
- Inspect one cell: `autotouch cells get`
|
|
109
121
|
- Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
|
|
110
|
-
- Run
|
|
122
|
+
- Run Exa Company Search for basic company discovery, competitors, and lookalikes: `autotouch search companies`, `autotouch search similar-companies`
|
|
111
123
|
- Inspect list-build inputs: `autotouch list-build inputs`
|
|
112
124
|
- Build durable company and lead lists on Smart Table workers: `autotouch list-build companies`, `autotouch list-build leads`
|
|
113
125
|
- Check connected LinkedIn account status/limits: `autotouch linkedin status`, `autotouch linkedin limits`
|
|
@@ -121,13 +133,19 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
|
|
|
121
133
|
|
|
122
134
|
Autotouch has two different company/people discovery paths.
|
|
123
135
|
|
|
124
|
-
Use `autotouch search companies`
|
|
136
|
+
Use `autotouch search companies` for Exa Company Search when the target is basic company discovery, competitors, lookalikes, or a semantic company search. Put company constraints directly in natural language: industry, geography, funding, headcount, technology, founded date, and similarity. Examples: "AI workflow platforms for healthcare", "US education software startups focused on AI math tutoring with 1-50 employees", or "companies like Rippling for HR and workforce management". Exa company search returns up to 100 results per API call and costs 1 credit per 10 returned results.
|
|
137
|
+
|
|
138
|
+
Use `autotouch search similar-companies` as a convenience wrapper for Exa Company Search similarity. Prefer `--query` for Exa's documented semantic patterns, such as "companies like Notion", "competitors of Stripe", or "companies working on making space travel cheaper". The older seed fields `company_name`, `company_domain`, and `company_description` remain available when you want the CLI/API to compose that query; it does not use Exa `/findSimilar`.
|
|
125
139
|
|
|
126
|
-
Use `autotouch
|
|
140
|
+
Use `autotouch search people` for provider-hidden people search when the target is niche, semantic, or hard to express with structured filters. People search currently returns at most 10 results per API call and costs 1 credit per API call.
|
|
141
|
+
|
|
142
|
+
Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable LinkedIn/Sales Navigator list construction. This is the only CLI path for building LinkedIn-sourced company and lead lists. Treat list builds as the sourcing step for the Smart Table research workspace: build company/account records first by default, add the records to a research table, then enrich, score, segment, find related leads, attach signals/notes, and continue downstream workflows from that table. Use lead builds directly when the request is explicitly person/contact focused. This path uses Autotouch-managed provider access, so users do not need to connect their own LinkedIn account. Use filters like geography IDs, company size, industry IDs, title/persona, and current company IDs; call `autotouch list-build inputs` for supported values. Durable list builds run as background jobs with status/results endpoints and cost 1 credit per successful non-empty result page.
|
|
127
143
|
|
|
128
144
|
For structured company builds, start with industry IDs plus geo/company-size filters. User-supplied `keywords` are optional when structured filters are present; use them only to refine, disambiguate, or recover hard-to-classify targets instead of carrying the whole target definition.
|
|
129
145
|
|
|
130
|
-
For account-first prospecting, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use
|
|
146
|
+
For account-first prospecting from LinkedIn/Sales Navigator, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use Exa company search as a default pre-step for every LinkedIn list build; use it when the user's target is genuinely semantic, niche, competitor-based, or not meant to be LinkedIn-sourced.
|
|
147
|
+
|
|
148
|
+
Use `autotouch agents ...` for recurring signal-based discovery. Scheduled agents support `--target ACCOUNTS` for company/account output and `--target LEADS` for people output. Every agent writes a source/signal table for the evidence it used; lead agents then write `candidate_research.candidates[]` on source rows and list-sync those candidates into the lead/candidate output table. See the agent playbook for the full source-table and candidate-sync contract.
|
|
131
149
|
|
|
132
150
|
## More
|
|
133
151
|
|
|
@@ -135,7 +153,7 @@ For automation or agent-driven setup, use:
|
|
|
135
153
|
- `autotouch cli-manifest --output json` for the local machine-readable command contract
|
|
136
154
|
- `autotouch cli-reference` for the shipped parser-generated reference
|
|
137
155
|
- `autotouch capabilities --output json` for provider/workflow contracts
|
|
138
|
-
- `autotouch --version` should be `0.2.
|
|
156
|
+
- `autotouch --version` should be `0.2.88` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, the cleaned single LinkedIn-sourced list-build path, Exa Company Search up to 100 results, and scheduled agent `--target ACCOUNTS|LEADS`
|
|
139
157
|
- `autotouch capabilities --output json --select list_builds` for documented list-build inputs such as geography IDs, company size buckets, profile language, and company IDs
|
|
140
158
|
- `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
|
|
141
159
|
- `autotouch list-build companies` and `autotouch list-build leads` for durable LinkedIn-sourced company and lead list builds with Smart Table-owned background workers, visible progress, and no user-owned LinkedIn connection requirement
|
|
@@ -10,6 +10,9 @@ from dataclasses import dataclass
|
|
|
10
10
|
from typing import Any, Callable, Dict, Optional, Sequence
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
AGENT_TARGET_CHOICES = ["LEADS", "ACCOUNTS"]
|
|
14
|
+
|
|
15
|
+
|
|
13
16
|
@dataclass(frozen=True)
|
|
14
17
|
class AgentCommandRuntime:
|
|
15
18
|
resolve_token: Callable[[Optional[str], bool], Optional[str]]
|
|
@@ -50,7 +53,12 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
|
|
|
50
53
|
token = runtime.resolve_token(args.token, required=True)
|
|
51
54
|
|
|
52
55
|
if getattr(args, "from_file", None):
|
|
53
|
-
payload = runtime.load_json_input(
|
|
56
|
+
payload = runtime.load_json_input(
|
|
57
|
+
inline_json=None,
|
|
58
|
+
file_path=args.from_file,
|
|
59
|
+
context="agent",
|
|
60
|
+
default={},
|
|
61
|
+
)
|
|
54
62
|
else:
|
|
55
63
|
payload: Dict[str, Any] = {}
|
|
56
64
|
if args.name:
|
|
@@ -106,7 +114,7 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
|
|
|
106
114
|
|
|
107
115
|
# AI generation: generate persona, signals, and create in one shot
|
|
108
116
|
if getattr(args, "generate", False) and "personaConfig" not in payload:
|
|
109
|
-
target = payload.get("targetType"
|
|
117
|
+
target = str(payload.get("targetType") or "LEADS").upper()
|
|
110
118
|
sys.stderr.write(f"Generating persona for {target}...\n")
|
|
111
119
|
persona_data = runtime.request_api(
|
|
112
120
|
"POST", "/api/agents/generate-persona",
|
|
@@ -119,17 +127,21 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
|
|
|
119
127
|
payload["personaConfig"] = persona
|
|
120
128
|
sys.stderr.write(f" Persona generated: {json.dumps(persona, ensure_ascii=False)[:200]}...\n")
|
|
121
129
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
topics = []
|
|
131
|
+
if target == "LEADS":
|
|
132
|
+
# LinkedIn topic engagement is a people-output signal. Account
|
|
133
|
+
# agents should stick to company-compatible signals such as jobs
|
|
134
|
+
# and news until a company-output topic signal exists.
|
|
135
|
+
sys.stderr.write("Generating topic suggestions...\n")
|
|
136
|
+
topic_data = runtime.request_api(
|
|
137
|
+
"POST", "/api/agents/generate-signal-topics",
|
|
138
|
+
base_url=args.base_url, token=token,
|
|
139
|
+
use_x_api_key=args.use_x_api_key,
|
|
140
|
+
payload={"targetType": target, "personaConfig": persona},
|
|
141
|
+
timeout=args.timeout, verbose=args.verbose,
|
|
142
|
+
)
|
|
143
|
+
topics = topic_data.get("topics") or []
|
|
144
|
+
sys.stderr.write(f" Topics: {topics}\n")
|
|
133
145
|
|
|
134
146
|
# Generate job signal
|
|
135
147
|
sys.stderr.write("Generating job signal config...\n")
|
|
@@ -146,7 +158,7 @@ def cmd_agents_create(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
|
|
|
146
158
|
|
|
147
159
|
# Assemble signals
|
|
148
160
|
signals = []
|
|
149
|
-
if topics:
|
|
161
|
+
if target == "LEADS" and topics:
|
|
150
162
|
signals.append({
|
|
151
163
|
"key": "linkedin-topic-post-engagement",
|
|
152
164
|
"config": {"topics": [{"id": "", "label": t, "trackingMode": "all"} for t in topics[:5]]},
|
|
@@ -184,7 +196,12 @@ def cmd_agents_update(args: argparse.Namespace, *, runtime: AgentCommandRuntime)
|
|
|
184
196
|
token = runtime.resolve_token(args.token, required=True)
|
|
185
197
|
|
|
186
198
|
if getattr(args, "from_file", None):
|
|
187
|
-
payload = runtime.load_json_input(
|
|
199
|
+
payload = runtime.load_json_input(
|
|
200
|
+
inline_json=None,
|
|
201
|
+
file_path=args.from_file,
|
|
202
|
+
context="agent",
|
|
203
|
+
default={},
|
|
204
|
+
)
|
|
188
205
|
else:
|
|
189
206
|
payload: Dict[str, Any] = {}
|
|
190
207
|
if getattr(args, "name", None):
|
|
@@ -447,7 +464,7 @@ def register_agents_subcommands(
|
|
|
447
464
|
# -- create --
|
|
448
465
|
pac = agents_sub.add_parser("create", help="Create a new agent")
|
|
449
466
|
pac.add_argument("--name", help="Agent name")
|
|
450
|
-
pac.add_argument("--target", choices=
|
|
467
|
+
pac.add_argument("--target", choices=AGENT_TARGET_CHOICES, help="Target type")
|
|
451
468
|
pac.add_argument("--assigned-user", dest="assigned_user", help="Assigned user ID")
|
|
452
469
|
pac.add_argument("--schedule-time", dest="schedule_time", help="Time of day (HH:MM) — used by daily/weekly")
|
|
453
470
|
pac.add_argument("--schedule-tz", dest="schedule_tz", help="Timezone (default: UTC)")
|
|
@@ -585,14 +602,14 @@ def register_agents_subcommands(
|
|
|
585
602
|
|
|
586
603
|
# -- generate-persona --
|
|
587
604
|
pagp = agents_sub.add_parser("generate-persona", help="Generate ICP persona config via AI")
|
|
588
|
-
pagp.add_argument("--target", choices=
|
|
605
|
+
pagp.add_argument("--target", choices=AGENT_TARGET_CHOICES, default="LEADS", help="Target type")
|
|
589
606
|
pagp.add_argument("--current-config", dest="current_config", help="Path to current persona config JSON")
|
|
590
607
|
add_api_common_arguments(pagp)
|
|
591
608
|
pagp.set_defaults(func=handlers["generate_persona"])
|
|
592
609
|
|
|
593
610
|
# -- generate-topics --
|
|
594
611
|
pagt = agents_sub.add_parser("generate-topics", help="Generate signal topic suggestions via AI")
|
|
595
|
-
pagt.add_argument("--target", choices=
|
|
612
|
+
pagt.add_argument("--target", choices=AGENT_TARGET_CHOICES, default="LEADS", help="Target type")
|
|
596
613
|
pagt.add_argument("--persona", help="Path to persona config JSON")
|
|
597
614
|
pagt.add_argument("--current-topics", dest="current_topics", help="Comma-separated current topics")
|
|
598
615
|
add_api_common_arguments(pagt)
|
|
@@ -600,7 +617,7 @@ def register_agents_subcommands(
|
|
|
600
617
|
|
|
601
618
|
# -- generate-job-signal --
|
|
602
619
|
pagj = agents_sub.add_parser("generate-job-signal", help="Generate job signal config via AI")
|
|
603
|
-
pagj.add_argument("--target", choices=
|
|
620
|
+
pagj.add_argument("--target", choices=AGENT_TARGET_CHOICES, default="LEADS", help="Target type")
|
|
604
621
|
pagj.add_argument("--persona", help="Path to persona config JSON")
|
|
605
622
|
pagj.add_argument("--current-titles", dest="current_titles", help="Comma-separated current job titles")
|
|
606
623
|
pagj.add_argument("--current-keywords", dest="current_keywords", help="Comma-separated current keywords")
|
|
@@ -67,7 +67,7 @@ def cmd_search_companies(args: argparse.Namespace, *, runtime: SearchCommandRunt
|
|
|
67
67
|
runtime=runtime,
|
|
68
68
|
default_payload={
|
|
69
69
|
"query": str(getattr(args, "query", "") or "").strip(),
|
|
70
|
-
"limit": max(1, min(int(getattr(args, "limit", 10) or 10),
|
|
70
|
+
"limit": max(1, min(int(getattr(args, "limit", 10) or 10), 100)),
|
|
71
71
|
},
|
|
72
72
|
)
|
|
73
73
|
data = runtime.request_api(
|
|
@@ -120,11 +120,16 @@ def cmd_search_people(args: argparse.Namespace, *, runtime: SearchCommandRuntime
|
|
|
120
120
|
def cmd_search_similar_companies(args: argparse.Namespace, *, runtime: SearchCommandRuntime) -> None:
|
|
121
121
|
token = runtime.resolve_token(args.token, required=True)
|
|
122
122
|
payload: Dict[str, Any] = {
|
|
123
|
-
"
|
|
124
|
-
"limit": max(1, min(int(getattr(args, "limit", 10) or 10), 10)),
|
|
123
|
+
"limit": max(1, min(int(getattr(args, "limit", 10) or 10), 100)),
|
|
125
124
|
}
|
|
125
|
+
query = str(getattr(args, "query", "") or "").strip()
|
|
126
|
+
company_name = str(getattr(args, "company_name", "") or "").strip()
|
|
126
127
|
company_domain = str(getattr(args, "company_domain", "") or "").strip()
|
|
127
128
|
company_description = str(getattr(args, "company_description", "") or "").strip()
|
|
129
|
+
if query:
|
|
130
|
+
payload["query"] = query
|
|
131
|
+
if company_name:
|
|
132
|
+
payload["company_name"] = company_name
|
|
128
133
|
if company_domain:
|
|
129
134
|
payload["company_domain"] = company_domain
|
|
130
135
|
if company_description:
|
|
@@ -264,9 +269,9 @@ def register_search_subcommands(
|
|
|
264
269
|
add_api_common_arguments(recipe_parser)
|
|
265
270
|
recipe_parser.set_defaults(func=handlers["recipe"])
|
|
266
271
|
|
|
267
|
-
companies_parser = search_sub.add_parser("companies", help="Find companies with
|
|
268
|
-
companies_parser.add_argument("--query", help="
|
|
269
|
-
companies_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-
|
|
272
|
+
companies_parser = search_sub.add_parser("companies", help="Find companies with Exa Company Search")
|
|
273
|
+
companies_parser.add_argument("--query", help="Natural-language company query")
|
|
274
|
+
companies_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-100 (default: 10)")
|
|
270
275
|
companies_parser.add_argument("--data-json", help="Explicit request payload JSON")
|
|
271
276
|
companies_parser.add_argument("--data-file", help="Path to request payload JSON file")
|
|
272
277
|
add_api_common_arguments(companies_parser)
|
|
@@ -284,10 +289,11 @@ def register_search_subcommands(
|
|
|
284
289
|
people_parser.set_defaults(func=handlers["people"])
|
|
285
290
|
|
|
286
291
|
similar_parser = search_sub.add_parser("similar-companies", help="Find companies similar to a seed company")
|
|
292
|
+
similar_parser.add_argument("--query", help="Exa Company Search semantic similarity query, e.g. 'companies like Notion for enterprise knowledge management'")
|
|
287
293
|
similar_parser.add_argument("--company-name", help="Seed company name")
|
|
288
294
|
similar_parser.add_argument("--company-domain", help="Official company domain to ground similarity search")
|
|
289
295
|
similar_parser.add_argument("--company-description", help="Short semantic company description to improve peer matching")
|
|
290
|
-
similar_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-
|
|
296
|
+
similar_parser.add_argument("--limit", type=int, default=10, help="Max results, 1-100 (default: 10)")
|
|
291
297
|
similar_parser.add_argument("--data-json", help="Explicit request payload JSON")
|
|
292
298
|
similar_parser.add_argument("--data-file", help="Path to request payload JSON file")
|
|
293
299
|
add_api_common_arguments(similar_parser)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Autotouch CLI Reference
|
|
2
2
|
|
|
3
|
-
Generated from the installed parser for `autotouch-cli` `0.2.
|
|
3
|
+
Generated from the installed parser for `autotouch-cli` `0.2.88`.
|
|
4
4
|
Manifest schema version: `2`.
|
|
5
5
|
|
|
6
6
|
## Output Modes
|
|
@@ -34,7 +34,7 @@ Create a new agent
|
|
|
34
34
|
- Destructive: `no`
|
|
35
35
|
- Output modes: `json, ndjson, human`
|
|
36
36
|
- Example:
|
|
37
|
-
- `autotouch agents create [-h] [--name NAME] [--target {LEADS}]
|
|
37
|
+
- `autotouch agents create [-h] [--name NAME] [--target {LEADS,ACCOUNTS}]
|
|
38
38
|
[--assigned-user ASSIGNED_USER]
|
|
39
39
|
[--schedule-time SCHEDULE_TIME]
|
|
40
40
|
[--schedule-tz SCHEDULE_TZ]
|
|
@@ -56,7 +56,7 @@ Create a new agent
|
|
|
56
56
|
[--verbose]`
|
|
57
57
|
- Options:
|
|
58
58
|
- `--name` (kind=string): Agent name
|
|
59
|
-
- `--target` (kind=string; choices=LEADS): Target type
|
|
59
|
+
- `--target` (kind=string; choices=LEADS,ACCOUNTS): Target type
|
|
60
60
|
- `--assigned-user` (kind=string): Assigned user ID
|
|
61
61
|
- `--schedule-time` (kind=string): Time of day (HH:MM) — used by daily/weekly
|
|
62
62
|
- `--schedule-tz` (kind=string): Timezone (default: UTC)
|
|
@@ -118,7 +118,7 @@ Generate job signal config via AI
|
|
|
118
118
|
- Destructive: `no`
|
|
119
119
|
- Output modes: `json, ndjson, human`
|
|
120
120
|
- Example:
|
|
121
|
-
- `autotouch agents generate-job-signal [-h] [--target {LEADS}]
|
|
121
|
+
- `autotouch agents generate-job-signal [-h] [--target {LEADS,ACCOUNTS}]
|
|
122
122
|
[--persona PERSONA]
|
|
123
123
|
[--current-titles CURRENT_TITLES]
|
|
124
124
|
[--current-keywords CURRENT_KEYWORDS]
|
|
@@ -130,7 +130,7 @@ Generate job signal config via AI
|
|
|
130
130
|
--json-pointer JSON_POINTER]
|
|
131
131
|
[--verbose]`
|
|
132
132
|
- Options:
|
|
133
|
-
- `--target` (kind=string; choices=LEADS; default=LEADS): Target type
|
|
133
|
+
- `--target` (kind=string; choices=LEADS,ACCOUNTS; default=LEADS): Target type
|
|
134
134
|
- `--persona` (kind=string): Path to persona config JSON
|
|
135
135
|
- `--current-titles` (kind=string; comma-separated): Comma-separated current job titles
|
|
136
136
|
- `--current-keywords` (kind=string; comma-separated): Comma-separated current keywords
|
|
@@ -153,7 +153,7 @@ Generate ICP persona config via AI
|
|
|
153
153
|
- Destructive: `no`
|
|
154
154
|
- Output modes: `json, ndjson, human`
|
|
155
155
|
- Example:
|
|
156
|
-
- `autotouch agents generate-persona [-h] [--target {LEADS}]
|
|
156
|
+
- `autotouch agents generate-persona [-h] [--target {LEADS,ACCOUNTS}]
|
|
157
157
|
[--current-config CURRENT_CONFIG]
|
|
158
158
|
[--base-url BASE_URL] [--token TOKEN]
|
|
159
159
|
[--use-x-api-key] [--timeout TIMEOUT]
|
|
@@ -162,7 +162,7 @@ Generate ICP persona config via AI
|
|
|
162
162
|
--json-pointer JSON_POINTER]
|
|
163
163
|
[--verbose]`
|
|
164
164
|
- Options:
|
|
165
|
-
- `--target` (kind=string; choices=LEADS; default=LEADS): Target type
|
|
165
|
+
- `--target` (kind=string; choices=LEADS,ACCOUNTS; default=LEADS): Target type
|
|
166
166
|
- `--current-config` (kind=string): Path to current persona config JSON
|
|
167
167
|
- `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
|
|
168
168
|
- `--token` (kind=string; sensitive): Developer API key / JWT token
|
|
@@ -183,7 +183,7 @@ Generate signal topic suggestions via AI
|
|
|
183
183
|
- Destructive: `no`
|
|
184
184
|
- Output modes: `json, ndjson, human`
|
|
185
185
|
- Example:
|
|
186
|
-
- `autotouch agents generate-topics [-h] [--target {LEADS}]
|
|
186
|
+
- `autotouch agents generate-topics [-h] [--target {LEADS,ACCOUNTS}]
|
|
187
187
|
[--persona PERSONA]
|
|
188
188
|
[--current-topics CURRENT_TOPICS]
|
|
189
189
|
[--base-url BASE_URL] [--token TOKEN]
|
|
@@ -193,7 +193,7 @@ Generate signal topic suggestions via AI
|
|
|
193
193
|
--json-pointer JSON_POINTER]
|
|
194
194
|
[--verbose]`
|
|
195
195
|
- Options:
|
|
196
|
-
- `--target` (kind=string; choices=LEADS; default=LEADS): Target type
|
|
196
|
+
- `--target` (kind=string; choices=LEADS,ACCOUNTS; default=LEADS): Target type
|
|
197
197
|
- `--persona` (kind=string): Path to persona config JSON
|
|
198
198
|
- `--current-topics` (kind=string; comma-separated): Comma-separated current topics
|
|
199
199
|
- `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
|
|
@@ -1322,14 +1322,14 @@ Print copy-ready ColumnCreate payload templates
|
|
|
1322
1322
|
- Output modes: `json, ndjson, human`
|
|
1323
1323
|
- Example:
|
|
1324
1324
|
- `autotouch columns recipe [-h]
|
|
1325
|
-
[--type {all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads}]
|
|
1325
|
+
[--type {all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads,sync_to_leads_array,add_to_leads_array}]
|
|
1326
1326
|
[--research-mode {lite,heavy}]
|
|
1327
1327
|
[--out-file OUT_FILE]
|
|
1328
1328
|
[--output {json,ndjson,human}] [--compact]
|
|
1329
1329
|
[--select SELECT |
|
|
1330
1330
|
--json-pointer JSON_POINTER]`
|
|
1331
1331
|
- Options:
|
|
1332
|
-
- `--type` (kind=string; choices=all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads; default=all)
|
|
1332
|
+
- `--type` (kind=string; choices=all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads,sync_to_leads_array,add_to_leads_array; default=all)
|
|
1333
1333
|
- `--research-mode` (kind=string; choices=lite,heavy; default=lite): Research Agent depth for LLM recipes (default: lite; heavy costs more per row)
|
|
1334
1334
|
- `--out-file` (kind=file; input=file): Write template JSON to file (single type writes payload only)
|
|
1335
1335
|
- `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
|
|
@@ -3559,7 +3559,7 @@ Provider-hidden search operations
|
|
|
3559
3559
|
|
|
3560
3560
|
#### `autotouch search companies`
|
|
3561
3561
|
|
|
3562
|
-
Find companies with
|
|
3562
|
+
Find companies with Exa Company Search
|
|
3563
3563
|
|
|
3564
3564
|
- Auth: `developer_key_or_user_session`
|
|
3565
3565
|
- Stability: `stable`
|
|
@@ -3575,8 +3575,8 @@ Find companies with provider-hidden neural search
|
|
|
3575
3575
|
[--select SELECT |
|
|
3576
3576
|
--json-pointer JSON_POINTER] [--verbose]`
|
|
3577
3577
|
- Options:
|
|
3578
|
-
- `--query` (kind=string):
|
|
3579
|
-
- `--limit` (kind=integer; default=10): Max results, 1-
|
|
3578
|
+
- `--query` (kind=string): Natural-language company query
|
|
3579
|
+
- `--limit` (kind=integer; default=10): Max results, 1-100 (default: 10)
|
|
3580
3580
|
- `--data-json` (kind=json; input=json): Explicit request payload JSON
|
|
3581
3581
|
- `--data-file` (kind=file; input=file): Path to request payload JSON file
|
|
3582
3582
|
- `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
|
|
@@ -3811,7 +3811,8 @@ Find companies similar to a seed company
|
|
|
3811
3811
|
- Destructive: `no`
|
|
3812
3812
|
- Output modes: `json, ndjson, human`
|
|
3813
3813
|
- Example:
|
|
3814
|
-
- `autotouch search similar-companies [-h] [--
|
|
3814
|
+
- `autotouch search similar-companies [-h] [--query QUERY]
|
|
3815
|
+
[--company-name COMPANY_NAME]
|
|
3815
3816
|
[--company-domain COMPANY_DOMAIN]
|
|
3816
3817
|
[--company-description COMPANY_DESCRIPTION]
|
|
3817
3818
|
[--limit LIMIT]
|
|
@@ -3825,10 +3826,11 @@ Find companies similar to a seed company
|
|
|
3825
3826
|
--json-pointer JSON_POINTER]
|
|
3826
3827
|
[--verbose]`
|
|
3827
3828
|
- Options:
|
|
3829
|
+
- `--query` (kind=string): Exa Company Search semantic similarity query, e.g. 'companies like Notion for enterprise knowledge management'
|
|
3828
3830
|
- `--company-name` (kind=string): Seed company name
|
|
3829
3831
|
- `--company-domain` (kind=string): Official company domain to ground similarity search
|
|
3830
3832
|
- `--company-description` (kind=string): Short semantic company description to improve peer matching
|
|
3831
|
-
- `--limit` (kind=integer; default=10): Max results, 1-
|
|
3833
|
+
- `--limit` (kind=integer; default=10): Max results, 1-100 (default: 10)
|
|
3832
3834
|
- `--data-json` (kind=json; input=json): Explicit request payload JSON
|
|
3833
3835
|
- `--data-file` (kind=file; input=file): Path to request payload JSON file
|
|
3834
3836
|
- `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.2.
|
|
2
|
+
"version": "0.2.88",
|
|
3
3
|
"manifest_schema_version": 2,
|
|
4
4
|
"entry_points": {
|
|
5
5
|
"autotouch": "autotouch_cli.cli:main",
|
|
@@ -6304,7 +6304,7 @@
|
|
|
6304
6304
|
],
|
|
6305
6305
|
"aliases": [],
|
|
6306
6306
|
"group": "search",
|
|
6307
|
-
"help": "Find companies with
|
|
6307
|
+
"help": "Find companies with Exa Company Search",
|
|
6308
6308
|
"description": null,
|
|
6309
6309
|
"notes": null,
|
|
6310
6310
|
"required_flags": [],
|
|
@@ -6313,7 +6313,7 @@
|
|
|
6313
6313
|
{
|
|
6314
6314
|
"dest": "query",
|
|
6315
6315
|
"required": false,
|
|
6316
|
-
"help": "
|
|
6316
|
+
"help": "Natural-language company query",
|
|
6317
6317
|
"kind": "string",
|
|
6318
6318
|
"action": "store",
|
|
6319
6319
|
"flags": [
|
|
@@ -6324,7 +6324,7 @@
|
|
|
6324
6324
|
{
|
|
6325
6325
|
"dest": "limit",
|
|
6326
6326
|
"required": false,
|
|
6327
|
-
"help": "Max results, 1-
|
|
6327
|
+
"help": "Max results, 1-100 (default: 10)",
|
|
6328
6328
|
"kind": "integer",
|
|
6329
6329
|
"action": "store",
|
|
6330
6330
|
"default_when_omitted": 10,
|
|
@@ -6785,6 +6785,17 @@
|
|
|
6785
6785
|
"required_flags": [],
|
|
6786
6786
|
"positionals": [],
|
|
6787
6787
|
"options": [
|
|
6788
|
+
{
|
|
6789
|
+
"dest": "query",
|
|
6790
|
+
"required": false,
|
|
6791
|
+
"help": "Exa Company Search semantic similarity query, e.g. 'companies like Notion for enterprise knowledge management'",
|
|
6792
|
+
"kind": "string",
|
|
6793
|
+
"action": "store",
|
|
6794
|
+
"flags": [
|
|
6795
|
+
"--query"
|
|
6796
|
+
],
|
|
6797
|
+
"takes_value": true
|
|
6798
|
+
},
|
|
6788
6799
|
{
|
|
6789
6800
|
"dest": "company_name",
|
|
6790
6801
|
"required": false,
|
|
@@ -6821,7 +6832,7 @@
|
|
|
6821
6832
|
{
|
|
6822
6833
|
"dest": "limit",
|
|
6823
6834
|
"required": false,
|
|
6824
|
-
"help": "Max results, 1-
|
|
6835
|
+
"help": "Max results, 1-100 (default: 10)",
|
|
6825
6836
|
"kind": "integer",
|
|
6826
6837
|
"action": "store",
|
|
6827
6838
|
"default_when_omitted": 10,
|
|
@@ -7008,7 +7019,7 @@
|
|
|
7008
7019
|
},
|
|
7009
7020
|
"availability": null,
|
|
7010
7021
|
"examples": [
|
|
7011
|
-
"autotouch search similar-companies [-h] [--company-name COMPANY_NAME]\n [--company-domain COMPANY_DOMAIN]\n [--company-description COMPANY_DESCRIPTION]\n [--limit LIMIT]\n [--data-json DATA_JSON]\n [--data-file DATA_FILE]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
7022
|
+
"autotouch search similar-companies [-h] [--query QUERY]\n [--company-name COMPANY_NAME]\n [--company-domain COMPANY_DOMAIN]\n [--company-description COMPANY_DESCRIPTION]\n [--limit LIMIT]\n [--data-json DATA_JSON]\n [--data-file DATA_FILE]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
7012
7023
|
],
|
|
7013
7024
|
"stability": "stable",
|
|
7014
7025
|
"handler": "_fn"
|
|
@@ -17585,7 +17596,9 @@
|
|
|
17585
17596
|
"add_to_sequence",
|
|
17586
17597
|
"http_request",
|
|
17587
17598
|
"add_to_leads",
|
|
17588
|
-
"sync_to_leads"
|
|
17599
|
+
"sync_to_leads",
|
|
17600
|
+
"sync_to_leads_array",
|
|
17601
|
+
"add_to_leads_array"
|
|
17589
17602
|
],
|
|
17590
17603
|
"default_when_omitted": "all",
|
|
17591
17604
|
"default": "all",
|
|
@@ -17710,7 +17723,7 @@
|
|
|
17710
17723
|
},
|
|
17711
17724
|
"availability": null,
|
|
17712
17725
|
"examples": [
|
|
17713
|
-
"autotouch columns recipe [-h]\n [--type {all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads}]\n [--research-mode {lite,heavy}]\n [--out-file OUT_FILE]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT |\n --json-pointer JSON_POINTER]"
|
|
17726
|
+
"autotouch columns recipe [-h]\n [--type {all,formatter,llm_enrichment,email_finder,phone_finder,lead_finder,add_to_crm,sync_to_table,add_to_sequence,http_request,add_to_leads,sync_to_leads,sync_to_leads_array,add_to_leads_array}]\n [--research-mode {lite,heavy}]\n [--out-file OUT_FILE]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT |\n --json-pointer JSON_POINTER]"
|
|
17714
17727
|
],
|
|
17715
17728
|
"stability": "stable",
|
|
17716
17729
|
"handler": "_fn"
|
|
@@ -34783,7 +34796,8 @@
|
|
|
34783
34796
|
"kind": "string",
|
|
34784
34797
|
"action": "store",
|
|
34785
34798
|
"choices": [
|
|
34786
|
-
"LEADS"
|
|
34799
|
+
"LEADS",
|
|
34800
|
+
"ACCOUNTS"
|
|
34787
34801
|
],
|
|
34788
34802
|
"flags": [
|
|
34789
34803
|
"--target"
|
|
@@ -35163,7 +35177,7 @@
|
|
|
35163
35177
|
},
|
|
35164
35178
|
"availability": null,
|
|
35165
35179
|
"examples": [
|
|
35166
|
-
"autotouch agents create [-h] [--name NAME] [--target {LEADS}]\n [--assigned-user ASSIGNED_USER]\n [--schedule-time SCHEDULE_TIME]\n [--schedule-tz SCHEDULE_TZ]\n [--schedule-frequency {hourly,every_6h,every_12h,daily,weekly}]\n [--schedule-days {all,weekdays}]\n [--schedule-day-of-week 0-6]\n [--schedule-window-start SCHEDULE_WINDOW_START]\n [--schedule-window-end SCHEDULE_WINDOW_END]\n [--auto-find-email] [--auto-find-phone]\n [--auto-broaden]\n [--auto-create-lead-mode {qualified_only,everyone,manual_only}]\n [--auto-sequence-id AUTO_SEQUENCE_ID]\n [--status {DRAFT,ACTIVE,PAUSED}]\n [--from-file FROM_FILE] [--generate]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT | --json-pointer JSON_POINTER]\n [--verbose]"
|
|
35180
|
+
"autotouch agents create [-h] [--name NAME] [--target {LEADS,ACCOUNTS}]\n [--assigned-user ASSIGNED_USER]\n [--schedule-time SCHEDULE_TIME]\n [--schedule-tz SCHEDULE_TZ]\n [--schedule-frequency {hourly,every_6h,every_12h,daily,weekly}]\n [--schedule-days {all,weekdays}]\n [--schedule-day-of-week 0-6]\n [--schedule-window-start SCHEDULE_WINDOW_START]\n [--schedule-window-end SCHEDULE_WINDOW_END]\n [--auto-find-email] [--auto-find-phone]\n [--auto-broaden]\n [--auto-create-lead-mode {qualified_only,everyone,manual_only}]\n [--auto-sequence-id AUTO_SEQUENCE_ID]\n [--status {DRAFT,ACTIVE,PAUSED}]\n [--from-file FROM_FILE] [--generate]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}] [--compact]\n [--select SELECT | --json-pointer JSON_POINTER]\n [--verbose]"
|
|
35167
35181
|
],
|
|
35168
35182
|
"stability": "stable",
|
|
35169
35183
|
"handler": "_fn"
|
|
@@ -36335,7 +36349,8 @@
|
|
|
36335
36349
|
"kind": "string",
|
|
36336
36350
|
"action": "store",
|
|
36337
36351
|
"choices": [
|
|
36338
|
-
"LEADS"
|
|
36352
|
+
"LEADS",
|
|
36353
|
+
"ACCOUNTS"
|
|
36339
36354
|
],
|
|
36340
36355
|
"default_when_omitted": "LEADS",
|
|
36341
36356
|
"default": "LEADS",
|
|
@@ -36508,7 +36523,7 @@
|
|
|
36508
36523
|
},
|
|
36509
36524
|
"availability": null,
|
|
36510
36525
|
"examples": [
|
|
36511
|
-
"autotouch agents generate-persona [-h] [--target {LEADS}]\n [--current-config CURRENT_CONFIG]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
36526
|
+
"autotouch agents generate-persona [-h] [--target {LEADS,ACCOUNTS}]\n [--current-config CURRENT_CONFIG]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
36512
36527
|
],
|
|
36513
36528
|
"stability": "stable",
|
|
36514
36529
|
"handler": "_fn"
|
|
@@ -36534,7 +36549,8 @@
|
|
|
36534
36549
|
"kind": "string",
|
|
36535
36550
|
"action": "store",
|
|
36536
36551
|
"choices": [
|
|
36537
|
-
"LEADS"
|
|
36552
|
+
"LEADS",
|
|
36553
|
+
"ACCOUNTS"
|
|
36538
36554
|
],
|
|
36539
36555
|
"default_when_omitted": "LEADS",
|
|
36540
36556
|
"default": "LEADS",
|
|
@@ -36719,7 +36735,7 @@
|
|
|
36719
36735
|
},
|
|
36720
36736
|
"availability": null,
|
|
36721
36737
|
"examples": [
|
|
36722
|
-
"autotouch agents generate-topics [-h] [--target {LEADS}]\n [--persona PERSONA]\n [--current-topics CURRENT_TOPICS]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
36738
|
+
"autotouch agents generate-topics [-h] [--target {LEADS,ACCOUNTS}]\n [--persona PERSONA]\n [--current-topics CURRENT_TOPICS]\n [--base-url BASE_URL] [--token TOKEN]\n [--use-x-api-key] [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
36723
36739
|
],
|
|
36724
36740
|
"stability": "stable",
|
|
36725
36741
|
"handler": "_fn"
|
|
@@ -36745,7 +36761,8 @@
|
|
|
36745
36761
|
"kind": "string",
|
|
36746
36762
|
"action": "store",
|
|
36747
36763
|
"choices": [
|
|
36748
|
-
"LEADS"
|
|
36764
|
+
"LEADS",
|
|
36765
|
+
"ACCOUNTS"
|
|
36749
36766
|
],
|
|
36750
36767
|
"default_when_omitted": "LEADS",
|
|
36751
36768
|
"default": "LEADS",
|
|
@@ -36942,7 +36959,7 @@
|
|
|
36942
36959
|
},
|
|
36943
36960
|
"availability": null,
|
|
36944
36961
|
"examples": [
|
|
36945
|
-
"autotouch agents generate-job-signal [-h] [--target {LEADS}]\n [--persona PERSONA]\n [--current-titles CURRENT_TITLES]\n [--current-keywords CURRENT_KEYWORDS]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
36962
|
+
"autotouch agents generate-job-signal [-h] [--target {LEADS,ACCOUNTS}]\n [--persona PERSONA]\n [--current-titles CURRENT_TITLES]\n [--current-keywords CURRENT_KEYWORDS]\n [--base-url BASE_URL]\n [--token TOKEN] [--use-x-api-key]\n [--timeout TIMEOUT]\n [--output {json,ndjson,human}]\n [--compact] [--select SELECT |\n --json-pointer JSON_POINTER]\n [--verbose]"
|
|
36946
36963
|
],
|
|
36947
36964
|
"stability": "stable",
|
|
36948
36965
|
"handler": "_fn"
|
|
@@ -51,6 +51,69 @@ COLUMN_RECIPE_ALIASES: Dict[str, Dict[str, Any]] = {
|
|
|
51
51
|
"Emits the standard Sync to Leads payload. Internal provider/config names remain add_to_crm.",
|
|
52
52
|
],
|
|
53
53
|
},
|
|
54
|
+
"sync_to_leads_array": {
|
|
55
|
+
"canonical": "add_to_crm",
|
|
56
|
+
"key": "sync_contact_list_to_leads",
|
|
57
|
+
"label": "Sync Contact List to Leads",
|
|
58
|
+
"payload": {
|
|
59
|
+
"key": "sync_contact_list_to_leads",
|
|
60
|
+
"label": "Sync Contact List to Leads",
|
|
61
|
+
"kind": "enrichment",
|
|
62
|
+
"dataType": "json",
|
|
63
|
+
"origin": "manual",
|
|
64
|
+
"autoRun": "onSourceUpdate",
|
|
65
|
+
"config": {
|
|
66
|
+
"provider": "add_to_crm",
|
|
67
|
+
"requireCompanyDomain": True,
|
|
68
|
+
"leadSource": "research_table_export",
|
|
69
|
+
"fieldMappings": {
|
|
70
|
+
"mode": "array",
|
|
71
|
+
"sourceColumn": "<CONTACT_LIST_COLUMN_KEY>",
|
|
72
|
+
"sourceArrayPath": "contacts",
|
|
73
|
+
"common": {
|
|
74
|
+
"companyDomain": "domain",
|
|
75
|
+
"companyName": "company_name",
|
|
76
|
+
},
|
|
77
|
+
"template": {
|
|
78
|
+
"linkedinUrl": "linkedin_url",
|
|
79
|
+
"firstName": "first_name",
|
|
80
|
+
"lastName": "last_name",
|
|
81
|
+
"title": "title",
|
|
82
|
+
"companyName": "company_name",
|
|
83
|
+
"companyDomain": "company_domain",
|
|
84
|
+
"emailAddresses": [
|
|
85
|
+
{"column": "work_email", "type": "work"},
|
|
86
|
+
{"column": "email", "type": "work"},
|
|
87
|
+
],
|
|
88
|
+
"phoneNumbers": [
|
|
89
|
+
{"column": "mobile_phone", "type": "mobile"},
|
|
90
|
+
{"column": "phone", "type": "mobile"},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
"sourceColumns": [
|
|
95
|
+
"<CONTACT_LIST_COLUMN_KEY>",
|
|
96
|
+
"domain",
|
|
97
|
+
"company_name",
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
"notes": [
|
|
102
|
+
"Use this when an upstream research column returns a contact/person array such as contacts[], people[], leads[], or items[] and the goal is to write Leads directly.",
|
|
103
|
+
"Set config.fieldMappings.sourceColumn to the upstream column key, for example key_buyer_leads.",
|
|
104
|
+
"Set config.fieldMappings.sourceArrayPath to the array path inside that JSON value; use contacts for key_buyer_leads.contacts[] or items for canonical items[].",
|
|
105
|
+
"Template fields are item-relative: linkedinUrl=linkedin_url reads each array item's linkedin_url.",
|
|
106
|
+
"Common fields are parent-row mappings used for every item, usually domain/company_name.",
|
|
107
|
+
"Prefer this over manual row extraction, local JSON files, and rows add/import when writing discovered contacts into Leads CRM.",
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
"add_to_leads_array": {
|
|
111
|
+
"canonical": "add_to_crm",
|
|
112
|
+
"alias_of": "sync_to_leads_array",
|
|
113
|
+
"notes": [
|
|
114
|
+
"Legacy-friendly alias for sync_to_leads_array.",
|
|
115
|
+
],
|
|
116
|
+
},
|
|
54
117
|
}
|
|
55
118
|
COLUMN_RECIPE_TYPES = tuple(dict.fromkeys([*COLUMN_RECIPE_BASE_TYPES, *COLUMN_RECIPE_ALIASES.keys()]))
|
|
56
119
|
WORKFLOW_BLUEPRINT_TYPES = tuple(sorted(automation_workflow_blueprints().keys()))
|
|
@@ -103,11 +166,16 @@ def _build_column_recipe_catalog() -> Tuple[Dict[str, Dict[str, Any]], Dict[str,
|
|
|
103
166
|
recipes[recipe_type] = payload
|
|
104
167
|
notes[recipe_type] = contract.recipe_notes_list()
|
|
105
168
|
for alias, metadata in COLUMN_RECIPE_ALIASES.items():
|
|
169
|
+
alias_of = str(metadata.get("alias_of") or "").strip()
|
|
170
|
+
if alias_of and alias_of in recipes:
|
|
171
|
+
recipes[alias] = json.loads(json.dumps(recipes[alias_of]))
|
|
172
|
+
notes[alias] = list(metadata.get("notes") or []) + list(notes.get(alias_of) or [])
|
|
173
|
+
continue
|
|
106
174
|
canonical = str(metadata.get("canonical") or "").strip()
|
|
107
175
|
canonical_payload = recipes.get(canonical)
|
|
108
176
|
if not isinstance(canonical_payload, dict):
|
|
109
177
|
continue
|
|
110
|
-
alias_payload = json.loads(json.dumps(canonical_payload))
|
|
178
|
+
alias_payload = json.loads(json.dumps(metadata.get("payload") or canonical_payload))
|
|
111
179
|
if metadata.get("key"):
|
|
112
180
|
alias_payload["key"] = metadata["key"]
|
|
113
181
|
if metadata.get("label"):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: autotouch-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.88
|
|
4
4
|
Summary: Autotouch Smart Table CLI
|
|
5
5
|
Project-URL: Homepage, https://app.autotouch.ai
|
|
6
6
|
Project-URL: Documentation, https://github.com/nicolonic/autotouch_main/tree/main/docs/research-table/reference
|
|
@@ -36,6 +36,8 @@ For a shipped human-readable reference generated from the installed parser, use
|
|
|
36
36
|
|
|
37
37
|
## Install
|
|
38
38
|
|
|
39
|
+
Released package:
|
|
40
|
+
|
|
39
41
|
```bash
|
|
40
42
|
pipx install autotouch-cli
|
|
41
43
|
# or
|
|
@@ -44,6 +46,16 @@ pip install autotouch-cli
|
|
|
44
46
|
pip install -U autotouch-cli
|
|
45
47
|
```
|
|
46
48
|
|
|
49
|
+
Unreleased branch or pre-publish build:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
pipx install --force "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
|
|
53
|
+
# or
|
|
54
|
+
python -m pip install -U "git+ssh://git@github.com/nicolonic/autotouch_main.git@<branch-or-sha>"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The `autotouch-cli` package name installs the latest published package from the configured package index. Use the git/source install form when testing a version bump before the release tag has published.
|
|
58
|
+
|
|
47
59
|
## First Run
|
|
48
60
|
|
|
49
61
|
Existing developer key:
|
|
@@ -132,7 +144,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
|
|
|
132
144
|
- Inspect rows: `autotouch rows list`, `autotouch rows get`
|
|
133
145
|
- Inspect one cell: `autotouch cells get`
|
|
134
146
|
- Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
|
|
135
|
-
- Run
|
|
147
|
+
- Run Exa Company Search for basic company discovery, competitors, and lookalikes: `autotouch search companies`, `autotouch search similar-companies`
|
|
136
148
|
- Inspect list-build inputs: `autotouch list-build inputs`
|
|
137
149
|
- Build durable company and lead lists on Smart Table workers: `autotouch list-build companies`, `autotouch list-build leads`
|
|
138
150
|
- Check connected LinkedIn account status/limits: `autotouch linkedin status`, `autotouch linkedin limits`
|
|
@@ -146,13 +158,19 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
|
|
|
146
158
|
|
|
147
159
|
Autotouch has two different company/people discovery paths.
|
|
148
160
|
|
|
149
|
-
Use `autotouch search companies`
|
|
161
|
+
Use `autotouch search companies` for Exa Company Search when the target is basic company discovery, competitors, lookalikes, or a semantic company search. Put company constraints directly in natural language: industry, geography, funding, headcount, technology, founded date, and similarity. Examples: "AI workflow platforms for healthcare", "US education software startups focused on AI math tutoring with 1-50 employees", or "companies like Rippling for HR and workforce management". Exa company search returns up to 100 results per API call and costs 1 credit per 10 returned results.
|
|
162
|
+
|
|
163
|
+
Use `autotouch search similar-companies` as a convenience wrapper for Exa Company Search similarity. Prefer `--query` for Exa's documented semantic patterns, such as "companies like Notion", "competitors of Stripe", or "companies working on making space travel cheaper". The older seed fields `company_name`, `company_domain`, and `company_description` remain available when you want the CLI/API to compose that query; it does not use Exa `/findSimilar`.
|
|
150
164
|
|
|
151
|
-
Use `autotouch
|
|
165
|
+
Use `autotouch search people` for provider-hidden people search when the target is niche, semantic, or hard to express with structured filters. People search currently returns at most 10 results per API call and costs 1 credit per API call.
|
|
166
|
+
|
|
167
|
+
Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable LinkedIn/Sales Navigator list construction. This is the only CLI path for building LinkedIn-sourced company and lead lists. Treat list builds as the sourcing step for the Smart Table research workspace: build company/account records first by default, add the records to a research table, then enrich, score, segment, find related leads, attach signals/notes, and continue downstream workflows from that table. Use lead builds directly when the request is explicitly person/contact focused. This path uses Autotouch-managed provider access, so users do not need to connect their own LinkedIn account. Use filters like geography IDs, company size, industry IDs, title/persona, and current company IDs; call `autotouch list-build inputs` for supported values. Durable list builds run as background jobs with status/results endpoints and cost 1 credit per successful non-empty result page.
|
|
152
168
|
|
|
153
169
|
For structured company builds, start with industry IDs plus geo/company-size filters. User-supplied `keywords` are optional when structured filters are present; use them only to refine, disambiguate, or recover hard-to-classify targets instead of carrying the whole target definition.
|
|
154
170
|
|
|
155
|
-
For account-first prospecting, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use
|
|
171
|
+
For account-first prospecting from LinkedIn/Sales Navigator, build companies/accounts first, inspect the returned company IDs, then pass those IDs to `autotouch list-build leads --current-company-id ...`. Do not use Exa company search as a default pre-step for every LinkedIn list build; use it when the user's target is genuinely semantic, niche, competitor-based, or not meant to be LinkedIn-sourced.
|
|
172
|
+
|
|
173
|
+
Use `autotouch agents ...` for recurring signal-based discovery. Scheduled agents support `--target ACCOUNTS` for company/account output and `--target LEADS` for people output. Every agent writes a source/signal table for the evidence it used; lead agents then write `candidate_research.candidates[]` on source rows and list-sync those candidates into the lead/candidate output table. See the agent playbook for the full source-table and candidate-sync contract.
|
|
156
174
|
|
|
157
175
|
## More
|
|
158
176
|
|
|
@@ -160,7 +178,7 @@ For automation or agent-driven setup, use:
|
|
|
160
178
|
- `autotouch cli-manifest --output json` for the local machine-readable command contract
|
|
161
179
|
- `autotouch cli-reference` for the shipped parser-generated reference
|
|
162
180
|
- `autotouch capabilities --output json` for provider/workflow contracts
|
|
163
|
-
- `autotouch --version` should be `0.2.
|
|
181
|
+
- `autotouch --version` should be `0.2.88` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, the cleaned single LinkedIn-sourced list-build path, Exa Company Search up to 100 results, and scheduled agent `--target ACCOUNTS|LEADS`
|
|
164
182
|
- `autotouch capabilities --output json --select list_builds` for documented list-build inputs such as geography IDs, company size buckets, profile language, and company IDs
|
|
165
183
|
- `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
|
|
166
184
|
- `autotouch list-build companies` and `autotouch list-build leads` for durable LinkedIn-sourced company and lead list builds with Smart Table-owned background workers, visible progress, and no user-owned LinkedIn connection requirement
|
|
@@ -63,6 +63,8 @@ _LINKEDIN_CAPABILITIES: Dict[str, Any] = {
|
|
|
63
63
|
"autotouch linkedin status",
|
|
64
64
|
"autotouch linkedin limits",
|
|
65
65
|
"autotouch list-build inputs",
|
|
66
|
+
"autotouch list-build inputs --type geo --query 'United States'",
|
|
67
|
+
"autotouch list-build inputs --type industry --query 'software'",
|
|
66
68
|
"autotouch list-build companies --geo-id 103644278 --industry-id <industry_id> --company-size 1-10 --num-results 100 --wait",
|
|
67
69
|
],
|
|
68
70
|
}
|
|
@@ -837,16 +837,47 @@ _PROVIDER_CONTRACTS: Tuple[ResearchTableProviderContract, ...] = (
|
|
|
837
837
|
{"linkedinUrl": {"column": "linkedin_lookup", "path": "linkedin_url"}},
|
|
838
838
|
],
|
|
839
839
|
},
|
|
840
|
+
"array_mode": {
|
|
841
|
+
"mode": "config.fieldMappings.mode=array",
|
|
842
|
+
"source_column_field": "config.fieldMappings.sourceColumn",
|
|
843
|
+
"array_path_field": "config.fieldMappings.sourceArrayPath",
|
|
844
|
+
"default_array_path": "items",
|
|
845
|
+
"common_field": "config.fieldMappings.common",
|
|
846
|
+
"template_field": "config.fieldMappings.template",
|
|
847
|
+
"template_scope": "item-relative",
|
|
848
|
+
"recommended_recipe": "autotouch columns recipe --type sync_to_leads_array",
|
|
849
|
+
"example": {
|
|
850
|
+
"sourceColumn": "key_buyer_leads",
|
|
851
|
+
"sourceArrayPath": "contacts",
|
|
852
|
+
"template": {
|
|
853
|
+
"firstName": "first_name",
|
|
854
|
+
"lastName": "last_name",
|
|
855
|
+
"linkedinUrl": "linkedin_url",
|
|
856
|
+
},
|
|
857
|
+
},
|
|
858
|
+
},
|
|
840
859
|
},
|
|
841
860
|
composition_contract={
|
|
842
861
|
"consumes": {
|
|
843
862
|
"kind": "crm_export_inputs",
|
|
844
|
-
"shape": "mapped source row values
|
|
863
|
+
"shape": "mapped source row values, multi-slot mappings, or array-mode contact/person items from a structured source column; strict mode requires company domain plus hard identity or, in single mode, provisional firstName/lastName fallback",
|
|
845
864
|
},
|
|
846
865
|
"produces": {
|
|
847
866
|
"kind": "lead_ids",
|
|
848
867
|
"shape": "lead creation/update result with CRM lead ids stored on the source row",
|
|
849
868
|
},
|
|
869
|
+
"decision_hints": {
|
|
870
|
+
"prefer_when": [
|
|
871
|
+
"the target output is Leads CRM, not a separate contacts research table",
|
|
872
|
+
"an upstream research column already returns contacts[], people[], leads[], or items[]",
|
|
873
|
+
],
|
|
874
|
+
"prefer_sync_to_table_when": [
|
|
875
|
+
"you need a destination contacts table for per-contact enrichment, review, export, or sequencing context before CRM sync",
|
|
876
|
+
],
|
|
877
|
+
"avoid": [
|
|
878
|
+
"manual rows list -> local JSON transform -> rows add/import for contacts produced by an upstream column",
|
|
879
|
+
],
|
|
880
|
+
},
|
|
850
881
|
"common_next_steps": [
|
|
851
882
|
"add_to_sequence using the column key that stores those lead IDs",
|
|
852
883
|
],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Shared
|
|
1
|
+
"""Shared search contract for Exa company search, people search, and related API capabilities."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -15,8 +15,8 @@ _SEARCH_ENDPOINTS: Dict[str, Dict[str, Any]] = {
|
|
|
15
15
|
"path": "/api/search/companies",
|
|
16
16
|
"required_scope": SEARCH_SCOPE,
|
|
17
17
|
"body": {
|
|
18
|
-
"query": "required
|
|
19
|
-
"limit": "optional 1-
|
|
18
|
+
"query": "required Exa Company Search natural-language query; include industry, geography, funding, headcount, technology, and similarity constraints in the query",
|
|
19
|
+
"limit": "optional 1-100 (default 10)",
|
|
20
20
|
},
|
|
21
21
|
"response": {"items_field": "items", "item_type": "company"},
|
|
22
22
|
},
|
|
@@ -38,10 +38,11 @@ _SEARCH_ENDPOINTS: Dict[str, Dict[str, Any]] = {
|
|
|
38
38
|
"path": "/api/search/similar-companies",
|
|
39
39
|
"required_scope": SEARCH_SCOPE,
|
|
40
40
|
"body": {
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
41
|
+
"query": "optional Exa Company Search semantic similarity query; use this for direct Exa query patterns like 'companies like Notion' or 'competitors of Stripe'",
|
|
42
|
+
"company_name": "optional seed company name used when query is omitted",
|
|
43
|
+
"company_domain": "optional official company domain used to disambiguate the seed in the Exa Company Search query",
|
|
44
|
+
"company_description": "optional semantic description appended to the Exa Company Search query",
|
|
45
|
+
"limit": "optional 1-100 (default 10)",
|
|
45
46
|
},
|
|
46
47
|
"response": {"items_field": "items", "item_type": "company"},
|
|
47
48
|
},
|
|
@@ -108,13 +109,14 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
|
|
|
108
109
|
"use_company_search_when": [
|
|
109
110
|
"you need to discover target accounts before looking for contacts",
|
|
110
111
|
"the search criteria are market, product, or industry driven",
|
|
112
|
+
"the user wants basic company discovery, competitors, lookalikes, or a semantic company search",
|
|
111
113
|
],
|
|
112
114
|
"use_people_search_when": [
|
|
113
115
|
"you already know the target companies",
|
|
114
116
|
"the search criteria are role, persona, or skill driven",
|
|
115
117
|
],
|
|
116
118
|
"use_list_build_instead_when": [
|
|
117
|
-
"the user wants a LinkedIn-sourced company or lead list",
|
|
119
|
+
"the user wants a LinkedIn/Sales Navigator-sourced company or lead list",
|
|
118
120
|
"the search can be expressed with geography, industry, company size, title, or current-company filters",
|
|
119
121
|
"the desired output is a durable background job with status/results",
|
|
120
122
|
],
|
|
@@ -122,9 +124,9 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
|
|
|
122
124
|
"pricing": {
|
|
123
125
|
"charge_on": "api_call_or_actual_results_returned",
|
|
124
126
|
"families": {
|
|
125
|
-
"companies": {"
|
|
127
|
+
"companies": {"credits_per_bucket": 1, "bucket_size": 10, "max_results_per_call": 100, "rule": "1 credit per 10 returned Exa company results"},
|
|
126
128
|
"people": {"credits_per_call": 1, "max_results_per_call": 10, "rule": "1 credit per neural search API call"},
|
|
127
|
-
"similar_companies": {"
|
|
129
|
+
"similar_companies": {"credits_per_bucket": 1, "bucket_size": 10, "max_results_per_call": 100, "rule": "1 credit per 10 returned Exa company results"},
|
|
128
130
|
"news": {"credits_per_bucket": 1, "bucket_size": 25, "rule": "1 credit per 25 results"},
|
|
129
131
|
"local_businesses": {"credits_per_bucket": 1, "bucket_size": 25, "rule": "1 credit per 25 results"},
|
|
130
132
|
"reviews": {"credits_per_bucket": 1, "bucket_size": 25, "rule": "1 credit per 25 results"},
|
|
@@ -132,8 +134,9 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
|
|
|
132
134
|
},
|
|
133
135
|
},
|
|
134
136
|
"recommended_cli": [
|
|
135
|
-
"autotouch search companies --query 'remote IT asset management' --limit
|
|
136
|
-
"autotouch search
|
|
137
|
+
"autotouch search companies --query 'remote IT asset management companies in the US with 50-200 employees' --limit 100",
|
|
138
|
+
"autotouch search companies --query 'companies like Rippling in HR software, based in the United States, with 50-500 employees' --limit 100",
|
|
139
|
+
"autotouch search people --query 'VP IT' --company 'Rippling' --limit 10",
|
|
137
140
|
"autotouch search recipe --type companies --out-file companies.json",
|
|
138
141
|
],
|
|
139
142
|
}
|
|
@@ -141,11 +144,12 @@ _SEARCH_CAPABILITIES: Dict[str, Any] = {
|
|
|
141
144
|
|
|
142
145
|
_SEARCH_RECIPES: Dict[str, Dict[str, Any]] = {
|
|
143
146
|
"companies": {
|
|
144
|
-
"payload": {"query": "remote IT asset management", "limit":
|
|
147
|
+
"payload": {"query": "remote IT asset management companies in the US with 50-200 employees", "limit": 100},
|
|
145
148
|
"usage": "autotouch search companies --data-file <payload.json>",
|
|
146
149
|
"notes": [
|
|
147
|
-
"Use this
|
|
148
|
-
"
|
|
150
|
+
"Use this for basic Exa Company Search: company discovery, competitors, lookalikes, and semantic market scans.",
|
|
151
|
+
"Put Exa company constraints in natural language: industry, geography, funding, headcount, technology, founded date, and similarity.",
|
|
152
|
+
"Pricing: 1 credit per 10 returned Exa company results. Max 100 returned companies per call.",
|
|
149
153
|
],
|
|
150
154
|
},
|
|
151
155
|
"people": {
|
|
@@ -164,16 +168,15 @@ _SEARCH_RECIPES: Dict[str, Dict[str, Any]] = {
|
|
|
164
168
|
},
|
|
165
169
|
"similar_companies": {
|
|
166
170
|
"payload": {
|
|
167
|
-
"
|
|
168
|
-
"
|
|
169
|
-
"company_description": "Workforce management and HR software platform for businesses",
|
|
170
|
-
"limit": 10,
|
|
171
|
+
"query": "companies like Rippling for workforce management, HR, payroll, IT, benefits, devices, and app access",
|
|
172
|
+
"limit": 100,
|
|
171
173
|
},
|
|
172
174
|
"usage": "autotouch search similar-companies --data-file <payload.json>",
|
|
173
175
|
"notes": [
|
|
174
|
-
"
|
|
175
|
-
"
|
|
176
|
-
"
|
|
176
|
+
"Convenience wrapper for Exa Company Search similarity queries, not Exa /findSimilar.",
|
|
177
|
+
"Prefer query for Exa's documented semantic patterns: companies like X, competitors of X, or companies working on Y.",
|
|
178
|
+
"Seed fields company_name, company_domain, and company_description remain available when you want the CLI/API to compose the query.",
|
|
179
|
+
"Pricing: 1 credit per 10 returned Exa company results. Max 100 returned companies per call.",
|
|
177
180
|
],
|
|
178
181
|
},
|
|
179
182
|
"news": {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|