syllable-sdk 0.1.0-alpha.28 → 0.1.0-alpha.29
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/README.md +22 -0
- package/RUNTIMES.md +27 -1
- package/docs/sdks/dashboards/README.md +309 -0
- package/docs/sdks/v1/README.md +307 -0
- package/funcs/agentsAgentGetAvailableVoices.js +4 -4
- package/funcs/agentsAgentGetAvailableVoices.js.map +1 -1
- package/funcs/agentsCreate.js +4 -4
- package/funcs/agentsCreate.js.map +1 -1
- package/funcs/agentsDelete.js +4 -4
- package/funcs/agentsDelete.js.map +1 -1
- package/funcs/agentsGetById.js +4 -4
- package/funcs/agentsGetById.js.map +1 -1
- package/funcs/agentsList.js +4 -4
- package/funcs/agentsList.js.map +1 -1
- package/funcs/agentsTestSendTestMessage.js +4 -4
- package/funcs/agentsTestSendTestMessage.js.map +1 -1
- package/funcs/agentsUpdate.js +4 -4
- package/funcs/agentsUpdate.js.map +1 -1
- package/funcs/channelsDelete.js +4 -4
- package/funcs/channelsDelete.js.map +1 -1
- package/funcs/channelsList.js +4 -4
- package/funcs/channelsList.js.map +1 -1
- package/funcs/channelsTargetsAvailableTargets.js +4 -4
- package/funcs/channelsTargetsAvailableTargets.js.map +1 -1
- package/funcs/channelsTargetsCreate.js +4 -4
- package/funcs/channelsTargetsCreate.js.map +1 -1
- package/funcs/channelsTargetsGetById.js +4 -4
- package/funcs/channelsTargetsGetById.js.map +1 -1
- package/funcs/channelsTargetsList.js +4 -4
- package/funcs/channelsTargetsList.js.map +1 -1
- package/funcs/channelsTargetsUpdate.js +4 -4
- package/funcs/channelsTargetsUpdate.js.map +1 -1
- package/funcs/conversationsList.js +4 -4
- package/funcs/conversationsList.js.map +1 -1
- package/funcs/customMessagesCreate.js +4 -4
- package/funcs/customMessagesCreate.js.map +1 -1
- package/funcs/customMessagesDelete.js +4 -4
- package/funcs/customMessagesDelete.js.map +1 -1
- package/funcs/customMessagesGetById.js +4 -4
- package/funcs/customMessagesGetById.js.map +1 -1
- package/funcs/customMessagesList.js +4 -4
- package/funcs/customMessagesList.js.map +1 -1
- package/funcs/customMessagesUpdate.js +4 -4
- package/funcs/customMessagesUpdate.js.map +1 -1
- package/funcs/dashboardsPostSessionEventsDashboard.d.ts +18 -0
- package/funcs/dashboardsPostSessionEventsDashboard.d.ts.map +1 -0
- package/funcs/dashboardsPostSessionEventsDashboard.js +89 -0
- package/funcs/dashboardsPostSessionEventsDashboard.js.map +1 -0
- package/funcs/dashboardsPostSessionSummaryDashboard.d.ts +18 -0
- package/funcs/dashboardsPostSessionSummaryDashboard.d.ts.map +1 -0
- package/funcs/dashboardsPostSessionSummaryDashboard.js +89 -0
- package/funcs/dashboardsPostSessionSummaryDashboard.js.map +1 -0
- package/funcs/dashboardsPostSessionTransfersDashboard.d.ts +18 -0
- package/funcs/dashboardsPostSessionTransfersDashboard.d.ts.map +1 -0
- package/funcs/dashboardsPostSessionTransfersDashboard.js +89 -0
- package/funcs/dashboardsPostSessionTransfersDashboard.js.map +1 -0
- package/funcs/dashboardsPostSessionsDashboard.d.ts +18 -0
- package/funcs/dashboardsPostSessionsDashboard.d.ts.map +1 -0
- package/funcs/dashboardsPostSessionsDashboard.js +89 -0
- package/funcs/dashboardsPostSessionsDashboard.js.map +1 -0
- package/funcs/directoryCreate.js +4 -4
- package/funcs/directoryCreate.js.map +1 -1
- package/funcs/directoryDelete.js +4 -4
- package/funcs/directoryDelete.js.map +1 -1
- package/funcs/directoryDirectoryMemberBulkLoad.js +4 -4
- package/funcs/directoryDirectoryMemberBulkLoad.js.map +1 -1
- package/funcs/directoryDirectoryMemberDownload.js +4 -4
- package/funcs/directoryDirectoryMemberDownload.js.map +1 -1
- package/funcs/directoryGetById.js +4 -4
- package/funcs/directoryGetById.js.map +1 -1
- package/funcs/directoryList.js +4 -4
- package/funcs/directoryList.js.map +1 -1
- package/funcs/directoryUpdate.js +4 -4
- package/funcs/directoryUpdate.js.map +1 -1
- package/funcs/eventsList.js +4 -4
- package/funcs/eventsList.js.map +1 -1
- package/funcs/promptsCreate.js +4 -4
- package/funcs/promptsCreate.js.map +1 -1
- package/funcs/promptsDelete.js +4 -4
- package/funcs/promptsDelete.js.map +1 -1
- package/funcs/promptsGetById.js +4 -4
- package/funcs/promptsGetById.js.map +1 -1
- package/funcs/promptsList.js +4 -4
- package/funcs/promptsList.js.map +1 -1
- package/funcs/promptsPromptsHistory.js +4 -4
- package/funcs/promptsPromptsHistory.js.map +1 -1
- package/funcs/promptsUpdate.js +4 -4
- package/funcs/promptsUpdate.js.map +1 -1
- package/funcs/servicesCreate.js +4 -4
- package/funcs/servicesCreate.js.map +1 -1
- package/funcs/servicesList.js +4 -4
- package/funcs/servicesList.js.map +1 -1
- package/funcs/servicesUpdate.js +4 -4
- package/funcs/servicesUpdate.js.map +1 -1
- package/funcs/sessionLabelsCreate.js +4 -4
- package/funcs/sessionLabelsCreate.js.map +1 -1
- package/funcs/sessionLabelsGetById.js +4 -4
- package/funcs/sessionLabelsGetById.js.map +1 -1
- package/funcs/sessionLabelsList.js +4 -4
- package/funcs/sessionLabelsList.js.map +1 -1
- package/funcs/sessionsGenerateSessionRecordingUrls.js +4 -4
- package/funcs/sessionsGenerateSessionRecordingUrls.js.map +1 -1
- package/funcs/sessionsGetById.js +4 -4
- package/funcs/sessionsGetById.js.map +1 -1
- package/funcs/sessionsList.js +4 -4
- package/funcs/sessionsList.js.map +1 -1
- package/funcs/sessionsSessionRecordingStream.js +4 -4
- package/funcs/sessionsSessionRecordingStream.js.map +1 -1
- package/funcs/sessionsTranscriptGetById.js +4 -4
- package/funcs/sessionsTranscriptGetById.js.map +1 -1
- package/funcs/toolsCreate.js +4 -4
- package/funcs/toolsCreate.js.map +1 -1
- package/funcs/toolsGetByName.js +4 -4
- package/funcs/toolsGetByName.js.map +1 -1
- package/funcs/toolsList.js +4 -4
- package/funcs/toolsList.js.map +1 -1
- package/funcs/toolsUpdate.js +4 -4
- package/funcs/toolsUpdate.js.map +1 -1
- package/funcs/v1PostSessionEventsDashboard.d.ts +18 -0
- package/funcs/v1PostSessionEventsDashboard.d.ts.map +1 -0
- package/funcs/v1PostSessionEventsDashboard.js +89 -0
- package/funcs/v1PostSessionEventsDashboard.js.map +1 -0
- package/funcs/v1PostSessionSummaryDashboard.d.ts +18 -0
- package/funcs/v1PostSessionSummaryDashboard.d.ts.map +1 -0
- package/funcs/v1PostSessionSummaryDashboard.js +89 -0
- package/funcs/v1PostSessionSummaryDashboard.js.map +1 -0
- package/funcs/v1PostSessionTransfersDashboard.d.ts +18 -0
- package/funcs/v1PostSessionTransfersDashboard.d.ts.map +1 -0
- package/funcs/v1PostSessionTransfersDashboard.js +89 -0
- package/funcs/v1PostSessionTransfersDashboard.js.map +1 -0
- package/funcs/v1PostSessionsDashboard.d.ts +18 -0
- package/funcs/v1PostSessionsDashboard.d.ts.map +1 -0
- package/funcs/v1PostSessionsDashboard.js +89 -0
- package/funcs/v1PostSessionsDashboard.js.map +1 -0
- package/lib/config.d.ts +3 -3
- package/lib/config.js +4 -5
- package/lib/config.js.map +1 -1
- package/lib/encodings.js +18 -19
- package/lib/encodings.js.map +1 -1
- package/lib/env.js +1 -2
- package/lib/env.js.map +1 -1
- package/lib/http.js +1 -2
- package/lib/http.js.map +1 -1
- package/lib/matchers.js +5 -6
- package/lib/matchers.js.map +1 -1
- package/lib/primitives.js +1 -1
- package/lib/primitives.js.map +1 -1
- package/lib/retries.js +3 -4
- package/lib/retries.js.map +1 -1
- package/lib/sdks.js +15 -16
- package/lib/sdks.js.map +1 -1
- package/lib/security.js +2 -3
- package/lib/security.js.map +1 -1
- package/lib/url.js +1 -1
- package/lib/url.js.map +1 -1
- package/mintlify/scripts/create-md-script.js +46 -0
- package/mintlify/scripts/generate-mintlify-sdk-docs.js +117 -0
- package/models/components/channeltargetproperties.d.ts +3 -0
- package/models/components/channeltargetproperties.d.ts.map +1 -1
- package/models/components/channeltargetproperties.js +1 -0
- package/models/components/channeltargetproperties.js.map +1 -1
- package/models/components/dashboard.d.ts +35 -0
- package/models/components/dashboard.d.ts.map +1 -0
- package/models/components/dashboard.js +78 -0
- package/models/components/dashboard.js.map +1 -0
- package/models/components/index.d.ts +1 -0
- package/models/components/index.d.ts.map +1 -1
- package/models/components/index.js +1 -0
- package/models/components/index.js.map +1 -1
- package/models/components/toolparameterdefault.d.ts +6 -0
- package/models/components/toolparameterdefault.d.ts.map +1 -1
- package/models/components/toolparameterdefault.js.map +1 -1
- package/models/components/toolparametertransform.d.ts +14 -3
- package/models/components/toolparametertransform.d.ts.map +1 -1
- package/models/components/toolparametertransform.js +4 -2
- package/models/components/toolparametertransform.js.map +1 -1
- package/models/errors/httpclienterrors.js +2 -2
- package/models/errors/httpclienterrors.js.map +1 -1
- package/package.json +1 -1
- package/sdk/agents.js +1 -2
- package/sdk/agents.js.map +1 -1
- package/sdk/channels.js +1 -2
- package/sdk/channels.js.map +1 -1
- package/sdk/dashboards.d.ts +45 -0
- package/sdk/dashboards.d.ts.map +1 -0
- package/sdk/dashboards.js +64 -0
- package/sdk/dashboards.js.map +1 -0
- package/sdk/sdk.d.ts +6 -0
- package/sdk/sdk.d.ts.map +1 -1
- package/sdk/sdk.js +19 -22
- package/sdk/sdk.js.map +1 -1
- package/sdk/sessions.js +1 -2
- package/sdk/sessions.js.map +1 -1
- package/sdk/v1.d.ts +45 -0
- package/sdk/v1.d.ts.map +1 -0
- package/sdk/v1.js +64 -0
- package/sdk/v1.js.map +1 -0
- package/src/funcs/dashboardsPostSessionEventsDashboard.ts +111 -0
- package/src/funcs/dashboardsPostSessionSummaryDashboard.ts +111 -0
- package/src/funcs/dashboardsPostSessionTransfersDashboard.ts +111 -0
- package/src/funcs/dashboardsPostSessionsDashboard.ts +111 -0
- package/src/funcs/v1PostSessionEventsDashboard.ts +111 -0
- package/src/funcs/v1PostSessionSummaryDashboard.ts +111 -0
- package/src/funcs/v1PostSessionTransfersDashboard.ts +111 -0
- package/src/funcs/v1PostSessionsDashboard.ts +111 -0
- package/src/lib/config.ts +3 -3
- package/src/lib/security.ts +1 -1
- package/src/models/components/channeltargetproperties.ts +1 -0
- package/src/models/components/dashboard.ts +87 -0
- package/src/models/components/index.ts +1 -0
- package/src/models/components/toolparameterdefault.ts +6 -0
- package/src/models/components/toolparametertransform.ts +18 -5
- package/src/sdk/dashboards.ts +85 -0
- package/src/sdk/sdk.ts +12 -0
- package/src/sdk/v1.ts +85 -0
- package/test/sdk/contract/agents.test.ts +113 -0
- package/test/sdk/contract/custommessages.test.ts +109 -0
- package/test/sdk/contract/helper.ts +190 -0
- package/test/sdk/contract/prompts.test.ts +70 -0
package/src/sdk/v1.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { v1PostSessionEventsDashboard } from "../funcs/v1PostSessionEventsDashboard.js";
|
|
6
|
+
import { v1PostSessionsDashboard } from "../funcs/v1PostSessionsDashboard.js";
|
|
7
|
+
import { v1PostSessionSummaryDashboard } from "../funcs/v1PostSessionSummaryDashboard.js";
|
|
8
|
+
import { v1PostSessionTransfersDashboard } from "../funcs/v1PostSessionTransfersDashboard.js";
|
|
9
|
+
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
|
|
10
|
+
import * as components from "../models/components/index.js";
|
|
11
|
+
import { unwrapAsync } from "../types/fp.js";
|
|
12
|
+
|
|
13
|
+
export class V1 extends ClientSDK {
|
|
14
|
+
/**
|
|
15
|
+
* Post Session Events
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* METHOD: POST
|
|
19
|
+
* URL: /dashboard/session_events
|
|
20
|
+
* ARGUMENTS: None
|
|
21
|
+
* RETURNS: Dashboard info for embedding
|
|
22
|
+
*/
|
|
23
|
+
async postSessionEventsDashboard(
|
|
24
|
+
options?: RequestOptions,
|
|
25
|
+
): Promise<components.Dashboard> {
|
|
26
|
+
return unwrapAsync(v1PostSessionEventsDashboard(
|
|
27
|
+
this,
|
|
28
|
+
options,
|
|
29
|
+
));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Post Session Summary
|
|
34
|
+
*
|
|
35
|
+
* @remarks
|
|
36
|
+
* METHOD: POST
|
|
37
|
+
* URL: /dashboard/session_summary
|
|
38
|
+
* ARGUMENTS: None
|
|
39
|
+
* RETURNS: Dashboard info for embedding
|
|
40
|
+
*/
|
|
41
|
+
async postSessionSummaryDashboard(
|
|
42
|
+
options?: RequestOptions,
|
|
43
|
+
): Promise<components.Dashboard> {
|
|
44
|
+
return unwrapAsync(v1PostSessionSummaryDashboard(
|
|
45
|
+
this,
|
|
46
|
+
options,
|
|
47
|
+
));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Post Session Transfers
|
|
52
|
+
*
|
|
53
|
+
* @remarks
|
|
54
|
+
* METHOD: POST
|
|
55
|
+
* URL: /dashboard/session_transfers
|
|
56
|
+
* ARGUMENTS: None
|
|
57
|
+
* RETURNS: Dashboard info for embedding
|
|
58
|
+
*/
|
|
59
|
+
async postSessionTransfersDashboard(
|
|
60
|
+
options?: RequestOptions,
|
|
61
|
+
): Promise<components.Dashboard> {
|
|
62
|
+
return unwrapAsync(v1PostSessionTransfersDashboard(
|
|
63
|
+
this,
|
|
64
|
+
options,
|
|
65
|
+
));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Post Sessions
|
|
70
|
+
*
|
|
71
|
+
* @remarks
|
|
72
|
+
* METHOD: POST
|
|
73
|
+
* URL: /dashboard/sessions
|
|
74
|
+
* ARGUMENTS: None
|
|
75
|
+
* RETURNS: Dashboard info for embedding
|
|
76
|
+
*/
|
|
77
|
+
async postSessionsDashboard(
|
|
78
|
+
options?: RequestOptions,
|
|
79
|
+
): Promise<components.Dashboard> {
|
|
80
|
+
return unwrapAsync(v1PostSessionsDashboard(
|
|
81
|
+
this,
|
|
82
|
+
options,
|
|
83
|
+
));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { beforeAll, describe, it, expect, afterAll } from "vitest";
|
|
2
|
+
import { getSDK, generateFake } from "./helper";
|
|
3
|
+
|
|
4
|
+
let sdk
|
|
5
|
+
let createdAgents = []
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
sdk = await getSDK()
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
afterAll(async () => {
|
|
11
|
+
for (const agent of createdAgents) {
|
|
12
|
+
const result = await sdk.agents.delete({
|
|
13
|
+
agentId: agent.id,
|
|
14
|
+
reason: 'was a created by a test'
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
for (const agent of createdAgents) {
|
|
18
|
+
const promptResult = await sdk.prompts.delete({
|
|
19
|
+
promptId: agent.promptId,
|
|
20
|
+
reason: 'was a created by a test'
|
|
21
|
+
})
|
|
22
|
+
const customMessageResult = await sdk.customMessages.delete({
|
|
23
|
+
customMessageId: agent.customMessageId,
|
|
24
|
+
reason: 'was a created by a test'
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
describe('Syllable SDK Contract test suite', () => {
|
|
30
|
+
describe('agents', () => {
|
|
31
|
+
describe('create', () => {
|
|
32
|
+
it('should create a agent', async() => {
|
|
33
|
+
const prompt = generateFake('prompt');
|
|
34
|
+
const promptResult = await sdk.prompts.create(prompt);
|
|
35
|
+
const message = generateFake('customMessage');
|
|
36
|
+
delete message.rules[0].daysOfWeek
|
|
37
|
+
message.rules[0].date = new Date().toJSON().slice(0, 10);
|
|
38
|
+
const messageResult = await sdk.customMessages.create(message);
|
|
39
|
+
const agent = generateFake('agent');
|
|
40
|
+
agent.promptId = promptResult.id
|
|
41
|
+
agent.customMessageId = messageResult.id
|
|
42
|
+
const result = await sdk.agents.create(agent);
|
|
43
|
+
createdAgents.push(result)
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
describe('list', () => {
|
|
47
|
+
it('should list a newly created agent', async() => {
|
|
48
|
+
const prompt = generateFake('prompt');
|
|
49
|
+
const promptResult = await sdk.prompts.create(prompt);
|
|
50
|
+
const message = generateFake('customMessage');
|
|
51
|
+
delete message.rules[0].daysOfWeek
|
|
52
|
+
message.rules[0].date = new Date().toJSON().slice(0, 10);
|
|
53
|
+
const messageResult = await sdk.customMessages.create(message);
|
|
54
|
+
const agent = generateFake('agent');
|
|
55
|
+
agent.promptId = promptResult.id
|
|
56
|
+
agent.customMessageId = messageResult.id
|
|
57
|
+
const result = await sdk.agents.create(agent);
|
|
58
|
+
createdAgents.push(result)
|
|
59
|
+
const listResult = await sdk.agents.list({});
|
|
60
|
+
const isFound = listResult.items.some((cm) => {
|
|
61
|
+
return cm.name === agent.name
|
|
62
|
+
})
|
|
63
|
+
if (!isFound) {
|
|
64
|
+
throw new Error('agent that was just created is not listed')
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
describe('update', () => {
|
|
69
|
+
it('should update a newly created agent', async() => {
|
|
70
|
+
const prompt = generateFake('prompt');
|
|
71
|
+
const promptResult = await sdk.prompts.create(prompt);
|
|
72
|
+
const message = generateFake('customMessage');
|
|
73
|
+
delete message.rules[0].daysOfWeek
|
|
74
|
+
message.rules[0].date = new Date().toJSON().slice(0, 10);
|
|
75
|
+
const messageResult = await sdk.customMessages.create(message);
|
|
76
|
+
const agent = generateFake('agent');
|
|
77
|
+
agent.promptId = promptResult.id
|
|
78
|
+
agent.customMessageId = messageResult.id
|
|
79
|
+
const result = await sdk.agents.create(agent);
|
|
80
|
+
createdAgents.push(result)
|
|
81
|
+
agent.id = result.id
|
|
82
|
+
agent.description = 'new description'
|
|
83
|
+
const updateResult = await sdk.agents.update(agent);
|
|
84
|
+
})
|
|
85
|
+
})
|
|
86
|
+
describe('delete', () => {
|
|
87
|
+
it('should delete a newly created agent', async() => {
|
|
88
|
+
const prompt = generateFake('prompt');
|
|
89
|
+
const promptResult = await sdk.prompts.create(prompt);
|
|
90
|
+
const message = generateFake('customMessage');
|
|
91
|
+
delete message.rules[0].daysOfWeek
|
|
92
|
+
message.rules[0].date = new Date().toJSON().slice(0, 10);
|
|
93
|
+
const messageResult = await sdk.customMessages.create(message);
|
|
94
|
+
const agent = generateFake('agent');
|
|
95
|
+
agent.promptId = promptResult.id
|
|
96
|
+
agent.customMessageId = messageResult.id
|
|
97
|
+
const result = await sdk.agents.create(agent);
|
|
98
|
+
const deleteResult = await sdk.agents.delete({
|
|
99
|
+
agentId: result.id,
|
|
100
|
+
reason: 'created by a test'
|
|
101
|
+
})
|
|
102
|
+
await sdk.prompts.delete({
|
|
103
|
+
promptId: agent.promptId,
|
|
104
|
+
reason: 'was a created by a test'
|
|
105
|
+
})
|
|
106
|
+
await sdk.customMessages.delete({
|
|
107
|
+
customMessageId: agent.customMessageId,
|
|
108
|
+
reason: 'was a created by a test'
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
})
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { beforeAll, describe, it, expect, afterAll } from "vitest";
|
|
2
|
+
import { getSDK, generateFake, validateResponse } from "./helper";
|
|
3
|
+
|
|
4
|
+
let sdk
|
|
5
|
+
let createdMessages = []
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
sdk = await getSDK()
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
afterAll(async () => {
|
|
11
|
+
for (const message of createdMessages) {
|
|
12
|
+
const result = await sdk.customMessages.delete({
|
|
13
|
+
customMessageId: message.id,
|
|
14
|
+
reason: 'was a created by a test'
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
describe('Syllable SDK Contract test suite', () => {
|
|
20
|
+
describe('customMessages', () => {
|
|
21
|
+
describe('create', () => {
|
|
22
|
+
it('should create a simple customMessage', async() => {
|
|
23
|
+
const message = generateFake('customMessage');
|
|
24
|
+
delete message.rules;
|
|
25
|
+
const result = await sdk.customMessages.create(message);
|
|
26
|
+
createdMessages.push(result)
|
|
27
|
+
expect(validateResponse('customMessage', 'create', result, 200)).to.be.true
|
|
28
|
+
})
|
|
29
|
+
it('should create a customMessage with a date rule', async() => {
|
|
30
|
+
const message = generateFake('customMessage');
|
|
31
|
+
delete message.rules[0].daysOfWeek
|
|
32
|
+
message.rules[0].date = new Date().toJSON().slice(0, 10);
|
|
33
|
+
const result = await sdk.customMessages.create(message);
|
|
34
|
+
createdMessages.push(result)
|
|
35
|
+
expect(validateResponse('customMessage', 'create', result, 200)).to.be.true
|
|
36
|
+
})
|
|
37
|
+
it('should create a customMessage with a days_of_week rule', async() => {
|
|
38
|
+
const message = generateFake('customMessage');
|
|
39
|
+
delete message.rules[0].date
|
|
40
|
+
const result = await sdk.customMessages.create(message);
|
|
41
|
+
createdMessages.push(result)
|
|
42
|
+
expect(validateResponse('customMessage', 'create', result, 200)).to.be.true
|
|
43
|
+
})
|
|
44
|
+
it('should create a customMessage with a date rule and no time_range', async() => {
|
|
45
|
+
const message = generateFake('customMessage');
|
|
46
|
+
delete message.rules[0].daysOfWeek
|
|
47
|
+
delete message.rules[0].timeRangeEnd
|
|
48
|
+
delete message.rules[0].timeRangeStart
|
|
49
|
+
message.rules[0].date = new Date().toJSON().slice(0, 10);
|
|
50
|
+
const result = await sdk.customMessages.create(message);
|
|
51
|
+
createdMessages.push(result)
|
|
52
|
+
expect(validateResponse('customMessage', 'create', result, 200)).to.be.true
|
|
53
|
+
})
|
|
54
|
+
it('should create a customMessage with a days_of_week rule and no time_range', async() => {
|
|
55
|
+
const message = generateFake('customMessage');
|
|
56
|
+
delete message.rules[0].date
|
|
57
|
+
delete message.rules[0].timeRangeEnd
|
|
58
|
+
delete message.rules[0].timeRangeStart
|
|
59
|
+
const result = await sdk.customMessages.create(message);
|
|
60
|
+
createdMessages.push(result)
|
|
61
|
+
expect(validateResponse('customMessage', 'create', result, 200)).to.be.true
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
describe('list', () => {
|
|
65
|
+
it('should list a newly created customMessage', async() => {
|
|
66
|
+
const message = generateFake('customMessage');
|
|
67
|
+
delete message.rules;
|
|
68
|
+
const result = await sdk.customMessages.create(message);
|
|
69
|
+
createdMessages.push(result)
|
|
70
|
+
const listResult = await sdk.customMessages.list({
|
|
71
|
+
searchFields: ['name'],
|
|
72
|
+
searchFieldValues: [message.name]
|
|
73
|
+
});
|
|
74
|
+
const isFound = listResult.items.some((cm) => {
|
|
75
|
+
return cm.name === message.name
|
|
76
|
+
})
|
|
77
|
+
if (!isFound) {
|
|
78
|
+
throw new Error('customMessage that was just created is not listed')
|
|
79
|
+
}
|
|
80
|
+
expect(validateResponse('customMessage', 'list', listResult, 200)).to.be.true
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
describe('update', () => {
|
|
84
|
+
it('should update a newly created customMessage', async() => {
|
|
85
|
+
const message = generateFake('customMessage');
|
|
86
|
+
const rules = message.rules;
|
|
87
|
+
delete message.rules;
|
|
88
|
+
const result = await sdk.customMessages.create(message);
|
|
89
|
+
createdMessages.push(result)
|
|
90
|
+
message.rules = rules
|
|
91
|
+
message.id = result.id
|
|
92
|
+
const updateResult = await sdk.customMessages.update(message);
|
|
93
|
+
expect(validateResponse('customMessage', 'update', updateResult, 200)).to.be.true
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
describe('delete', () => {
|
|
97
|
+
it('should delete a newly created customMessage', async() => {
|
|
98
|
+
const message = generateFake('customMessage');
|
|
99
|
+
delete message.rules;
|
|
100
|
+
const result = await sdk.customMessages.create(message);
|
|
101
|
+
const deleteResult = await sdk.customMessages.delete({
|
|
102
|
+
customMessageId: result.id,
|
|
103
|
+
reason: 'created by a test'
|
|
104
|
+
});
|
|
105
|
+
expect(validateResponse('customMessage', 'delete', deleteResult, 200)).to.be.true
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
})
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { SyllableSDK } from "../../../src/index.ts"
|
|
2
|
+
import { randAirportCode, randNumber, randParagraph, randPhrase } from '@ngneat/falso';
|
|
3
|
+
import { camelCase, snakeCase, isArray, transform, isObject, get } from "lodash"
|
|
4
|
+
import Ajv from "ajv";
|
|
5
|
+
import addFormats from "ajv-formats";
|
|
6
|
+
import addErrors from "ajv-errors";
|
|
7
|
+
import { readFileSync } from "fs";
|
|
8
|
+
|
|
9
|
+
const openApiSpec = JSON.parse(readFileSync(`${__dirname}/../../../openapi.json`, "utf8")) as any;
|
|
10
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
11
|
+
addFormats(ajv);
|
|
12
|
+
addErrors(ajv);
|
|
13
|
+
ajv.addSchema(openApiSpec, "openapi.json")
|
|
14
|
+
|
|
15
|
+
export async function getSDK() {
|
|
16
|
+
const url = process.env['SYLLABLESDK_SERVER_URL'];
|
|
17
|
+
const key = process.env["SYLLABLESDK_API_KEY_HEADER"];
|
|
18
|
+
if (!url) {
|
|
19
|
+
console.log('Please set SYLLABLESDK_SERVER_URL env var');
|
|
20
|
+
}
|
|
21
|
+
if (!key) {
|
|
22
|
+
console.log('Please set SYLLABLESDK_API_KEY_HEADER env var');
|
|
23
|
+
}
|
|
24
|
+
const sdk = new SyllableSDK({
|
|
25
|
+
serverURL: url,
|
|
26
|
+
apiKeyHeader: key,
|
|
27
|
+
});
|
|
28
|
+
await sdk.agents.list({});
|
|
29
|
+
return sdk
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const camelizeObj = obj => transform(obj, (acc, value, key, target) => {
|
|
33
|
+
const camelKey = isArray(target) ? key : camelCase(key);
|
|
34
|
+
acc[camelKey] = isObject(value) ? camelizeObj(value) : value;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const snakeizeObj = obj => transform(obj, (acc, value, key, target) => {
|
|
38
|
+
const camelKey = isArray(target) ? key : snakeCase(key);
|
|
39
|
+
acc[camelKey] = isObject(value) ? snakeizeObj(value) : value;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export function generateFake(modelType, options = {}, camelize = true) {
|
|
43
|
+
let model = {}
|
|
44
|
+
if (!Object.hasOwn(options, 'prefix')) {
|
|
45
|
+
options.prefix = 'test: '
|
|
46
|
+
}
|
|
47
|
+
switch (modelType) {
|
|
48
|
+
case 'customMessage':
|
|
49
|
+
model = createCustomMessage(options);
|
|
50
|
+
break;
|
|
51
|
+
|
|
52
|
+
case 'prompt':
|
|
53
|
+
model = createPrompt(options);
|
|
54
|
+
break;
|
|
55
|
+
|
|
56
|
+
case 'agent':
|
|
57
|
+
model = createAgent(options);
|
|
58
|
+
break;
|
|
59
|
+
|
|
60
|
+
default:
|
|
61
|
+
throw new Error(`${modelType} is not implemented`);
|
|
62
|
+
}
|
|
63
|
+
if (camelize) {
|
|
64
|
+
model = camelizeObj(model)
|
|
65
|
+
}
|
|
66
|
+
return model;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function validateResponse(modelType, op, response, responseCode) {
|
|
70
|
+
let modelTypeSnakeCase = snakeCase(modelType)
|
|
71
|
+
let apiPath;
|
|
72
|
+
let verb;
|
|
73
|
+
switch (op) {
|
|
74
|
+
case 'list':
|
|
75
|
+
apiPath = `/api/v1/${modelTypeSnakeCase}s/`
|
|
76
|
+
verb = 'get'
|
|
77
|
+
break;
|
|
78
|
+
|
|
79
|
+
case 'create':
|
|
80
|
+
apiPath = `/api/v1/${modelTypeSnakeCase}s/`
|
|
81
|
+
verb = 'post'
|
|
82
|
+
break;
|
|
83
|
+
|
|
84
|
+
case 'getById':
|
|
85
|
+
apiPath = `/api/v1/${modelTypeSnakeCase}s/{${modelTypeSnakeCase}_id}`
|
|
86
|
+
verb = 'get'
|
|
87
|
+
break;
|
|
88
|
+
|
|
89
|
+
case 'update':
|
|
90
|
+
apiPath = `/api/v1/${modelTypeSnakeCase}s/`
|
|
91
|
+
verb = 'put'
|
|
92
|
+
break;
|
|
93
|
+
|
|
94
|
+
case 'delete':
|
|
95
|
+
apiPath = `/api/v1/${modelTypeSnakeCase}s/{${modelTypeSnakeCase}_id}`
|
|
96
|
+
verb = 'delete'
|
|
97
|
+
break;
|
|
98
|
+
|
|
99
|
+
default:
|
|
100
|
+
throw new Error(`${modelTypeSnakeCase} ${op} is not implemented`);
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
const schema = get(openApiSpec['paths'], `${apiPath}.${verb}.responses.${responseCode}.content.application/json.schema`)
|
|
104
|
+
if (!schema) {
|
|
105
|
+
throw new Error(`${modelTypeSnakeCase} ${op} ${apiPath}->${verb}->${responseCode} could not find schema in openapi.json`);
|
|
106
|
+
}
|
|
107
|
+
const ref = get(openApiSpec['paths'], `${apiPath}.${verb}.responses.${responseCode}.content.application/json.schema.$ref`)
|
|
108
|
+
let valid
|
|
109
|
+
if (ref) {
|
|
110
|
+
valid = ajv.validate({ '$ref': `openapi.json${ref}`}, snakeizeObj(response))
|
|
111
|
+
} else {
|
|
112
|
+
valid = ajv.validate(schema, snakeizeObj(response))
|
|
113
|
+
}
|
|
114
|
+
if (!valid) {
|
|
115
|
+
ajv.errors = ajv.errors.filter((validationError) => {
|
|
116
|
+
if (validationError.instancePath == '/updated_at' && validationError.keyword == 'type') {
|
|
117
|
+
// updatedAt is datetime via SDK where as it is a string via fast api
|
|
118
|
+
return false
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (ajv.errors.length >= 1) {
|
|
122
|
+
console.warn(`${modelTypeSnakeCase} ${op} response did not pass jsonschema validation`)
|
|
123
|
+
console.warn(ajv.errors)
|
|
124
|
+
} else {
|
|
125
|
+
valid = true
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return valid
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function createCustomMessage(options) {
|
|
132
|
+
const message = {
|
|
133
|
+
"type": "greeting",
|
|
134
|
+
"name": `${options.prefix}${randPhrase()} ${randNumber()}`,
|
|
135
|
+
"text": randParagraph(),
|
|
136
|
+
"label": "test",
|
|
137
|
+
"rules": [
|
|
138
|
+
{
|
|
139
|
+
"description": "week day rule",
|
|
140
|
+
"time_range_start": "09:00",
|
|
141
|
+
"time_range_end": "17:00",
|
|
142
|
+
"days_of_week": [
|
|
143
|
+
"mo", "tu", "we", "th", "fr"
|
|
144
|
+
],
|
|
145
|
+
"invert": false,
|
|
146
|
+
"text": "This is a weekday test message"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
};
|
|
150
|
+
return message;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function createPrompt(options) {
|
|
154
|
+
const prompt = {
|
|
155
|
+
"name": `${options.prefix} ${randPhrase()} ${randPhrase()} ${randNumber()}}`,
|
|
156
|
+
"description": randParagraph(),
|
|
157
|
+
"type": "prompt_v1",
|
|
158
|
+
"context": "You know everything about macos releases. You know their code names and release dates. You will answer questions like when was macos lion was released and what is the latest macos name, etc",
|
|
159
|
+
"tools": [
|
|
160
|
+
"hangup",
|
|
161
|
+
"set_current_language",
|
|
162
|
+
"summary"
|
|
163
|
+
],
|
|
164
|
+
"llm_config": {
|
|
165
|
+
"provider": "openai",
|
|
166
|
+
"model": "gpt-4o",
|
|
167
|
+
"version": "2024-08-06",
|
|
168
|
+
"api_version": null
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return prompt
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function createAgent(options) {
|
|
175
|
+
const agent = {
|
|
176
|
+
"name": `${options.prefix} ${randPhrase()} ${randPhrase()} ${randNumber()}`,
|
|
177
|
+
"description": randParagraph(),
|
|
178
|
+
"label": "test",
|
|
179
|
+
"timezone": "America/New_York",
|
|
180
|
+
"type": "ca_v1",
|
|
181
|
+
"prompt_id": null,
|
|
182
|
+
"custom_message_id": null,
|
|
183
|
+
"languages": [
|
|
184
|
+
"en-US",
|
|
185
|
+
"es-US"
|
|
186
|
+
],
|
|
187
|
+
variables: {}
|
|
188
|
+
}
|
|
189
|
+
return agent
|
|
190
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { beforeAll, describe, it, expect, afterAll } from "vitest";
|
|
2
|
+
import { getSDK, generateFake, validateResponse } from "./helper";
|
|
3
|
+
|
|
4
|
+
let sdk
|
|
5
|
+
let createdPrompts = []
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
sdk = await getSDK()
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
afterAll(async () => {
|
|
11
|
+
for (const prompt of createdPrompts) {
|
|
12
|
+
const result = await sdk.prompts.delete({
|
|
13
|
+
promptId: prompt.id,
|
|
14
|
+
reason: 'was a created by a test'
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
describe('Syllable SDK Contract test suite', () => {
|
|
20
|
+
describe('prompts', () => {
|
|
21
|
+
describe('create', () => {
|
|
22
|
+
it('should create a prompt', async() => {
|
|
23
|
+
const prompt = generateFake('prompt');
|
|
24
|
+
const result = await sdk.prompts.create(prompt);
|
|
25
|
+
createdPrompts.push(result)
|
|
26
|
+
expect(validateResponse('prompt', 'create', result, 200)).to.be.true
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
describe('list', () => {
|
|
30
|
+
it('should list a newly created prompt', async() => {
|
|
31
|
+
const prompt = generateFake('prompt');
|
|
32
|
+
const result = await sdk.prompts.create(prompt);
|
|
33
|
+
createdPrompts.push(result)
|
|
34
|
+
const listResult = await sdk.prompts.list({
|
|
35
|
+
searchFields: ['name'],
|
|
36
|
+
searchFieldValues: [prompt.name]
|
|
37
|
+
});
|
|
38
|
+
const isFound = listResult.items.some((cm) => {
|
|
39
|
+
return cm.name === prompt.name
|
|
40
|
+
})
|
|
41
|
+
expect(validateResponse('prompt', 'list', listResult, 200)).to.be.true
|
|
42
|
+
if (!isFound) {
|
|
43
|
+
throw new Error('prompt that was just created is not listed')
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
describe('update', () => {
|
|
48
|
+
it('should update a newly created prompt', async() => {
|
|
49
|
+
const prompt = generateFake('prompt');
|
|
50
|
+
const result = await sdk.prompts.create(prompt);
|
|
51
|
+
createdPrompts.push(result)
|
|
52
|
+
prompt.id = result.id
|
|
53
|
+
prompt.description = 'new description'
|
|
54
|
+
const updateResult = await sdk.prompts.update(prompt);
|
|
55
|
+
expect(validateResponse('prompt', 'update', updateResult, 200)).to.be.true
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
describe('delete', () => {
|
|
59
|
+
it('should delete a newly created prompt', async() => {
|
|
60
|
+
const prompt = generateFake('prompt');
|
|
61
|
+
const result = await sdk.prompts.create(prompt);
|
|
62
|
+
const deleteResult = await sdk.prompts.delete({
|
|
63
|
+
promptId: result.id,
|
|
64
|
+
reason: 'created by a test'
|
|
65
|
+
});
|
|
66
|
+
expect(validateResponse('prompt', 'delete', deleteResult, 200)).to.be.true
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
})
|