autotouch-cli 0.2.83__tar.gz → 0.2.86__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.83 → autotouch_cli-0.2.86}/PKG-INFO +3 -3
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/README.md +2 -2
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/cli.py +1 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/columns.py +76 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/list_build.py +61 -16
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/data/CLI_REFERENCE.md +48 -42
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/data/cli-manifest.json +283 -245
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/templates.py +28 -2
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/PKG-INFO +3 -3
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/list_build_contract.py +34 -5
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/provider_registry.py +2 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/pyproject.toml +1 -1
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/MANIFEST.in +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/__init__.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/cli_contracts.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/__init__.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/agents.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/auth.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/cells.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/jobs.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/leads.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/linkedin.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/prompts.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/rows.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/search.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/sequences.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/tables.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/tasks.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/webhooks.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/commands/workspace_secrets.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/__init__.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/auth.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/config.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/csv_import.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/http.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/io.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/output.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/polling.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/run.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/core/validation.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/exceptions.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/mongo_status.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/parser.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/parser_groups.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli/sequence_support.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/SOURCES.txt +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/dependency_links.txt +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/entry_points.txt +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/requires.txt +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_cli.egg-info/top_level.txt +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/__init__.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/linkedin_contract.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/linkedin_filters.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/autotouch_shared/search_contract.py +0 -0
- {autotouch_cli-0.2.83 → autotouch_cli-0.2.86}/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.86
|
|
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
|
|
@@ -150,7 +150,7 @@ Use `autotouch search companies` and `autotouch search people` for neural search
|
|
|
150
150
|
|
|
151
151
|
Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable 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
152
|
|
|
153
|
-
For structured company builds, start with industry IDs plus geo/company-size filters.
|
|
153
|
+
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
154
|
|
|
155
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 neural search as a default pre-step for every list build; use it when the user's target is genuinely semantic or niche.
|
|
156
156
|
|
|
@@ -160,7 +160,7 @@ For automation or agent-driven setup, use:
|
|
|
160
160
|
- `autotouch cli-manifest --output json` for the local machine-readable command contract
|
|
161
161
|
- `autotouch cli-reference` for the shipped parser-generated reference
|
|
162
162
|
- `autotouch capabilities --output json` for provider/workflow contracts
|
|
163
|
-
- `autotouch --version` should be `0.2.
|
|
163
|
+
- `autotouch --version` should be `0.2.85` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, and the cleaned single LinkedIn-sourced list-build path
|
|
164
164
|
- `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
165
|
- `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
|
|
166
166
|
- `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
|
|
@@ -125,7 +125,7 @@ Use `autotouch search companies` and `autotouch search people` for neural search
|
|
|
125
125
|
|
|
126
126
|
Use `autotouch list-build companies` and `autotouch list-build leads` for structured, repeatable 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
127
|
|
|
128
|
-
For structured company builds, start with industry IDs plus geo/company-size filters.
|
|
128
|
+
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
129
|
|
|
130
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 neural search as a default pre-step for every list build; use it when the user's target is genuinely semantic or niche.
|
|
131
131
|
|
|
@@ -135,7 +135,7 @@ For automation or agent-driven setup, use:
|
|
|
135
135
|
- `autotouch cli-manifest --output json` for the local machine-readable command contract
|
|
136
136
|
- `autotouch cli-reference` for the shipped parser-generated reference
|
|
137
137
|
- `autotouch capabilities --output json` for provider/workflow contracts
|
|
138
|
-
- `autotouch --version` should be `0.2.
|
|
138
|
+
- `autotouch --version` should be `0.2.85` or newer for structured company list builds without user-supplied keywords, stored list-build input lookup, research-workspace list-build guidance, and the cleaned single LinkedIn-sourced list-build path
|
|
139
139
|
- `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
140
|
- `autotouch list-build inputs` and `autotouch list-build pricing` before creating durable list-build jobs
|
|
141
141
|
- `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
|
|
@@ -2398,6 +2398,7 @@ cmd_auth_schema = _bound("auth_schema")
|
|
|
2398
2398
|
cmd_auth_whoami = _bound("auth_whoami")
|
|
2399
2399
|
cmd_cells_get = _bound("cells_get")
|
|
2400
2400
|
cmd_columns_create = _bound("columns_create")
|
|
2401
|
+
cmd_columns_update = _bound("columns_update")
|
|
2401
2402
|
cmd_columns_move = _bound("columns_move")
|
|
2402
2403
|
cmd_columns_projections = _bound("columns_projections")
|
|
2403
2404
|
cmd_columns_run_next = _bound("columns_run_next")
|
|
@@ -7,6 +7,16 @@ from typing import Any, Callable, Dict, Sequence
|
|
|
7
7
|
from autotouch_cli.exceptions import AutotouchCreditError, AutotouchInputError
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
_RESEARCH_MODE_ALIASES = {
|
|
11
|
+
"lite": "lite",
|
|
12
|
+
"light": "lite",
|
|
13
|
+
"quick": "lite",
|
|
14
|
+
"heavy": "heavy",
|
|
15
|
+
"deep": "heavy",
|
|
16
|
+
"thorough": "heavy",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
10
20
|
@dataclass(frozen=True)
|
|
11
21
|
class ColumnCommandRuntime:
|
|
12
22
|
resolve_token: Callable[[str | None, bool], str | None]
|
|
@@ -52,6 +62,54 @@ def _apply_column_position_overrides(
|
|
|
52
62
|
return merged
|
|
53
63
|
|
|
54
64
|
|
|
65
|
+
def _normalize_research_mode_option(value: Any) -> str:
|
|
66
|
+
normalized = str(value or "").strip().lower()
|
|
67
|
+
if normalized in _RESEARCH_MODE_ALIASES:
|
|
68
|
+
return _RESEARCH_MODE_ALIASES[normalized]
|
|
69
|
+
raise AutotouchInputError("--research-mode must be one of: lite, heavy")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _apply_research_mode_overrides(
|
|
73
|
+
payload: Dict[str, Any],
|
|
74
|
+
args: argparse.Namespace,
|
|
75
|
+
*,
|
|
76
|
+
force_agent_on_explicit: bool,
|
|
77
|
+
) -> Dict[str, Any]:
|
|
78
|
+
explicit_value = getattr(args, "research_mode", None)
|
|
79
|
+
config = payload.get("config")
|
|
80
|
+
if not isinstance(config, dict):
|
|
81
|
+
if explicit_value is None:
|
|
82
|
+
return payload
|
|
83
|
+
config = {}
|
|
84
|
+
|
|
85
|
+
current_mode = str(config.get("mode") or "").strip().lower()
|
|
86
|
+
has_research_mode = (
|
|
87
|
+
config.get("researchMode") is not None
|
|
88
|
+
or config.get("research_mode") is not None
|
|
89
|
+
)
|
|
90
|
+
should_default_agent_lite = current_mode == "agent" and not has_research_mode
|
|
91
|
+
should_clean_agent_config = current_mode == "agent" and has_research_mode
|
|
92
|
+
if explicit_value is None and not should_default_agent_lite and not should_clean_agent_config:
|
|
93
|
+
return payload
|
|
94
|
+
|
|
95
|
+
merged = dict(payload)
|
|
96
|
+
next_config = dict(config)
|
|
97
|
+
if explicit_value is not None:
|
|
98
|
+
if force_agent_on_explicit:
|
|
99
|
+
next_config["mode"] = "agent"
|
|
100
|
+
next_config["researchMode"] = _normalize_research_mode_option(explicit_value)
|
|
101
|
+
elif config.get("researchMode") is not None:
|
|
102
|
+
next_config["researchMode"] = _normalize_research_mode_option(config.get("researchMode"))
|
|
103
|
+
elif config.get("research_mode") is not None:
|
|
104
|
+
next_config["researchMode"] = _normalize_research_mode_option(config.get("research_mode"))
|
|
105
|
+
else:
|
|
106
|
+
next_config["researchMode"] = "lite"
|
|
107
|
+
next_config.pop("research_mode", None)
|
|
108
|
+
next_config.pop("lite", None)
|
|
109
|
+
merged["config"] = next_config
|
|
110
|
+
return merged
|
|
111
|
+
|
|
112
|
+
|
|
55
113
|
def _normalize_http_request_test_payload(payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
56
114
|
candidate = payload
|
|
57
115
|
config = payload.get("config")
|
|
@@ -111,6 +169,7 @@ def cmd_columns_create(args: argparse.Namespace, *, runtime: ColumnCommandRuntim
|
|
|
111
169
|
allow_position=True,
|
|
112
170
|
allow_neighbors=True,
|
|
113
171
|
)
|
|
172
|
+
payload = _apply_research_mode_overrides(payload, args, force_agent_on_explicit=True)
|
|
114
173
|
runtime.validate_column_contract_payload_or_exit(payload)
|
|
115
174
|
runtime.validate_add_to_crm_create_payload(payload)
|
|
116
175
|
data = runtime.request_api(
|
|
@@ -156,6 +215,7 @@ def cmd_columns_update(args: argparse.Namespace, *, runtime: ColumnCommandRuntim
|
|
|
156
215
|
allow_position=True,
|
|
157
216
|
allow_neighbors=False,
|
|
158
217
|
)
|
|
218
|
+
payload = _apply_research_mode_overrides(payload, args, force_agent_on_explicit=False)
|
|
159
219
|
runtime.validate_column_contract_payload_or_exit(payload)
|
|
160
220
|
data = runtime.request_api(
|
|
161
221
|
"PATCH",
|
|
@@ -401,6 +461,11 @@ def register_columns_subcommands(
|
|
|
401
461
|
pcc.add_argument("--position", type=float, help="Explicit numeric position override")
|
|
402
462
|
pcc.add_argument("--after-column-id", help="Place the new column after this existing column id")
|
|
403
463
|
pcc.add_argument("--before-column-id", help="Place the new column before this existing column id")
|
|
464
|
+
pcc.add_argument(
|
|
465
|
+
"--research-mode",
|
|
466
|
+
choices=["lite", "heavy"],
|
|
467
|
+
help="For LLM Research Agent columns, set config.researchMode. Omitted agent columns default to lite.",
|
|
468
|
+
)
|
|
404
469
|
add_api_common_arguments(pcc)
|
|
405
470
|
pcc.set_defaults(func=handlers["create"])
|
|
406
471
|
|
|
@@ -417,6 +482,11 @@ def register_columns_subcommands(
|
|
|
417
482
|
pcu.add_argument("--data-json", help="ColumnUpdate payload JSON")
|
|
418
483
|
pcu.add_argument("--data-file", help="ColumnUpdate payload file path")
|
|
419
484
|
pcu.add_argument("--position", type=float, help="Explicit numeric position override")
|
|
485
|
+
pcu.add_argument(
|
|
486
|
+
"--research-mode",
|
|
487
|
+
choices=["lite", "heavy"],
|
|
488
|
+
help="Set config.researchMode. Include config.mode=agent when switching a Quick LLM column to Research Agent.",
|
|
489
|
+
)
|
|
420
490
|
add_api_common_arguments(pcu)
|
|
421
491
|
pcu.set_defaults(func=handlers["update"])
|
|
422
492
|
|
|
@@ -545,6 +615,12 @@ def register_columns_subcommands(
|
|
|
545
615
|
|
|
546
616
|
pcre = col_sub.add_parser("recipe", help="Print copy-ready ColumnCreate payload templates")
|
|
547
617
|
pcre.add_argument("--type", choices=["all", *column_recipe_types], default="all")
|
|
618
|
+
pcre.add_argument(
|
|
619
|
+
"--research-mode",
|
|
620
|
+
choices=["lite", "heavy"],
|
|
621
|
+
default="lite",
|
|
622
|
+
help="Research Agent depth for LLM recipes (default: lite; heavy costs more per row)",
|
|
623
|
+
)
|
|
548
624
|
pcre.add_argument("--out-file", help="Write template JSON to file (single type writes payload only)")
|
|
549
625
|
add_output_formatting_arguments(pcre)
|
|
550
626
|
pcre.set_defaults(func=handlers["recipe"])
|
|
@@ -5,6 +5,7 @@ import json
|
|
|
5
5
|
import time
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from typing import Any, Callable, Dict, Optional
|
|
8
|
+
from urllib.parse import urlencode
|
|
8
9
|
|
|
9
10
|
from autotouch_cli.exceptions import AutotouchInputError, AutotouchTimeoutError
|
|
10
11
|
|
|
@@ -43,9 +44,15 @@ def _payload(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime, kind
|
|
|
43
44
|
filters[key] = values
|
|
44
45
|
if getattr(args, "has_jobs", False):
|
|
45
46
|
filters["has_jobs"] = True
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
for attr, key in (
|
|
48
|
+
("profile_language", "profile_language"),
|
|
49
|
+
("service_category", "service_category"),
|
|
50
|
+
("first_name", "first_name"),
|
|
51
|
+
("last_name", "last_name"),
|
|
52
|
+
):
|
|
53
|
+
value = str(getattr(args, attr, "") or "").strip()
|
|
54
|
+
if value:
|
|
55
|
+
filters[key] = value
|
|
49
56
|
payload: Dict[str, Any] = {
|
|
50
57
|
"kind": kind,
|
|
51
58
|
"num_results": max(1, min(int(getattr(args, "num_results", 100) or 100), 10000)),
|
|
@@ -134,6 +141,29 @@ def cmd_list_build_results(args: argparse.Namespace, *, runtime: ListBuildComman
|
|
|
134
141
|
|
|
135
142
|
def cmd_list_build_inputs(args: argparse.Namespace, *, runtime: ListBuildCommandRuntime) -> None:
|
|
136
143
|
token = runtime.resolve_token(args.token, required=True)
|
|
144
|
+
input_type = str(getattr(args, "type", "") or "").strip()
|
|
145
|
+
query = str(getattr(args, "query", "") or "").strip()
|
|
146
|
+
if input_type or query:
|
|
147
|
+
if not input_type or not query:
|
|
148
|
+
raise AutotouchInputError("list-build inputs search requires both --type and --query")
|
|
149
|
+
params = urlencode(
|
|
150
|
+
{
|
|
151
|
+
"type": input_type,
|
|
152
|
+
"q": query,
|
|
153
|
+
"limit": max(1, min(int(getattr(args, "limit", 20) or 20), 50)),
|
|
154
|
+
}
|
|
155
|
+
)
|
|
156
|
+
data = runtime.request_api(
|
|
157
|
+
"GET",
|
|
158
|
+
f"/api/list-builds/inputs/search?{params}",
|
|
159
|
+
base_url=args.base_url,
|
|
160
|
+
token=token,
|
|
161
|
+
use_x_api_key=args.use_x_api_key,
|
|
162
|
+
timeout=args.timeout,
|
|
163
|
+
verbose=args.verbose,
|
|
164
|
+
)
|
|
165
|
+
runtime.print_json(data, args.compact)
|
|
166
|
+
return
|
|
137
167
|
data = runtime.request_api(
|
|
138
168
|
"GET",
|
|
139
169
|
"/api/list-builds/inputs",
|
|
@@ -169,20 +199,10 @@ def register_list_build_subcommands(
|
|
|
169
199
|
parser = subparsers.add_parser("list-build", help="Build durable LinkedIn-sourced company and lead lists")
|
|
170
200
|
sub = parser.add_subparsers(dest="list_build_cmd", required=True)
|
|
171
201
|
|
|
172
|
-
def
|
|
202
|
+
def add_common_create_args(p: argparse.ArgumentParser) -> None:
|
|
173
203
|
p.add_argument("--data-json", help="Explicit list-build payload JSON")
|
|
174
204
|
p.add_argument("--data-file", help="Path to list-build payload JSON file")
|
|
175
205
|
p.add_argument("--list-name", help="Optional display name")
|
|
176
|
-
p.add_argument("--keywords", help="Search keywords")
|
|
177
|
-
p.add_argument("--title", help="Lead title/persona query")
|
|
178
|
-
p.add_argument("--geo-id", action="append", help="Geography ID; repeat or comma-separate in JSON")
|
|
179
|
-
p.add_argument("--industry-id", action="append", help="Industry ID; repeat or comma-separate in JSON")
|
|
180
|
-
p.add_argument("--company-size", action="append", help="Company size bucket, e.g. 1-10 or 11-50")
|
|
181
|
-
p.add_argument("--current-company-id", action="append", help="Company ID for lead search")
|
|
182
|
-
p.add_argument("--past-company-id", action="append", help="Past company ID for lead search")
|
|
183
|
-
p.add_argument("--school-id", action="append", help="School ID for lead search")
|
|
184
|
-
p.add_argument("--profile-language", help="Profile language code, e.g. en")
|
|
185
|
-
p.add_argument("--has-jobs", action="store_true", help="Only include companies with active job listings")
|
|
186
206
|
p.add_argument("--num-results", type=int, default=100, help="Target result count, 1-10000")
|
|
187
207
|
p.add_argument("--page-size", type=int, default=25, help="Provider page size")
|
|
188
208
|
p.add_argument("--wait", action="store_true", help="Poll until terminal status")
|
|
@@ -190,12 +210,34 @@ def register_list_build_subcommands(
|
|
|
190
210
|
p.add_argument("--wait-timeout", type=int, default=0, help="Max seconds to wait (0 = no timeout)")
|
|
191
211
|
add_api_common_arguments(p)
|
|
192
212
|
|
|
213
|
+
def add_company_create_args(p: argparse.ArgumentParser) -> None:
|
|
214
|
+
add_common_create_args(p)
|
|
215
|
+
p.add_argument("--keywords", required=False, help="Optional company keyword anchor; structured filters can run without it")
|
|
216
|
+
p.add_argument("--geo-id", action="append", help="LinkedIn GeoURN ID; repeat or comma-separate in JSON")
|
|
217
|
+
p.add_argument("--industry-id", action="append", help="Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON")
|
|
218
|
+
p.add_argument("--company-size", action="append", help="Company size bucket, e.g. 1-10 or 11-50")
|
|
219
|
+
p.add_argument("--has-jobs", action="store_true", help="Only include companies with active job listings")
|
|
220
|
+
|
|
221
|
+
def add_lead_create_args(p: argparse.ArgumentParser) -> None:
|
|
222
|
+
add_common_create_args(p)
|
|
223
|
+
p.add_argument("--keywords", help="Optional free-text profile keyword")
|
|
224
|
+
p.add_argument("--title", help="Lead title/persona query")
|
|
225
|
+
p.add_argument("--geo-id", action="append", help="LinkedIn GeoURN ID; repeat or comma-separate in JSON")
|
|
226
|
+
p.add_argument("--industry-id", action="append", help="Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON")
|
|
227
|
+
p.add_argument("--current-company-id", action="append", help="Company ID returned by a company list build")
|
|
228
|
+
p.add_argument("--past-company-id", action="append", help="Past company ID for lead search")
|
|
229
|
+
p.add_argument("--school-id", action="append", help="School ID for lead search")
|
|
230
|
+
p.add_argument("--profile-language", help="Profile language code, e.g. en")
|
|
231
|
+
p.add_argument("--service-category", help="Service category string")
|
|
232
|
+
p.add_argument("--first-name", help="First-name filter")
|
|
233
|
+
p.add_argument("--last-name", help="Last-name filter")
|
|
234
|
+
|
|
193
235
|
companies = sub.add_parser("companies", help="Build a company/account list")
|
|
194
|
-
|
|
236
|
+
add_company_create_args(companies)
|
|
195
237
|
companies.set_defaults(func=handlers["companies"])
|
|
196
238
|
|
|
197
239
|
leads = sub.add_parser("leads", help="Build a lead/contact list")
|
|
198
|
-
|
|
240
|
+
add_lead_create_args(leads)
|
|
199
241
|
leads.set_defaults(func=handlers["leads"])
|
|
200
242
|
|
|
201
243
|
status = sub.add_parser("status", help="Get list-build job status")
|
|
@@ -212,6 +254,9 @@ def register_list_build_subcommands(
|
|
|
212
254
|
results.set_defaults(func=handlers["results"])
|
|
213
255
|
|
|
214
256
|
inputs = sub.add_parser("inputs", help="Show valid list-build filter IDs and values")
|
|
257
|
+
inputs.add_argument("--type", choices=["geo", "industry", "service", "title_skill", "title-skills"], help="Search input type")
|
|
258
|
+
inputs.add_argument("--query", help="Search text for input ID lookup")
|
|
259
|
+
inputs.add_argument("--limit", type=int, default=20, help="Max lookup results, 1-50")
|
|
215
260
|
add_api_common_arguments(inputs)
|
|
216
261
|
inputs.set_defaults(func=handlers["inputs"])
|
|
217
262
|
|
|
@@ -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.86`.
|
|
4
4
|
Manifest schema version: `2`.
|
|
5
5
|
|
|
6
6
|
## Output Modes
|
|
@@ -1079,6 +1079,7 @@ For llm_enrichment, there are two valid authoring paths:
|
|
|
1079
1079
|
[--data-file DATA_FILE] [--position POSITION]
|
|
1080
1080
|
[--after-column-id AFTER_COLUMN_ID]
|
|
1081
1081
|
[--before-column-id BEFORE_COLUMN_ID]
|
|
1082
|
+
[--research-mode {lite,heavy}]
|
|
1082
1083
|
[--base-url BASE_URL] [--token TOKEN]
|
|
1083
1084
|
[--use-x-api-key] [--timeout TIMEOUT]
|
|
1084
1085
|
[--output {json,ndjson,human}] [--compact]
|
|
@@ -1100,6 +1101,7 @@ The runnable prompt is always config.advancedPrompt before execution.
|
|
|
1100
1101
|
- `--position` (kind=number): Explicit numeric position override
|
|
1101
1102
|
- `--after-column-id` (kind=string): Place the new column after this existing column id
|
|
1102
1103
|
- `--before-column-id` (kind=string): Place the new column before this existing column id
|
|
1104
|
+
- `--research-mode` (kind=string; choices=lite,heavy): For LLM Research Agent columns, set config.researchMode. Omitted agent columns default to lite.
|
|
1103
1105
|
- `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
|
|
1104
1106
|
- `--token` (kind=string; sensitive): Developer API key / JWT token
|
|
1105
1107
|
- `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
|
|
@@ -1321,12 +1323,14 @@ Print copy-ready ColumnCreate payload templates
|
|
|
1321
1323
|
- Example:
|
|
1322
1324
|
- `autotouch columns recipe [-h]
|
|
1323
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}]
|
|
1326
|
+
[--research-mode {lite,heavy}]
|
|
1324
1327
|
[--out-file OUT_FILE]
|
|
1325
1328
|
[--output {json,ndjson,human}] [--compact]
|
|
1326
1329
|
[--select SELECT |
|
|
1327
1330
|
--json-pointer JSON_POINTER]`
|
|
1328
1331
|
- Options:
|
|
1329
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)
|
|
1333
|
+
- `--research-mode` (kind=string; choices=lite,heavy; default=lite): Research Agent depth for LLM recipes (default: lite; heavy costs more per row)
|
|
1330
1334
|
- `--out-file` (kind=file; input=file): Write template JSON to file (single type writes payload only)
|
|
1331
1335
|
- `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
|
|
1332
1336
|
- `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
|
|
@@ -1538,6 +1542,7 @@ Update a column definition. Nested config keys merge into the existing config, s
|
|
|
1538
1542
|
- `autotouch columns update [-h] --table-id TABLE_ID --column-id COLUMN_ID
|
|
1539
1543
|
[--data-json DATA_JSON]
|
|
1540
1544
|
[--data-file DATA_FILE] [--position POSITION]
|
|
1545
|
+
[--research-mode {lite,heavy}]
|
|
1541
1546
|
[--base-url BASE_URL] [--token TOKEN]
|
|
1542
1547
|
[--use-x-api-key] [--timeout TIMEOUT]
|
|
1543
1548
|
[--output {json,ndjson,human}] [--compact]
|
|
@@ -1549,6 +1554,7 @@ Update a column definition. Nested config keys merge into the existing config, s
|
|
|
1549
1554
|
- `--data-json` (kind=json; input=json): ColumnUpdate payload JSON
|
|
1550
1555
|
- `--data-file` (kind=file; input=file): ColumnUpdate payload file path
|
|
1551
1556
|
- `--position` (kind=number): Explicit numeric position override
|
|
1557
|
+
- `--research-mode` (kind=string; choices=lite,heavy): Set config.researchMode. Include config.mode=agent when switching a Quick LLM column to Research Agent.
|
|
1552
1558
|
- `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
|
|
1553
1559
|
- `--token` (kind=string; sensitive): Developer API key / JWT token
|
|
1554
1560
|
- `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
|
|
@@ -2323,15 +2329,7 @@ Build a company/account list
|
|
|
2323
2329
|
- `autotouch list-build companies [-h] [--data-json DATA_JSON]
|
|
2324
2330
|
[--data-file DATA_FILE]
|
|
2325
2331
|
[--list-name LIST_NAME]
|
|
2326
|
-
[--
|
|
2327
|
-
[--geo-id GEO_ID]
|
|
2328
|
-
[--industry-id INDUSTRY_ID]
|
|
2329
|
-
[--company-size COMPANY_SIZE]
|
|
2330
|
-
[--current-company-id CURRENT_COMPANY_ID]
|
|
2331
|
-
[--past-company-id PAST_COMPANY_ID]
|
|
2332
|
-
[--school-id SCHOOL_ID]
|
|
2333
|
-
[--profile-language PROFILE_LANGUAGE]
|
|
2334
|
-
[--has-jobs] [--num-results NUM_RESULTS]
|
|
2332
|
+
[--num-results NUM_RESULTS]
|
|
2335
2333
|
[--page-size PAGE_SIZE] [--wait]
|
|
2336
2334
|
[--poll-interval POLL_INTERVAL]
|
|
2337
2335
|
[--wait-timeout WAIT_TIMEOUT]
|
|
@@ -2339,21 +2337,15 @@ Build a company/account list
|
|
|
2339
2337
|
[--use-x-api-key] [--timeout TIMEOUT]
|
|
2340
2338
|
[--output {json,ndjson,human}]
|
|
2341
2339
|
[--compact] [--select SELECT |
|
|
2342
|
-
--json-pointer JSON_POINTER] [--verbose]
|
|
2340
|
+
--json-pointer JSON_POINTER] [--verbose]
|
|
2341
|
+
[--keywords KEYWORDS] [--geo-id GEO_ID]
|
|
2342
|
+
[--industry-id INDUSTRY_ID]
|
|
2343
|
+
[--company-size COMPANY_SIZE]
|
|
2344
|
+
[--has-jobs]`
|
|
2343
2345
|
- Options:
|
|
2344
2346
|
- `--data-json` (kind=json; input=json): Explicit list-build payload JSON
|
|
2345
2347
|
- `--data-file` (kind=file; input=file): Path to list-build payload JSON file
|
|
2346
2348
|
- `--list-name` (kind=string): Optional display name
|
|
2347
|
-
- `--keywords` (kind=string): Search keywords
|
|
2348
|
-
- `--title` (kind=string): Lead title/persona query
|
|
2349
|
-
- `--geo-id` (kind=string; repeatable): Geography ID; repeat or comma-separate in JSON
|
|
2350
|
-
- `--industry-id` (kind=string; repeatable): Industry ID; repeat or comma-separate in JSON
|
|
2351
|
-
- `--company-size` (kind=string; repeatable): Company size bucket, e.g. 1-10 or 11-50
|
|
2352
|
-
- `--current-company-id` (kind=string; repeatable): Company ID for lead search
|
|
2353
|
-
- `--past-company-id` (kind=string; repeatable): Past company ID for lead search
|
|
2354
|
-
- `--school-id` (kind=string; repeatable): School ID for lead search
|
|
2355
|
-
- `--profile-language` (kind=string): Profile language code, e.g. en
|
|
2356
|
-
- `--has-jobs` (kind=boolean; when omitted=False; when present=True): Only include companies with active job listings
|
|
2357
2349
|
- `--num-results` (kind=integer; default=100): Target result count, 1-10000
|
|
2358
2350
|
- `--page-size` (kind=integer; default=25): Provider page size
|
|
2359
2351
|
- `--wait` (kind=boolean; when omitted=False; when present=True): Poll until terminal status
|
|
@@ -2368,6 +2360,11 @@ Build a company/account list
|
|
|
2368
2360
|
- `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
|
|
2369
2361
|
- `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
|
|
2370
2362
|
- `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
|
|
2363
|
+
- `--keywords` (kind=string): Optional company keyword anchor; structured filters can run without it
|
|
2364
|
+
- `--geo-id` (kind=string; repeatable): LinkedIn GeoURN ID; repeat or comma-separate in JSON
|
|
2365
|
+
- `--industry-id` (kind=string; repeatable): Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON
|
|
2366
|
+
- `--company-size` (kind=string; repeatable): Company size bucket, e.g. 1-10 or 11-50
|
|
2367
|
+
- `--has-jobs` (kind=boolean; when omitted=False; when present=True): Only include companies with active job listings
|
|
2371
2368
|
|
|
2372
2369
|
#### `autotouch list-build inputs`
|
|
2373
2370
|
|
|
@@ -2378,12 +2375,18 @@ Show valid list-build filter IDs and values
|
|
|
2378
2375
|
- Destructive: `no`
|
|
2379
2376
|
- Output modes: `json, ndjson, human`
|
|
2380
2377
|
- Example:
|
|
2381
|
-
- `autotouch list-build inputs [-h]
|
|
2378
|
+
- `autotouch list-build inputs [-h]
|
|
2379
|
+
[--type {geo,industry,service,title_skill,title-skills}]
|
|
2380
|
+
[--query QUERY] [--limit LIMIT]
|
|
2381
|
+
[--base-url BASE_URL] [--token TOKEN]
|
|
2382
2382
|
[--use-x-api-key] [--timeout TIMEOUT]
|
|
2383
2383
|
[--output {json,ndjson,human}] [--compact]
|
|
2384
2384
|
[--select SELECT |
|
|
2385
2385
|
--json-pointer JSON_POINTER] [--verbose]`
|
|
2386
2386
|
- Options:
|
|
2387
|
+
- `--type` (kind=string; choices=geo,industry,service,title_skill,title-skills): Search input type
|
|
2388
|
+
- `--query` (kind=string): Search text for input ID lookup
|
|
2389
|
+
- `--limit` (kind=integer; default=20): Max lookup results, 1-50
|
|
2387
2390
|
- `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
|
|
2388
2391
|
- `--token` (kind=string; sensitive): Developer API key / JWT token
|
|
2389
2392
|
- `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
|
|
@@ -2406,15 +2409,7 @@ Build a lead/contact list
|
|
|
2406
2409
|
- `autotouch list-build leads [-h] [--data-json DATA_JSON]
|
|
2407
2410
|
[--data-file DATA_FILE]
|
|
2408
2411
|
[--list-name LIST_NAME]
|
|
2409
|
-
[--
|
|
2410
|
-
[--geo-id GEO_ID]
|
|
2411
|
-
[--industry-id INDUSTRY_ID]
|
|
2412
|
-
[--company-size COMPANY_SIZE]
|
|
2413
|
-
[--current-company-id CURRENT_COMPANY_ID]
|
|
2414
|
-
[--past-company-id PAST_COMPANY_ID]
|
|
2415
|
-
[--school-id SCHOOL_ID]
|
|
2416
|
-
[--profile-language PROFILE_LANGUAGE]
|
|
2417
|
-
[--has-jobs] [--num-results NUM_RESULTS]
|
|
2412
|
+
[--num-results NUM_RESULTS]
|
|
2418
2413
|
[--page-size PAGE_SIZE] [--wait]
|
|
2419
2414
|
[--poll-interval POLL_INTERVAL]
|
|
2420
2415
|
[--wait-timeout WAIT_TIMEOUT]
|
|
@@ -2422,21 +2417,21 @@ Build a lead/contact list
|
|
|
2422
2417
|
[--use-x-api-key] [--timeout TIMEOUT]
|
|
2423
2418
|
[--output {json,ndjson,human}] [--compact]
|
|
2424
2419
|
[--select SELECT |
|
|
2425
|
-
--json-pointer JSON_POINTER] [--verbose]
|
|
2420
|
+
--json-pointer JSON_POINTER] [--verbose]
|
|
2421
|
+
[--keywords KEYWORDS] [--title TITLE]
|
|
2422
|
+
[--geo-id GEO_ID]
|
|
2423
|
+
[--industry-id INDUSTRY_ID]
|
|
2424
|
+
[--current-company-id CURRENT_COMPANY_ID]
|
|
2425
|
+
[--past-company-id PAST_COMPANY_ID]
|
|
2426
|
+
[--school-id SCHOOL_ID]
|
|
2427
|
+
[--profile-language PROFILE_LANGUAGE]
|
|
2428
|
+
[--service-category SERVICE_CATEGORY]
|
|
2429
|
+
[--first-name FIRST_NAME]
|
|
2430
|
+
[--last-name LAST_NAME]`
|
|
2426
2431
|
- Options:
|
|
2427
2432
|
- `--data-json` (kind=json; input=json): Explicit list-build payload JSON
|
|
2428
2433
|
- `--data-file` (kind=file; input=file): Path to list-build payload JSON file
|
|
2429
2434
|
- `--list-name` (kind=string): Optional display name
|
|
2430
|
-
- `--keywords` (kind=string): Search keywords
|
|
2431
|
-
- `--title` (kind=string): Lead title/persona query
|
|
2432
|
-
- `--geo-id` (kind=string; repeatable): Geography ID; repeat or comma-separate in JSON
|
|
2433
|
-
- `--industry-id` (kind=string; repeatable): Industry ID; repeat or comma-separate in JSON
|
|
2434
|
-
- `--company-size` (kind=string; repeatable): Company size bucket, e.g. 1-10 or 11-50
|
|
2435
|
-
- `--current-company-id` (kind=string; repeatable): Company ID for lead search
|
|
2436
|
-
- `--past-company-id` (kind=string; repeatable): Past company ID for lead search
|
|
2437
|
-
- `--school-id` (kind=string; repeatable): School ID for lead search
|
|
2438
|
-
- `--profile-language` (kind=string): Profile language code, e.g. en
|
|
2439
|
-
- `--has-jobs` (kind=boolean; when omitted=False; when present=True): Only include companies with active job listings
|
|
2440
2435
|
- `--num-results` (kind=integer; default=100): Target result count, 1-10000
|
|
2441
2436
|
- `--page-size` (kind=integer; default=25): Provider page size
|
|
2442
2437
|
- `--wait` (kind=boolean; when omitted=False; when present=True): Poll until terminal status
|
|
@@ -2451,6 +2446,17 @@ Build a lead/contact list
|
|
|
2451
2446
|
- `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
|
|
2452
2447
|
- `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
|
|
2453
2448
|
- `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
|
|
2449
|
+
- `--keywords` (kind=string): Optional free-text profile keyword
|
|
2450
|
+
- `--title` (kind=string): Lead title/persona query
|
|
2451
|
+
- `--geo-id` (kind=string; repeatable): LinkedIn GeoURN ID; repeat or comma-separate in JSON
|
|
2452
|
+
- `--industry-id` (kind=string; repeatable): Industry ID from `autotouch list-build inputs`; repeat or comma-separate in JSON
|
|
2453
|
+
- `--current-company-id` (kind=string; repeatable): Company ID returned by a company list build
|
|
2454
|
+
- `--past-company-id` (kind=string; repeatable): Past company ID for lead search
|
|
2455
|
+
- `--school-id` (kind=string; repeatable): School ID for lead search
|
|
2456
|
+
- `--profile-language` (kind=string): Profile language code, e.g. en
|
|
2457
|
+
- `--service-category` (kind=string): Service category string
|
|
2458
|
+
- `--first-name` (kind=string): First-name filter
|
|
2459
|
+
- `--last-name` (kind=string): Last-name filter
|
|
2454
2460
|
|
|
2455
2461
|
#### `autotouch list-build pricing`
|
|
2456
2462
|
|