retell-cli 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/index.js +205 -93
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,25 @@ All notable changes to the Retell AI CLI will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.7.0] - 2026-04-30
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `calls stop <call_id>` — stop an ongoing call via `client.call.stop`.
|
|
13
|
+
- `exports list` — list export requests with `--limit`, `--pagination-key`, `--sort-order`, and `--fields`.
|
|
14
|
+
- `playground complete <agent_id>` — run stateless playground completions with JSON or `@path` messages, optional dynamic variables, tool mocks, state/node/component context, agent version, and field filtering.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Bumped the minimum Node.js engine from `>=18.0.0` to `>=18.10.0` to match the current Retell SDK requirement.
|
|
19
|
+
- Bumped `retell-sdk` from `^5.12.0` to `^5.18.0`.
|
|
20
|
+
- Migrated test API helpers from direct `fetch` calls to SDK-backed `client.tests.*` wrappers while preserving existing command output shapes.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- `exports list --limit` now rejects non-positive and fractional values before calling the SDK.
|
|
25
|
+
- `playground complete --fields` now ignores empty field tokens and returns the full response when no valid field paths remain.
|
|
26
|
+
|
|
8
27
|
## [1.6.0] - 2026-04-16
|
|
9
28
|
|
|
10
29
|
Bulk addition of CLI surface for Retell SDK resources that were previously unwrapped or partially wrapped. Bumped `retell-sdk` dependency to `^5.12.0`.
|
package/dist/index.js
CHANGED
|
@@ -49,6 +49,7 @@ var ConfigError = class extends Error {
|
|
|
49
49
|
this.code = code;
|
|
50
50
|
this.name = "ConfigError";
|
|
51
51
|
}
|
|
52
|
+
code;
|
|
52
53
|
};
|
|
53
54
|
function getConfigPath() {
|
|
54
55
|
return (0, import_path.join)(process.cwd(), CONFIG_FILE_NAME);
|
|
@@ -2915,105 +2916,62 @@ async function importToolsCommand(agentId, options) {
|
|
|
2915
2916
|
}
|
|
2916
2917
|
|
|
2917
2918
|
// src/services/test-api.ts
|
|
2918
|
-
var BASE_URL = "https://api.retellai.com";
|
|
2919
|
-
async function apiRequest(method, path, body) {
|
|
2920
|
-
const config = getConfig();
|
|
2921
|
-
const response = await fetch(`${BASE_URL}${path}`, {
|
|
2922
|
-
method,
|
|
2923
|
-
headers: {
|
|
2924
|
-
Authorization: `Bearer ${config.apiKey}`,
|
|
2925
|
-
"Content-Type": "application/json"
|
|
2926
|
-
},
|
|
2927
|
-
body: body ? JSON.stringify(body) : void 0
|
|
2928
|
-
});
|
|
2929
|
-
if (!response.ok) {
|
|
2930
|
-
const errorBody = await response.text();
|
|
2931
|
-
let errorMessage = `API error: ${response.status} ${response.statusText}`;
|
|
2932
|
-
try {
|
|
2933
|
-
const errorJson = JSON.parse(errorBody);
|
|
2934
|
-
if (errorJson.message) {
|
|
2935
|
-
errorMessage = errorJson.message;
|
|
2936
|
-
} else if (errorJson.error) {
|
|
2937
|
-
errorMessage = errorJson.error;
|
|
2938
|
-
}
|
|
2939
|
-
} catch {
|
|
2940
|
-
if (errorBody) {
|
|
2941
|
-
errorMessage = errorBody;
|
|
2942
|
-
}
|
|
2943
|
-
}
|
|
2944
|
-
throw new Error(errorMessage);
|
|
2945
|
-
}
|
|
2946
|
-
const text = await response.text();
|
|
2947
|
-
if (!text) {
|
|
2948
|
-
return {};
|
|
2949
|
-
}
|
|
2950
|
-
return JSON.parse(text);
|
|
2951
|
-
}
|
|
2952
2919
|
async function listTestCaseDefinitions(responseEngine) {
|
|
2953
|
-
const
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
params.set("llm_id", responseEngine.llm_id);
|
|
2957
|
-
} else {
|
|
2958
|
-
params.set("type", "conversation-flow");
|
|
2959
|
-
params.set("conversation_flow_id", responseEngine.conversation_flow_id);
|
|
2960
|
-
}
|
|
2961
|
-
return apiRequest(
|
|
2962
|
-
"GET",
|
|
2963
|
-
`/list-test-case-definitions?${params.toString()}`
|
|
2920
|
+
const client = getRetellClient();
|
|
2921
|
+
return await client.tests.listTestCaseDefinitions(
|
|
2922
|
+
responseEngine
|
|
2964
2923
|
);
|
|
2965
2924
|
}
|
|
2966
2925
|
async function getTestCaseDefinition(testCaseDefinitionId) {
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2926
|
+
const client = getRetellClient();
|
|
2927
|
+
return await client.tests.getTestCaseDefinition(
|
|
2928
|
+
testCaseDefinitionId
|
|
2970
2929
|
);
|
|
2971
2930
|
}
|
|
2972
2931
|
async function createTestCaseDefinition(params) {
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
"/create-test-case-definition",
|
|
2932
|
+
const client = getRetellClient();
|
|
2933
|
+
return await client.tests.createTestCaseDefinition(
|
|
2976
2934
|
params
|
|
2977
2935
|
);
|
|
2978
2936
|
}
|
|
2979
2937
|
async function updateTestCaseDefinition(testCaseDefinitionId, params) {
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2938
|
+
const client = getRetellClient();
|
|
2939
|
+
return await client.tests.updateTestCaseDefinition(
|
|
2940
|
+
testCaseDefinitionId,
|
|
2983
2941
|
params
|
|
2984
2942
|
);
|
|
2985
2943
|
}
|
|
2986
2944
|
async function deleteTestCaseDefinition(testCaseDefinitionId) {
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
`/delete-test-case-definition/${testCaseDefinitionId}`
|
|
2990
|
-
);
|
|
2945
|
+
const client = getRetellClient();
|
|
2946
|
+
await client.tests.deleteTestCaseDefinition(testCaseDefinitionId);
|
|
2991
2947
|
}
|
|
2992
2948
|
async function listBatchTests(responseEngine) {
|
|
2993
|
-
const
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
params.set("llm_id", responseEngine.llm_id);
|
|
2997
|
-
} else {
|
|
2998
|
-
params.set("type", "conversation-flow");
|
|
2999
|
-
params.set("conversation_flow_id", responseEngine.conversation_flow_id);
|
|
3000
|
-
}
|
|
3001
|
-
return apiRequest(
|
|
3002
|
-
"GET",
|
|
3003
|
-
`/list-batch-tests?${params.toString()}`
|
|
2949
|
+
const client = getRetellClient();
|
|
2950
|
+
return await client.tests.listBatchTests(
|
|
2951
|
+
responseEngine
|
|
3004
2952
|
);
|
|
3005
2953
|
}
|
|
3006
2954
|
async function getBatchTest(batchJobId) {
|
|
3007
|
-
|
|
2955
|
+
const client = getRetellClient();
|
|
2956
|
+
return await client.tests.getBatchTest(
|
|
2957
|
+
batchJobId
|
|
2958
|
+
);
|
|
3008
2959
|
}
|
|
3009
2960
|
async function createBatchTest(params) {
|
|
3010
|
-
|
|
2961
|
+
const client = getRetellClient();
|
|
2962
|
+
return await client.tests.createBatchTest(
|
|
2963
|
+
params
|
|
2964
|
+
);
|
|
3011
2965
|
}
|
|
3012
2966
|
async function listTestRuns(batchJobId) {
|
|
3013
|
-
|
|
2967
|
+
const client = getRetellClient();
|
|
2968
|
+
return await client.tests.listTestRuns(
|
|
2969
|
+
batchJobId
|
|
2970
|
+
);
|
|
3014
2971
|
}
|
|
3015
2972
|
async function getTestRun(testRunId) {
|
|
3016
|
-
|
|
2973
|
+
const client = getRetellClient();
|
|
2974
|
+
return await client.tests.getTestRun(testRunId);
|
|
3017
2975
|
}
|
|
3018
2976
|
|
|
3019
2977
|
// src/commands/tests/cases/list.ts
|
|
@@ -4439,6 +4397,21 @@ async function deleteCallCommand(callId) {
|
|
|
4439
4397
|
}
|
|
4440
4398
|
}
|
|
4441
4399
|
|
|
4400
|
+
// src/commands/calls/stop.ts
|
|
4401
|
+
async function stopCallCommand(callId) {
|
|
4402
|
+
try {
|
|
4403
|
+
const client = getRetellClient();
|
|
4404
|
+
await client.call.stop(callId);
|
|
4405
|
+
outputJson({
|
|
4406
|
+
message: "Call stopped successfully",
|
|
4407
|
+
call_id: callId,
|
|
4408
|
+
operation: "stop"
|
|
4409
|
+
});
|
|
4410
|
+
} catch (error) {
|
|
4411
|
+
handleSdkError(error);
|
|
4412
|
+
}
|
|
4413
|
+
}
|
|
4414
|
+
|
|
4442
4415
|
// src/commands/batch-calls/create.ts
|
|
4443
4416
|
async function createBatchCallCommand(options) {
|
|
4444
4417
|
try {
|
|
@@ -4487,6 +4460,44 @@ function throwValidation9(message) {
|
|
|
4487
4460
|
throw err;
|
|
4488
4461
|
}
|
|
4489
4462
|
|
|
4463
|
+
// src/commands/export-requests/list.ts
|
|
4464
|
+
var SORT_ORDERS = ["ascending", "descending"];
|
|
4465
|
+
async function listExportRequestsCommand(options = {}) {
|
|
4466
|
+
try {
|
|
4467
|
+
const query = {};
|
|
4468
|
+
if (options.limit !== void 0) {
|
|
4469
|
+
const limit = parseNumericFlag(options.limit, "--limit");
|
|
4470
|
+
if (!Number.isInteger(limit) || limit < 1) {
|
|
4471
|
+
throwValidation10("--limit must be a positive integer");
|
|
4472
|
+
}
|
|
4473
|
+
query.limit = limit;
|
|
4474
|
+
}
|
|
4475
|
+
if (options.paginationKey) query.pagination_key = options.paginationKey;
|
|
4476
|
+
if (options.sortOrder !== void 0) {
|
|
4477
|
+
if (!SORT_ORDERS.includes(options.sortOrder)) {
|
|
4478
|
+
throwValidation10(
|
|
4479
|
+
`--sort-order must be one of: ${SORT_ORDERS.join(", ")}`
|
|
4480
|
+
);
|
|
4481
|
+
}
|
|
4482
|
+
query.sort_order = options.sortOrder;
|
|
4483
|
+
}
|
|
4484
|
+
const client = getRetellClient();
|
|
4485
|
+
const exportRequests = await client.exportRequest.list(query);
|
|
4486
|
+
const output = options.fields ? filterFields(
|
|
4487
|
+
exportRequests,
|
|
4488
|
+
options.fields.split(",").map((f) => f.trim())
|
|
4489
|
+
) : exportRequests;
|
|
4490
|
+
outputJson(output);
|
|
4491
|
+
} catch (error) {
|
|
4492
|
+
handleSdkError(error);
|
|
4493
|
+
}
|
|
4494
|
+
}
|
|
4495
|
+
function throwValidation10(message) {
|
|
4496
|
+
const err = new Error(message);
|
|
4497
|
+
err.name = "ValidationError";
|
|
4498
|
+
throw err;
|
|
4499
|
+
}
|
|
4500
|
+
|
|
4490
4501
|
// src/commands/llms/list.ts
|
|
4491
4502
|
async function listLlmsCommand(options = {}) {
|
|
4492
4503
|
try {
|
|
@@ -4545,7 +4556,7 @@ async function createLlmCommand(options = {}) {
|
|
|
4545
4556
|
options.beginMessage !== void 0 && "--begin-message"
|
|
4546
4557
|
].filter(Boolean);
|
|
4547
4558
|
if (simpleFlags.length > 0) {
|
|
4548
|
-
|
|
4559
|
+
throwValidation11(
|
|
4549
4560
|
`--file is mutually exclusive with ${simpleFlags.join(", ")}. Put all fields in the JSON body.`
|
|
4550
4561
|
);
|
|
4551
4562
|
}
|
|
@@ -4563,7 +4574,7 @@ async function createLlmCommand(options = {}) {
|
|
|
4563
4574
|
params.s2s_model = options.s2sModel;
|
|
4564
4575
|
if (options.startSpeaker) {
|
|
4565
4576
|
if (!["user", "agent"].includes(options.startSpeaker))
|
|
4566
|
-
|
|
4577
|
+
throwValidation11("--start-speaker must be 'user' or 'agent'");
|
|
4567
4578
|
params.start_speaker = options.startSpeaker;
|
|
4568
4579
|
}
|
|
4569
4580
|
if (options.beginMessage !== void 0)
|
|
@@ -4580,7 +4591,7 @@ async function createLlmCommand(options = {}) {
|
|
|
4580
4591
|
handleSdkError(error);
|
|
4581
4592
|
}
|
|
4582
4593
|
}
|
|
4583
|
-
function
|
|
4594
|
+
function throwValidation11(message) {
|
|
4584
4595
|
const err = new Error(message);
|
|
4585
4596
|
err.name = "ValidationError";
|
|
4586
4597
|
throw err;
|
|
@@ -4668,7 +4679,7 @@ var VALID_PROVIDERS2 = [
|
|
|
4668
4679
|
async function addVoiceResourceCommand(options) {
|
|
4669
4680
|
try {
|
|
4670
4681
|
if (options.voiceProvider && !VALID_PROVIDERS2.includes(options.voiceProvider)) {
|
|
4671
|
-
|
|
4682
|
+
throwValidation12(
|
|
4672
4683
|
`--voice-provider must be one of: ${VALID_PROVIDERS2.join(", ")}`
|
|
4673
4684
|
);
|
|
4674
4685
|
}
|
|
@@ -4693,7 +4704,7 @@ async function addVoiceResourceCommand(options) {
|
|
|
4693
4704
|
handleSdkError(error);
|
|
4694
4705
|
}
|
|
4695
4706
|
}
|
|
4696
|
-
function
|
|
4707
|
+
function throwValidation12(message) {
|
|
4697
4708
|
const err = new Error(message);
|
|
4698
4709
|
err.name = "ValidationError";
|
|
4699
4710
|
throw err;
|
|
@@ -4711,17 +4722,17 @@ var VALID_PROVIDERS3 = [
|
|
|
4711
4722
|
async function cloneVoiceCommand(options) {
|
|
4712
4723
|
try {
|
|
4713
4724
|
if (!VALID_PROVIDERS3.includes(options.voiceProvider)) {
|
|
4714
|
-
|
|
4725
|
+
throwValidation13(
|
|
4715
4726
|
`--voice-provider must be one of: ${VALID_PROVIDERS3.join(", ")}`
|
|
4716
4727
|
);
|
|
4717
4728
|
}
|
|
4718
4729
|
const files = options.file ?? [];
|
|
4719
4730
|
if (files.length === 0) {
|
|
4720
|
-
|
|
4731
|
+
throwValidation13("at least one --file is required");
|
|
4721
4732
|
}
|
|
4722
4733
|
for (const path of files) {
|
|
4723
4734
|
if (!(0, import_fs18.existsSync)(path)) {
|
|
4724
|
-
|
|
4735
|
+
throwValidation13(`--file: not found: ${path}`);
|
|
4725
4736
|
}
|
|
4726
4737
|
}
|
|
4727
4738
|
const params = {
|
|
@@ -4740,7 +4751,7 @@ async function cloneVoiceCommand(options) {
|
|
|
4740
4751
|
handleSdkError(error);
|
|
4741
4752
|
}
|
|
4742
4753
|
}
|
|
4743
|
-
function
|
|
4754
|
+
function throwValidation13(message) {
|
|
4744
4755
|
const err = new Error(message);
|
|
4745
4756
|
err.name = "ValidationError";
|
|
4746
4757
|
throw err;
|
|
@@ -4756,7 +4767,7 @@ var VALID_PROVIDERS4 = [
|
|
|
4756
4767
|
async function searchVoicesCommand(options) {
|
|
4757
4768
|
try {
|
|
4758
4769
|
if (options.voiceProvider && !VALID_PROVIDERS4.includes(options.voiceProvider)) {
|
|
4759
|
-
|
|
4770
|
+
throwValidation14(
|
|
4760
4771
|
`--voice-provider must be one of: ${VALID_PROVIDERS4.join(", ")}`
|
|
4761
4772
|
);
|
|
4762
4773
|
}
|
|
@@ -4777,7 +4788,7 @@ async function searchVoicesCommand(options) {
|
|
|
4777
4788
|
handleSdkError(error);
|
|
4778
4789
|
}
|
|
4779
4790
|
}
|
|
4780
|
-
function
|
|
4791
|
+
function throwValidation14(message) {
|
|
4781
4792
|
const err = new Error(message);
|
|
4782
4793
|
err.name = "ValidationError";
|
|
4783
4794
|
throw err;
|
|
@@ -4837,7 +4848,7 @@ async function listChatsCommand(options = {}) {
|
|
|
4837
4848
|
if (options.paginationKey) query.pagination_key = options.paginationKey;
|
|
4838
4849
|
if (options.sortOrder) {
|
|
4839
4850
|
if (!["ascending", "descending"].includes(options.sortOrder))
|
|
4840
|
-
|
|
4851
|
+
throwValidation15("--sort-order must be 'ascending' or 'descending'");
|
|
4841
4852
|
query.sort_order = options.sortOrder;
|
|
4842
4853
|
}
|
|
4843
4854
|
const client = getRetellClient();
|
|
@@ -4851,7 +4862,7 @@ async function listChatsCommand(options = {}) {
|
|
|
4851
4862
|
handleSdkError(error);
|
|
4852
4863
|
}
|
|
4853
4864
|
}
|
|
4854
|
-
function
|
|
4865
|
+
function throwValidation15(message) {
|
|
4855
4866
|
const err = new Error(message);
|
|
4856
4867
|
err.name = "ValidationError";
|
|
4857
4868
|
throw err;
|
|
@@ -4872,14 +4883,14 @@ async function updateChatCommand(chatId, options) {
|
|
|
4872
4883
|
params.override_dynamic_variables = dv;
|
|
4873
4884
|
if (options.dataStorageSetting) {
|
|
4874
4885
|
if (!DATA_STORAGE_SETTINGS2.includes(options.dataStorageSetting)) {
|
|
4875
|
-
|
|
4886
|
+
throwValidation16(
|
|
4876
4887
|
`--data-storage-setting must be one of: ${DATA_STORAGE_SETTINGS2.join(", ")}`
|
|
4877
4888
|
);
|
|
4878
4889
|
}
|
|
4879
4890
|
params.data_storage_setting = options.dataStorageSetting;
|
|
4880
4891
|
}
|
|
4881
4892
|
if (Object.keys(params).length === 0) {
|
|
4882
|
-
|
|
4893
|
+
throwValidation16(
|
|
4883
4894
|
"No mutation flags provided. Pass at least one of --metadata, --custom-attributes, --dynamic-variables, --data-storage-setting."
|
|
4884
4895
|
);
|
|
4885
4896
|
}
|
|
@@ -4894,7 +4905,7 @@ async function updateChatCommand(chatId, options) {
|
|
|
4894
4905
|
handleSdkError(error);
|
|
4895
4906
|
}
|
|
4896
4907
|
}
|
|
4897
|
-
function
|
|
4908
|
+
function throwValidation16(message) {
|
|
4898
4909
|
const err = new Error(message);
|
|
4899
4910
|
err.name = "ValidationError";
|
|
4900
4911
|
throw err;
|
|
@@ -4977,7 +4988,7 @@ async function createChatAgentCommand(options = {}) {
|
|
|
4977
4988
|
options.customLlm !== void 0 && "--custom-llm"
|
|
4978
4989
|
].filter(Boolean);
|
|
4979
4990
|
if (simpleFlags.length > 0) {
|
|
4980
|
-
|
|
4991
|
+
throwValidation17(
|
|
4981
4992
|
`--file is mutually exclusive with ${simpleFlags.join(", ")}. Put all fields in the JSON body.`
|
|
4982
4993
|
);
|
|
4983
4994
|
}
|
|
@@ -4992,12 +5003,12 @@ async function createChatAgentCommand(options = {}) {
|
|
|
4992
5003
|
options.customLlm
|
|
4993
5004
|
].filter(Boolean).length;
|
|
4994
5005
|
if (engineCount === 0) {
|
|
4995
|
-
|
|
5006
|
+
throwValidation17(
|
|
4996
5007
|
"Must specify one of: --llm-id, --flow-id, or --custom-llm (or use --file)"
|
|
4997
5008
|
);
|
|
4998
5009
|
}
|
|
4999
5010
|
if (engineCount > 1) {
|
|
5000
|
-
|
|
5011
|
+
throwValidation17(
|
|
5001
5012
|
"Only one of --llm-id, --flow-id, or --custom-llm can be specified"
|
|
5002
5013
|
);
|
|
5003
5014
|
}
|
|
@@ -5029,7 +5040,7 @@ async function createChatAgentCommand(options = {}) {
|
|
|
5029
5040
|
handleSdkError(error);
|
|
5030
5041
|
}
|
|
5031
5042
|
}
|
|
5032
|
-
function
|
|
5043
|
+
function throwValidation17(message) {
|
|
5033
5044
|
const err = new Error(message);
|
|
5034
5045
|
err.name = "ValidationError";
|
|
5035
5046
|
throw err;
|
|
@@ -5277,6 +5288,75 @@ async function agentMcpToolsCommand(agentId, options) {
|
|
|
5277
5288
|
}
|
|
5278
5289
|
}
|
|
5279
5290
|
|
|
5291
|
+
// src/commands/playground/complete.ts
|
|
5292
|
+
async function playgroundCompleteCommand(agentId, options) {
|
|
5293
|
+
try {
|
|
5294
|
+
const params = {
|
|
5295
|
+
messages: parseJsonArray(options.messages, "--messages")
|
|
5296
|
+
};
|
|
5297
|
+
const dynamicVariables = loadJsonArg(
|
|
5298
|
+
options.dynamicVariables,
|
|
5299
|
+
"--dynamic-variables"
|
|
5300
|
+
);
|
|
5301
|
+
if (dynamicVariables !== void 0) {
|
|
5302
|
+
params.dynamic_variables = parseJsonObject(
|
|
5303
|
+
dynamicVariables,
|
|
5304
|
+
"--dynamic-variables"
|
|
5305
|
+
);
|
|
5306
|
+
}
|
|
5307
|
+
const toolMocks = loadJsonArg(options.toolMocks, "--tool-mocks");
|
|
5308
|
+
if (toolMocks !== void 0) {
|
|
5309
|
+
params.tool_mocks = parseJsonArray(toolMocks, "--tool-mocks");
|
|
5310
|
+
}
|
|
5311
|
+
if (options.currentState !== void 0) {
|
|
5312
|
+
params.current_state = requireNonEmpty(
|
|
5313
|
+
options.currentState,
|
|
5314
|
+
"--current-state"
|
|
5315
|
+
);
|
|
5316
|
+
}
|
|
5317
|
+
if (options.currentNodeId !== void 0) {
|
|
5318
|
+
params.current_node_id = requireNonEmpty(
|
|
5319
|
+
options.currentNodeId,
|
|
5320
|
+
"--current-node-id"
|
|
5321
|
+
);
|
|
5322
|
+
}
|
|
5323
|
+
if (options.componentId !== void 0) {
|
|
5324
|
+
params.component_id = requireNonEmpty(options.componentId, "--component-id");
|
|
5325
|
+
}
|
|
5326
|
+
if (options.version !== void 0) {
|
|
5327
|
+
params.version = parseNumericFlag(options.version, "--version");
|
|
5328
|
+
}
|
|
5329
|
+
const client = getRetellClient();
|
|
5330
|
+
const result = await client.playground.completion(
|
|
5331
|
+
requireNonEmpty(agentId, "<agent_id>"),
|
|
5332
|
+
params
|
|
5333
|
+
);
|
|
5334
|
+
const selectedFields = options.fields ? options.fields.split(",").map((f) => f.trim()).filter((f) => f.length > 0) : [];
|
|
5335
|
+
const output = selectedFields.length > 0 ? filterFields(result, selectedFields) : result;
|
|
5336
|
+
outputJson(output);
|
|
5337
|
+
} catch (error) {
|
|
5338
|
+
handleSdkError(error);
|
|
5339
|
+
}
|
|
5340
|
+
}
|
|
5341
|
+
function parseJsonArray(value, flagName) {
|
|
5342
|
+
const parsed = typeof value === "string" ? loadJsonArg(value, flagName) : value;
|
|
5343
|
+
if (!Array.isArray(parsed)) {
|
|
5344
|
+
throwValidation18(`${flagName} must be a JSON array`);
|
|
5345
|
+
}
|
|
5346
|
+
return parsed;
|
|
5347
|
+
}
|
|
5348
|
+
function parseJsonObject(value, flagName) {
|
|
5349
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
5350
|
+
throwValidation18(`${flagName} must be a JSON object`);
|
|
5351
|
+
}
|
|
5352
|
+
return value;
|
|
5353
|
+
}
|
|
5354
|
+
function throwValidation18(message) {
|
|
5355
|
+
const err = new Error(message);
|
|
5356
|
+
err.name = "ValidationError";
|
|
5357
|
+
throw err;
|
|
5358
|
+
}
|
|
5359
|
+
|
|
5280
5360
|
// src/index.ts
|
|
5281
5361
|
var packageJson = JSON.parse(
|
|
5282
5362
|
(0, import_fs19.readFileSync)((0, import_path6.join)(__dirname, "../package.json"), "utf-8")
|
|
@@ -6287,9 +6367,24 @@ calls.command("update <call_id>").description("Update metadata and storage setti
|
|
|
6287
6367
|
).option("--fields <fields>", "Comma-separated list of fields to return").action(async (callId, options) => {
|
|
6288
6368
|
await updateCallCommand(callId, options);
|
|
6289
6369
|
});
|
|
6370
|
+
calls.command("stop <call_id>").description("Stop an ongoing call").action(async (callId) => {
|
|
6371
|
+
await stopCallCommand(callId);
|
|
6372
|
+
});
|
|
6290
6373
|
calls.command("delete <call_id>").description("Delete a call and its associated data").action(async (callId) => {
|
|
6291
6374
|
await deleteCallCommand(callId);
|
|
6292
6375
|
});
|
|
6376
|
+
var exportsCommand = program.command("exports").description("Manage export requests");
|
|
6377
|
+
exportsCommand.command("list").description("List export requests").option("--limit <number>", "Maximum number of export requests to return").option("--pagination-key <key>", "Pagination key for the next page").option("--sort-order <order>", "ascending or descending").option("--fields <fields>", "Comma-separated list of fields to return").addHelpText(
|
|
6378
|
+
"after",
|
|
6379
|
+
`
|
|
6380
|
+
Examples:
|
|
6381
|
+
$ retell exports list
|
|
6382
|
+
$ retell exports list --limit 20 --sort-order descending
|
|
6383
|
+
$ retell exports list --fields items.0.export_request_id,pagination_key
|
|
6384
|
+
`
|
|
6385
|
+
).action(async (options) => {
|
|
6386
|
+
await listExportRequestsCommand(options);
|
|
6387
|
+
});
|
|
6293
6388
|
var batchCalls = program.command("batch-calls").description("Schedule bulk outbound calls");
|
|
6294
6389
|
batchCalls.command("create").description("Create a new batch call").requiredOption("--from-number <number>", "Caller number in E.164 format").requiredOption(
|
|
6295
6390
|
"--tasks <path>",
|
|
@@ -6415,6 +6510,23 @@ chats.command("sms").description("Create an SMS-backed chat session").requiredOp
|
|
|
6415
6510
|
chats.command("end <chat_id>").description("End an active chat session").action(async (chatId) => {
|
|
6416
6511
|
await endChatCommand(chatId);
|
|
6417
6512
|
});
|
|
6513
|
+
var playground = program.command("playground").description("Run stateless playground completions");
|
|
6514
|
+
playground.command("complete <agent_id>").description("Run a stateless playground completion").requiredOption(
|
|
6515
|
+
"--messages <json>",
|
|
6516
|
+
"Conversation history as inline JSON array or @path"
|
|
6517
|
+
).option(
|
|
6518
|
+
"--dynamic-variables <json>",
|
|
6519
|
+
"Inline JSON object or @path for dynamic variables"
|
|
6520
|
+
).option("--tool-mocks <json>", "Inline JSON array or @path for tool mocks").option("--current-state <name>", "Current Retell-LLM state").option("--current-node-id <id>", "Current conversation-flow node id").option("--component-id <id>", "Conversation-flow component id").option("--version <number>", "Agent version to use").option("--fields <fields>", "Comma-separated list of fields to return").addHelpText(
|
|
6521
|
+
"after",
|
|
6522
|
+
`
|
|
6523
|
+
Examples:
|
|
6524
|
+
$ retell playground complete agent_abc --messages '[{"role":"user","content":"Hi"}]'
|
|
6525
|
+
$ retell playground complete agent_abc --messages @messages.json --dynamic-variables '{"name":"Ada"}'
|
|
6526
|
+
`
|
|
6527
|
+
).action(async (agentId, options) => {
|
|
6528
|
+
await playgroundCompleteCommand(agentId, options);
|
|
6529
|
+
});
|
|
6418
6530
|
var chatAgents = program.command("chat-agents").description("Manage chat agents (text/SMS mode)");
|
|
6419
6531
|
chatAgents.command("list").description("List chat agents").option("-l, --limit <n>", "Maximum number to return").option("--pagination-key <key>", "Chat agent id to start from").option(
|
|
6420
6532
|
"--pagination-key-version <n>",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "retell-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Community CLI for Retell AI - efficient access to transcripts, agents, and prompts for AI assistants without MCP overhead",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -48,13 +48,13 @@
|
|
|
48
48
|
},
|
|
49
49
|
"homepage": "https://github.com/awccom/retell-cli#readme",
|
|
50
50
|
"engines": {
|
|
51
|
-
"node": ">=18.
|
|
51
|
+
"node": ">=18.10.0"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"commander": "^14.0.0",
|
|
55
55
|
"dotenv": "^17.0.0",
|
|
56
56
|
"microdiff": "^1.5.0",
|
|
57
|
-
"retell-sdk": "^5.
|
|
57
|
+
"retell-sdk": "^5.18.0",
|
|
58
58
|
"zod": "^3.25.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|