guzli-cli 0.2.0__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.
- guzli_cli-0.2.0/CHANGELOG.md +16 -0
- guzli_cli-0.2.0/LICENSE +201 -0
- guzli_cli-0.2.0/PKG-INFO +341 -0
- guzli_cli-0.2.0/PROVENANCE.md +23 -0
- guzli_cli-0.2.0/README.md +307 -0
- guzli_cli-0.2.0/SECURITY.md +18 -0
- guzli_cli-0.2.0/SECURITY_AUDIT.md +47 -0
- guzli_cli-0.2.0/SKILL.md +101 -0
- guzli_cli-0.2.0/examples/compliance-advisory-us.json +15 -0
- guzli_cli-0.2.0/examples/pizza-order-extraction.json +65 -0
- guzli_cli-0.2.0/pyproject.toml +92 -0
- guzli_cli-0.2.0/references/api.md +245 -0
- guzli_cli-0.2.0/scripts/guzli/__init__.py +3 -0
- guzli_cli-0.2.0/scripts/guzli/__main__.py +4 -0
- guzli_cli-0.2.0/scripts/guzli/auth.py +182 -0
- guzli_cli-0.2.0/scripts/guzli/cli.py +84 -0
- guzli_cli-0.2.0/scripts/guzli/commands/__init__.py +1 -0
- guzli_cli-0.2.0/scripts/guzli/commands/admin.py +421 -0
- guzli_cli-0.2.0/scripts/guzli/commands/auth.py +502 -0
- guzli_cli-0.2.0/scripts/guzli/commands/campaign_launch.py +188 -0
- guzli_cli-0.2.0/scripts/guzli/commands/campaigns.py +571 -0
- guzli_cli-0.2.0/scripts/guzli/commands/common.py +42 -0
- guzli_cli-0.2.0/scripts/guzli/commands/conversations.py +404 -0
- guzli_cli-0.2.0/scripts/guzli/commands/integrations.py +48 -0
- guzli_cli-0.2.0/scripts/guzli/commands/telephony.py +274 -0
- guzli_cli-0.2.0/scripts/guzli/commands/voice_calls.py +270 -0
- guzli_cli-0.2.0/scripts/guzli/config.py +137 -0
- guzli_cli-0.2.0/scripts/guzli/config_store.py +218 -0
- guzli_cli-0.2.0/scripts/guzli/errors.py +47 -0
- guzli_cli-0.2.0/scripts/guzli/http_client.py +213 -0
- guzli_cli-0.2.0/scripts/guzli/mcp/__init__.py +1 -0
- guzli_cli-0.2.0/scripts/guzli/mcp/server.py +320 -0
- guzli_cli-0.2.0/scripts/guzli/models.py +173 -0
- guzli_cli-0.2.0/scripts/guzli/oauth_callback.py +126 -0
- guzli_cli-0.2.0/scripts/guzli/output.py +79 -0
- guzli_cli-0.2.0/scripts/guzli/runtime.py +159 -0
- guzli_cli-0.2.0/scripts/guzli/services/__init__.py +29 -0
- guzli_cli-0.2.0/scripts/guzli/services/api_keys.py +105 -0
- guzli_cli-0.2.0/scripts/guzli/services/calls.py +48 -0
- guzli_cli-0.2.0/scripts/guzli/services/campaigns.py +193 -0
- guzli_cli-0.2.0/scripts/guzli/services/cli_auth.py +103 -0
- guzli_cli-0.2.0/scripts/guzli/services/conversations.py +112 -0
- guzli_cli-0.2.0/scripts/guzli/services/integrations.py +18 -0
- guzli_cli-0.2.0/scripts/guzli/services/replies.py +21 -0
- guzli_cli-0.2.0/scripts/guzli/services/telephony.py +80 -0
- guzli_cli-0.2.0/scripts/guzli/services/voice_profiles.py +56 -0
- guzli_cli-0.2.0/scripts/guzli/services/webhooks.py +169 -0
- guzli_cli-0.2.0/scripts/guzli/types.py +15 -0
- guzli_cli-0.2.0/scripts/guzli/validators.py +83 -0
- guzli_cli-0.2.0/scripts/guzli/workflows/__init__.py +13 -0
- guzli_cli-0.2.0/scripts/guzli/workflows/campaign_launch.py +501 -0
- guzli_cli-0.2.0/scripts/guzli_cli.egg-info/PKG-INFO +341 -0
- guzli_cli-0.2.0/scripts/guzli_cli.egg-info/SOURCES.txt +56 -0
- guzli_cli-0.2.0/scripts/guzli_cli.egg-info/dependency_links.txt +1 -0
- guzli_cli-0.2.0/scripts/guzli_cli.egg-info/entry_points.txt +3 -0
- guzli_cli-0.2.0/scripts/guzli_cli.egg-info/requires.txt +13 -0
- guzli_cli-0.2.0/scripts/guzli_cli.egg-info/top_level.txt +1 -0
- guzli_cli-0.2.0/setup.cfg +4 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
This project follows semantic versioning after its first public release.
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
## 0.2.0 - 2026-07-15
|
|
8
|
+
|
|
9
|
+
- Added Campaign Launch as `guzli campaigns launch` with `guzli call` shortcut.
|
|
10
|
+
- Removed the deprecated `guzli campaigns wizard` alias.
|
|
11
|
+
- Added deterministic existing-number-pool resolution and per-profile defaults.
|
|
12
|
+
- Added shared runtime and launch workflow layers.
|
|
13
|
+
- Added a typed stdio MCP server with 13 curated tools.
|
|
14
|
+
- Added structured API errors, request IDs, safe read retries, and JSON output.
|
|
15
|
+
- Added campaign run/result/compliance, pool, and voice-profile operations.
|
|
16
|
+
- Rewrote agent skill and user documentation.
|
guzli_cli-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright [yyyy] [name of copyright owner]
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
guzli_cli-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: guzli-cli
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: AI voice calling CLI and MCP server for agents using Guzli.
|
|
5
|
+
Author: Guzli
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/kodeine/guzli-cli
|
|
8
|
+
Project-URL: Documentation, https://github.com/kodeine/guzli-cli#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/kodeine/guzli-cli
|
|
10
|
+
Project-URL: Issues, https://github.com/kodeine/guzli-cli/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/kodeine/guzli-cli/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: ai-agents,ai-voice,cli,mcp,model-context-protocol,outbound-calling,telephony
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Topic :: Communications :: Telephony
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: requests>=2.31
|
|
23
|
+
Provides-Extra: mcp
|
|
24
|
+
Requires-Dist: mcp<2,>=1.28; extra == "mcp"
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
27
|
+
Requires-Dist: mypy>=1.15; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest>=8.3; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=6; extra == "dev"
|
|
30
|
+
Requires-Dist: requests-mock>=1.12; extra == "dev"
|
|
31
|
+
Requires-Dist: ruff>=0.11; extra == "dev"
|
|
32
|
+
Requires-Dist: twine>=5.1; extra == "dev"
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# Guzli CLI — AI voice calling and MCP server for agents
|
|
36
|
+
|
|
37
|
+
Guzli CLI is an open-source Python command-line interface and local Model
|
|
38
|
+
Context Protocol (MCP) server for AI voice calling. It connects AI agents to
|
|
39
|
+
Guzli so they can place one-off phone calls, launch outbound calling campaigns,
|
|
40
|
+
manage phone-number pools and voices, inspect call results, and work with inbox
|
|
41
|
+
conversations through structured CLI commands or MCP tools.
|
|
42
|
+
|
|
43
|
+
Use `guzli call` to call one person or as many as 1,000 recipients. Quick tasks
|
|
44
|
+
and larger voice campaigns use the same tested workflow, so an agent can order
|
|
45
|
+
food, reroute a delivery, confirm appointments, or contact a list of customers
|
|
46
|
+
without learning separate calling APIs.
|
|
47
|
+
|
|
48
|
+
> Calls are real and may be billable. Use `--dry-run` or MCP `dry_run=true` to
|
|
49
|
+
> validate recipients, number-pool selection, and voice configuration before
|
|
50
|
+
> dialing.
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
- **AI phone calls from the command line:** place a one-off outbound call with
|
|
55
|
+
one `guzli call` command.
|
|
56
|
+
- **MCP server for AI agents:** expose typed calling, campaign, result, number,
|
|
57
|
+
voice, and conversation tools to any MCP-compatible agent host.
|
|
58
|
+
- **One recipient or 1,000:** use repeatable `--to` arguments or a recipients
|
|
59
|
+
file without switching workflows.
|
|
60
|
+
- **Structured automation:** return machine-readable JSON, stable identifiers,
|
|
61
|
+
request metadata, and typed errors for reliable agent workflows.
|
|
62
|
+
- **Existing number-pool selection:** list, inspect, select, and save a default
|
|
63
|
+
pool without creating new telephony resources implicitly.
|
|
64
|
+
- **Campaign and call-result inspection:** inspect runs, attempts, recordings,
|
|
65
|
+
performance, and structured post-call extraction results.
|
|
66
|
+
- **Shared CLI and MCP implementation:** both interfaces call the same Python
|
|
67
|
+
services and Guzli public API instead of duplicating orchestration logic.
|
|
68
|
+
- **No added CLI telemetry:** commands, prompts, phone numbers, transcripts,
|
|
69
|
+
tokens, and profiles are not collected by the CLI itself.
|
|
70
|
+
|
|
71
|
+
## Common AI calling use cases
|
|
72
|
+
|
|
73
|
+
- Make a one-off operational call, such as ordering food or rerouting a package.
|
|
74
|
+
- Confirm appointments, reservations, deliveries, or service windows.
|
|
75
|
+
- Launch an outbound voice campaign for dozens or hundreds of recipients.
|
|
76
|
+
- Give each call instructions, an opening message, an objective, and structured
|
|
77
|
+
post-call fields to extract.
|
|
78
|
+
- Let an AI agent discover number pools and voice profiles before placing calls.
|
|
79
|
+
- Inspect campaign runs and call outcomes before retrying interrupted work.
|
|
80
|
+
- Read Guzli inbox conversations and send agent replies.
|
|
81
|
+
|
|
82
|
+
## Installation
|
|
83
|
+
|
|
84
|
+
Python 3.10 or newer is required.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# CLI only
|
|
88
|
+
pipx install guzli-cli
|
|
89
|
+
|
|
90
|
+
# CLI plus MCP server
|
|
91
|
+
pipx install 'guzli-cli[mcp]'
|
|
92
|
+
|
|
93
|
+
# Alternative: install with uv
|
|
94
|
+
uv tool install 'guzli-cli[mcp]'
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
For development from a source checkout:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
python -m venv .venv
|
|
101
|
+
.venv/bin/pip install -e '.[dev,mcp]'
|
|
102
|
+
.venv/bin/pytest
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
This repository is licensed under Apache-2.0. Release artifacts are published
|
|
106
|
+
to PyPI from GitHub Actions using short-lived trusted-publishing credentials.
|
|
107
|
+
|
|
108
|
+
## Authentication and configuration
|
|
109
|
+
|
|
110
|
+
The recommended setup is a persistent named profile:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
guzli auth login
|
|
114
|
+
guzli auth status
|
|
115
|
+
guzli auth list
|
|
116
|
+
guzli auth use staging
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Profiles live at `~/.guzli/config.json` with restricted permissions. You can
|
|
120
|
+
also configure:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
export GUZLI_API_BASE_URL='https://gateway.guzli.com'
|
|
124
|
+
export GUZLI_API_KEY='your_workspace_api_key'
|
|
125
|
+
export GUZLI_AGENT_ID='your_agent_id'
|
|
126
|
+
export GUZLI_ORGANIZATION_ID='your_organization_id'
|
|
127
|
+
export GUZLI_NUMBER_POOL_ID='your_default_pool_id' # optional
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Resolution order is command-line flag, environment variable, stored profile,
|
|
131
|
+
then built-in default. OAuth bearer sessions are supported for user-only admin
|
|
132
|
+
routes. Ordinary routes accept either API-key or bearer auth, and agent replies
|
|
133
|
+
support identity-signing API keys.
|
|
134
|
+
|
|
135
|
+
The CLI adds no telemetry of its own. It does not send command text, prompts,
|
|
136
|
+
phone numbers, transcripts, tokens, or profile contents anywhere except as
|
|
137
|
+
required by the Guzli API operation the user invokes.
|
|
138
|
+
|
|
139
|
+
## Make an AI phone call from the CLI
|
|
140
|
+
|
|
141
|
+
`call` is the short, canonical entry point for quick work:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
guzli call \
|
|
145
|
+
--to +12025550123 \
|
|
146
|
+
--message 'Hi, I am calling about a delivery.' \
|
|
147
|
+
--instructions 'Ask FedEx to reroute package 123 to the saved alternate address.'
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The descriptive long form is identical:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
guzli campaigns launch \
|
|
154
|
+
--to +12025550126 \
|
|
155
|
+
--to +12025550127 \
|
|
156
|
+
--instructions 'Confirm each appointment for Thursday.'
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Use `--recipients-file recipients.txt` for larger batches. Recipients are
|
|
160
|
+
validated as E.164, deduplicated, and limited to 1,000. `--name` is optional.
|
|
161
|
+
|
|
162
|
+
These commands create real, potentially billable external calls by default.
|
|
163
|
+
Resolve and validate without mutations first when appropriate:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
guzli call --to +12025550126 --instructions 'Order one large cheese pizza.' --dry-run
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Useful options include `--message`, `--instructions`, `--objective`,
|
|
170
|
+
`--voice-profile-id`, `--voice-id`, `--number-pool-id`, `--from`,
|
|
171
|
+
`--extraction-file`, `--no-run`, and `--no-activate`. Run `guzli call --help`
|
|
172
|
+
for the complete surface.
|
|
173
|
+
|
|
174
|
+
### Number-pool selection
|
|
175
|
+
|
|
176
|
+
Campaign Launch only uses existing number pools; it never creates one
|
|
177
|
+
implicitly. Resolution is:
|
|
178
|
+
|
|
179
|
+
1. `--number-pool-id`
|
|
180
|
+
2. `GUZLI_NUMBER_POOL_ID`
|
|
181
|
+
3. saved default on the selected CLI profile
|
|
182
|
+
4. the existing pool containing `--from <E.164>`
|
|
183
|
+
5. the only eligible active pool
|
|
184
|
+
|
|
185
|
+
If more than one pool is eligible, the command stops and shows the choices.
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
guzli numbers pool list --is-active on
|
|
189
|
+
guzli numbers pool get <pool_id>
|
|
190
|
+
guzli numbers pool use <pool_id> # save on the active profile
|
|
191
|
+
guzli auth status # displays the saved pool
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Intentional fast-launch compliance
|
|
195
|
+
|
|
196
|
+
Campaign Launch intentionally configures and approves a streamlined US
|
|
197
|
+
support-call profile so agents can make quick operational calls. Defaults are
|
|
198
|
+
advisory mode, automated-voice and recording disclosures off, spoken opt-out
|
|
199
|
+
on, quiet-hours enforcement off, and consent not required. Use the standalone
|
|
200
|
+
compliance commands for campaigns that need a different posture.
|
|
201
|
+
|
|
202
|
+
### Inspect the outcome
|
|
203
|
+
|
|
204
|
+
Every launch returns structured JSON including `launch_id`, state, recipient
|
|
205
|
+
count, campaign ID, pool ID and selection source, voice-profile ID, readiness,
|
|
206
|
+
and run response.
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
guzli campaigns runs <campaign_id>
|
|
210
|
+
guzli campaigns run-get <campaign_id> <run_id>
|
|
211
|
+
guzli campaigns run-cancel <campaign_id> <run_id>
|
|
212
|
+
guzli calls list <campaign_id> --campaign-run-id <run_id>
|
|
213
|
+
guzli calls get <campaign_id> <attempt_id>
|
|
214
|
+
guzli campaigns results list <campaign_id>
|
|
215
|
+
guzli campaigns results get <campaign_id> <result_id>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Launch is not atomically idempotent. If a request is interrupted, inspect its
|
|
219
|
+
campaign and run before retrying.
|
|
220
|
+
|
|
221
|
+
## Connect AI agents with the Guzli MCP server
|
|
222
|
+
|
|
223
|
+
Install the `mcp` extra, authenticate once, and configure the stdio server in
|
|
224
|
+
your agent host:
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"mcpServers": {
|
|
229
|
+
"guzli": {
|
|
230
|
+
"command": "guzli-mcp",
|
|
231
|
+
"env": {
|
|
232
|
+
"GUZLI_PROFILE": "default"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
The server exposes typed, structured tools:
|
|
240
|
+
|
|
241
|
+
- `launch_calls`
|
|
242
|
+
- `list_number_pools`, `get_number_pool`, `list_phone_numbers`
|
|
243
|
+
- `list_voice_profiles`
|
|
244
|
+
- `get_campaign`, `list_campaign_runs`
|
|
245
|
+
- `list_calls`, `get_call`, `get_call_result`
|
|
246
|
+
- `list_conversations`, `get_conversation`, `send_agent_reply`
|
|
247
|
+
|
|
248
|
+
Tool annotations identify reads and side effects. `launch_calls` is marked
|
|
249
|
+
destructive and non-idempotent because it may place real, billable calls. The
|
|
250
|
+
server calls shared Python workflows directly; it does not shell out to the
|
|
251
|
+
CLI. `guzli://capabilities` reports non-secret local configuration readiness.
|
|
252
|
+
|
|
253
|
+
## Campaign, inbox, and telephony commands
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# Inbox
|
|
257
|
+
guzli conversations list --status active --limit 20
|
|
258
|
+
guzli conversations get <conversation_id>
|
|
259
|
+
guzli agent-replies send <conversation_id> 'Thanks—I can help with that.'
|
|
260
|
+
|
|
261
|
+
# Campaign management
|
|
262
|
+
guzli campaigns list
|
|
263
|
+
guzli campaigns preview --config-file campaign.json
|
|
264
|
+
guzli campaigns create --config-file campaign.json
|
|
265
|
+
guzli campaigns readiness <campaign_id>
|
|
266
|
+
guzli campaigns archive <campaign_id>
|
|
267
|
+
|
|
268
|
+
# Compliance diagnostics
|
|
269
|
+
guzli campaigns compliance preview <campaign_id> --config-file audience.json
|
|
270
|
+
guzli campaigns compliance preflight <campaign_id>
|
|
271
|
+
|
|
272
|
+
# Voice profiles and pools
|
|
273
|
+
guzli voice-profiles get <profile_id>
|
|
274
|
+
guzli voice-profiles update <profile_id> --config-json '{"name":"Support"}'
|
|
275
|
+
guzli voice-profiles set-default <profile_id>
|
|
276
|
+
guzli voice-profiles usage --window-days 30
|
|
277
|
+
guzli numbers pool update <pool_id> --config-json '{"strategy":"sticky"}'
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Place global options before the command. For stable automation output and
|
|
281
|
+
structured errors, use:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
guzli --output json campaigns list
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Development and release boundaries
|
|
288
|
+
|
|
289
|
+
- The CLI is intentionally a client of existing public engine APIs. No engine
|
|
290
|
+
changes are required for Campaign Launch or MCP.
|
|
291
|
+
- Live-call tests are excluded from the default suite.
|
|
292
|
+
- PyPI releases are built from GitHub releases by the trusted-publishing
|
|
293
|
+
workflow; maintainers should follow [RELEASING.md](RELEASING.md).
|
|
294
|
+
- See [CONTRIBUTING.md](CONTRIBUTING.md) and
|
|
295
|
+
[SECURITY.md](SECURITY.md) before contributing or reporting a vulnerability.
|
|
296
|
+
|
|
297
|
+
Detailed endpoint and payload notes live in [references/api.md](references/api.md).
|
|
298
|
+
|
|
299
|
+
## Frequently asked questions
|
|
300
|
+
|
|
301
|
+
### Can an AI agent make a one-off phone call with Guzli CLI?
|
|
302
|
+
|
|
303
|
+
Yes. `guzli call` is designed for quick operational calls such as confirming an
|
|
304
|
+
appointment, ordering food, or contacting a delivery provider. The agent passes
|
|
305
|
+
the recipient and instructions, while Guzli handles the voice campaign workflow.
|
|
306
|
+
|
|
307
|
+
### Does Guzli CLI support bulk outbound calling?
|
|
308
|
+
|
|
309
|
+
Yes. The same command supports one to 1,000 recipients through repeated `--to`
|
|
310
|
+
arguments, comma-separated numbers, or `--recipients-file`. Recipients are
|
|
311
|
+
validated and deduplicated before launch.
|
|
312
|
+
|
|
313
|
+
### What is the Guzli MCP server?
|
|
314
|
+
|
|
315
|
+
`guzli-mcp` is a local stdio Model Context Protocol server that exposes Guzli
|
|
316
|
+
operations as typed tools. MCP-compatible AI agents can launch calls, discover
|
|
317
|
+
number pools and voices, inspect campaign results, and handle conversations
|
|
318
|
+
without parsing terminal output.
|
|
319
|
+
|
|
320
|
+
### Do the CLI and MCP server require changes to the Guzli engine?
|
|
321
|
+
|
|
322
|
+
No. Both clients use the existing public Guzli API. The hosted engine remains
|
|
323
|
+
responsible for authorization, readiness, compliance enforcement, provider
|
|
324
|
+
capabilities, and call execution.
|
|
325
|
+
|
|
326
|
+
### Can I preview configuration without placing a call?
|
|
327
|
+
|
|
328
|
+
Yes. Pass `--dry-run` to `guzli call` or set `dry_run=true` when using the MCP
|
|
329
|
+
`launch_calls` tool. Dry runs resolve and validate configuration without
|
|
330
|
+
creating a campaign or dialing recipients.
|
|
331
|
+
|
|
332
|
+
### Is Guzli CLI open source?
|
|
333
|
+
|
|
334
|
+
Yes. The CLI, MCP server, agent skill, and documentation are licensed under
|
|
335
|
+
Apache-2.0. The separately hosted Guzli engine and service are not included in
|
|
336
|
+
this repository.
|
|
337
|
+
|
|
338
|
+
## License
|
|
339
|
+
|
|
340
|
+
Licensed under the [Apache License 2.0](LICENSE). The Guzli name and hosted
|
|
341
|
+
service are not granted under the code license beyond customary descriptive use.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Code provenance
|
|
2
|
+
|
|
3
|
+
## Owner attestation
|
|
4
|
+
|
|
5
|
+
On 2026-07-15, the repository owner approved Apache-2.0 licensing for this
|
|
6
|
+
project and attested that the repository's code and documentation have
|
|
7
|
+
acceptable provenance for release under that license.
|
|
8
|
+
|
|
9
|
+
This record captures the owner's approval; it is not an independent legal
|
|
10
|
+
opinion. New contributions remain subject to the contribution terms in
|
|
11
|
+
`CONTRIBUTING.md` and must not introduce code, media, data, or documentation
|
|
12
|
+
whose license is incompatible with Apache-2.0.
|
|
13
|
+
|
|
14
|
+
## Repository boundary
|
|
15
|
+
|
|
16
|
+
This repository contains the Guzli CLI, MCP server, agent skill, examples, and
|
|
17
|
+
public-facing documentation. It does not license or distribute the separately
|
|
18
|
+
hosted Guzli engine, infrastructure, customer data, credentials, provider
|
|
19
|
+
configuration, or private operational material.
|
|
20
|
+
|
|
21
|
+
Runtime Python dependencies are referenced through package metadata and are
|
|
22
|
+
not copied into this source tree. Generated build metadata and local
|
|
23
|
+
development artifacts are not source contributions and must remain untracked.
|