Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions json-logs/samples/api/slackbot.skills.create.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"ok": false,
"error": "",
"needed": "",
"provided": "",
"warning": "",
"invalid_mcp_servers": [
{
"service_type": "",
"app_id": "A00000000",
"server_id": ""
}
],
"response_metadata": {
"messages": [
""
]
},
"skill": {
"access": "",
"category": "",
"creator_id": "U00000000",
"date_created": 12345,
"date_updated": 12345,
"description": "",
"display_name": "",
"example_prompt": "",
"id": "F00000000",
"instructions": "",
"is_official": false,
"library_count": 12345,
"mcp_servers": [
{
"service_type": "",
"app_id": "A00000000",
"server_id": "",
"display_name": "",
"is_available": false
}
],
"name": "",
"permalink": "",
"type": "",
"usage_count": 12345,
"visibility": ""
}
}
1 change: 1 addition & 0 deletions metadata/web-api/rate_limit_tiers.json
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@
"slackLists.items.list": "Tier2",
"slackLists.items.update": "Tier3",
"slackLists.update": "Tier2",
"slackbot.skills.create": "Tier2",
"stars.add": "Tier2",
"stars.list": "Tier3",
"stars.remove": "Tier2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest;
import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest;
import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest;
import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest;
import com.slack.api.methods.request.stars.StarsAddRequest;
import com.slack.api.methods.request.stars.StarsListRequest;
import com.slack.api.methods.request.stars.StarsRemoveRequest;
Expand Down Expand Up @@ -283,6 +284,7 @@
import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse;
import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse;
import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse;
import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse;
import com.slack.api.methods.response.stars.StarsAddResponse;
import com.slack.api.methods.response.stars.StarsListResponse;
import com.slack.api.methods.response.stars.StarsRemoveResponse;
Expand Down Expand Up @@ -1531,6 +1533,14 @@ CompletableFuture<AdminConversationsWhitelistListGroupsLinkedToChannelResponse>

CompletableFuture<SearchFilesResponse> searchFiles(RequestConfigurator<SearchFilesRequest.SearchFilesRequestBuilder> req);

// ------------------------------
// slackbot.skills
// ------------------------------

CompletableFuture<SlackbotSkillsCreateResponse> slackbotSkillsCreate(SlackbotSkillsCreateRequest req);

CompletableFuture<SlackbotSkillsCreateResponse> slackbotSkillsCreate(RequestConfigurator<SlackbotSkillsCreateRequest.SlackbotSkillsCreateRequestBuilder> req);

// ------------------------------
// slackLists
// ------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,12 @@ private Methods() {
public static final String SEARCH_FILES = "search.files";
public static final String SEARCH_MESSAGES = "search.messages";

// ------------------------------
// slackbot.skills
// ------------------------------

public static final String SLACKBOT_SKILLS_CREATE = "slackbot.skills.create";

// ------------------------------
// slackLists
// ------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest;
import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest;
import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest;
import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest;
import com.slack.api.methods.request.team.*;
import com.slack.api.methods.request.team.external_teams.TeamExternalTeamsDisconnectRequest;
import com.slack.api.methods.request.team.external_teams.TeamExternalTeamsListRequest;
Expand Down Expand Up @@ -308,6 +309,7 @@
import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse;
import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse;
import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse;
import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse;
import com.slack.api.methods.response.stars.StarsAddResponse;
import com.slack.api.methods.response.stars.StarsListResponse;
import com.slack.api.methods.response.stars.StarsRemoveResponse;
Expand Down Expand Up @@ -2664,6 +2666,15 @@ SearchMessagesResponse searchMessages(RequestConfigurator<SearchMessagesRequest.
SearchFilesResponse searchFiles(RequestConfigurator<SearchFilesRequest.SearchFilesRequestBuilder> req)
throws IOException, SlackApiException;

// ------------------------------
// slackbot.skills
// ------------------------------

SlackbotSkillsCreateResponse slackbotSkillsCreate(SlackbotSkillsCreateRequest req) throws IOException, SlackApiException;

SlackbotSkillsCreateResponse slackbotSkillsCreate(RequestConfigurator<SlackbotSkillsCreateRequest.SlackbotSkillsCreateRequestBuilder> req)
throws IOException, SlackApiException;

// ------------------------------
// slackLists
// ------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,8 @@ public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier
setRateLimitTier(SEARCH_FILES, Tier2);
setRateLimitTier(SEARCH_MESSAGES, Tier2);

setRateLimitTier(SLACKBOT_SKILLS_CREATE, Tier2);

setRateLimitTier(SLACKLISTS_ACCESS_DELETE, Tier3);
setRateLimitTier(SLACKLISTS_ACCESS_SET, Tier3);
setRateLimitTier(SLACKLISTS_CREATE, Tier2);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@
import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest;
import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest;
import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest;
import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest;
import com.slack.api.methods.request.stars.StarsAddRequest;
import com.slack.api.methods.request.stars.StarsListRequest;
import com.slack.api.methods.request.stars.StarsRemoveRequest;
Expand Down Expand Up @@ -3019,6 +3020,20 @@ public static FormBody.Builder toForm(StarsRemoveRequest req) {
return form;
}

public static FormBody.Builder toForm(SlackbotSkillsCreateRequest req) {
FormBody.Builder form = new FormBody.Builder();
setIfNotNull("display_name", req.getDisplayName(), form);
setIfNotNull("instructions", req.getInstructions(), form);
setIfNotNull("canvas_id", req.getCanvasId(), form);
setIfNotNull("description", req.getDescription(), form);
setIfNotNull("category", req.getCategory(), form);
setIfNotNull("example_prompt", req.getExamplePrompt(), form);
if (req.getMcpServers() != null) {
setIfNotNull("mcp_servers", GSON.toJson(req.getMcpServers()), form);
}
return form;
}

public static FormBody.Builder toForm(SlackListsAccessDeleteRequest req) {
FormBody.Builder form = new FormBody.Builder();
setIfNotNull("list_id", req.getListId(), form);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest;
import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest;
import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest;
import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest;
import com.slack.api.methods.request.stars.StarsAddRequest;
import com.slack.api.methods.request.stars.StarsListRequest;
import com.slack.api.methods.request.stars.StarsRemoveRequest;
Expand Down Expand Up @@ -287,6 +288,7 @@
import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse;
import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse;
import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse;
import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse;
import com.slack.api.methods.response.stars.StarsAddResponse;
import com.slack.api.methods.response.stars.StarsListResponse;
import com.slack.api.methods.response.stars.StarsRemoveResponse;
Expand Down Expand Up @@ -2743,6 +2745,16 @@ public CompletableFuture<SearchFilesResponse> searchFiles(RequestConfigurator<Se
return searchFiles(req.configure(SearchFilesRequest.builder()).build());
}

@Override
public CompletableFuture<SlackbotSkillsCreateResponse> slackbotSkillsCreate(SlackbotSkillsCreateRequest req) {
return executor.execute(SLACKBOT_SKILLS_CREATE, toMap(req), () -> methods.slackbotSkillsCreate(req));
}

@Override
public CompletableFuture<SlackbotSkillsCreateResponse> slackbotSkillsCreate(RequestConfigurator<SlackbotSkillsCreateRequest.SlackbotSkillsCreateRequestBuilder> req) {
return slackbotSkillsCreate(req.configure(SlackbotSkillsCreateRequest.builder()).build());
}

@Override
public CompletableFuture<SlackListsAccessDeleteResponse> slackListsAccessDelete(SlackListsAccessDeleteRequest req) {
return executor.execute(SLACKLISTS_ACCESS_DELETE, toMap(req), () -> methods.slackListsAccessDelete(req));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@
import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest;
import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest;
import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest;
import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest;
import com.slack.api.methods.request.stars.StarsAddRequest;
import com.slack.api.methods.request.stars.StarsListRequest;
import com.slack.api.methods.request.stars.StarsRemoveRequest;
Expand Down Expand Up @@ -310,6 +311,7 @@
import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse;
import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse;
import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse;
import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse;
import com.slack.api.methods.response.stars.StarsAddResponse;
import com.slack.api.methods.response.stars.StarsListResponse;
import com.slack.api.methods.response.stars.StarsRemoveResponse;
Expand Down Expand Up @@ -3421,6 +3423,16 @@ public SearchFilesResponse searchFiles(RequestConfigurator<SearchFilesRequest.Se
return searchFiles(req.configure(SearchFilesRequest.builder()).build());
}

@Override
public SlackbotSkillsCreateResponse slackbotSkillsCreate(SlackbotSkillsCreateRequest req) throws IOException, SlackApiException {
return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKBOT_SKILLS_CREATE, getToken(req), SlackbotSkillsCreateResponse.class);
}

@Override
public SlackbotSkillsCreateResponse slackbotSkillsCreate(RequestConfigurator<SlackbotSkillsCreateRequest.SlackbotSkillsCreateRequestBuilder> req) throws IOException, SlackApiException {
return slackbotSkillsCreate(req.configure(SlackbotSkillsCreateRequest.builder()).build());
}

@Override
public SlackListsAccessDeleteResponse slackListsAccessDelete(SlackListsAccessDeleteRequest req) throws IOException, SlackApiException {
return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKLISTS_ACCESS_DELETE, getToken(req), SlackListsAccessDeleteResponse.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.slack.api.methods.request.slackbot.skills;

import com.slack.api.methods.SlackApiRequest;
import com.slack.api.model.slackbot.SkillMcpServer;
import lombok.Builder;
import lombok.Data;

import java.util.List;

/**
* https://docs.slack.dev/reference/methods/slackbot.skills.create
*/
@Data
@Builder
public class SlackbotSkillsCreateRequest implements SlackApiRequest {

/**
* Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter.
*/
private String token;

/**
* Human-readable label. Max 255 characters; not unique.
*/
private String displayName;

/**
* Markdown body of the skill. Send exactly one of `instructions` or `canvas_id`.
*/
private String instructions;

/**
* Canvas the caller owns to turn into a skill. Send exactly one of `instructions` or `canvas_id`.
*/
private String canvasId;

/**
* When Slackbot should use the skill. Max 400 characters.
*/
private String description;

/**
* One of the skill categories.
* Acceptable values: `communication`, `customer_support`, `data_and_analytics`, `engineering`, `product_management`, `productivity`, `professional_development`, `project_management`, `sales`, `system`, `team_management`, `other`
*/
private String category;

/**
* Max 200 characters. May contain `{skill}`, which becomes the skill mention.
*/
private String examplePrompt;

/**
* Apps the skill needs, capped at the caller's MCP server limit. Declaring an app doesn't grant access to it.
*/
private List<SkillMcpServer> mcpServers;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.slack.api.methods.response.slackbot.skills;

import com.slack.api.methods.SlackApiTextResponse;
import com.slack.api.model.ResponseMetadata;
import com.slack.api.model.slackbot.Skill;
import com.slack.api.model.slackbot.SkillMcpServer;
import lombok.Data;

import java.util.List;
import java.util.Map;

@Data
public class SlackbotSkillsCreateResponse implements SlackApiTextResponse {

private boolean ok;
private String warning;
private String error;
private String needed;
private String provided;
private transient Map<String, List<String>> httpResponseHeaders;

private List<SkillMcpServer> invalidMcpServers;
private ResponseMetadata responseMetadata;
private Skill skill;
}
Loading
Loading