supplier) {
+ return CompletableFuture.supplyAsync(supplier);
+ }
+
+ @Override
+ public void close() {
+ sessions.events().close();
+ skills.close();
+ files.close();
+ }
+
+ private static String resolveBaseUrl(String explicitUrl, String workspace, String region) {
+ if (explicitUrl != null && !explicitUrl.isEmpty()) {
+ return explicitUrl;
+ }
+ String envUrl = System.getenv(AgentStudioConstants.ENV_BASE_URL);
+ if (envUrl == null || envUrl.isEmpty()) {
+ envUrl = System.getenv(AgentStudioConstants.ENV_BASE_URL_ALT);
+ }
+ if (envUrl != null && !envUrl.isEmpty()) {
+ return envUrl;
+ }
+ return AgentStudioConstants.resolveBaseUrl(workspace, region);
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/AgentStudioConstants.java b/src/main/java/com/alibaba/dashscope/agentstudio/AgentStudioConstants.java
new file mode 100644
index 0000000..ec1008a
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/AgentStudioConstants.java
@@ -0,0 +1,143 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio;
+
+import com.alibaba.dashscope.base.HalfDuplexParamBase;
+import com.alibaba.dashscope.protocol.GeneralServiceOption;
+import com.alibaba.dashscope.protocol.HttpMethod;
+import com.alibaba.dashscope.protocol.Protocol;
+import com.alibaba.dashscope.protocol.StreamingMode;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+public final class AgentStudioConstants {
+ public static final String BASE_URL_TEMPLATE =
+ "https://%s.%s.maas.aliyuncs.com/api/v1/agentstudio";
+ public static final String DEFAULT_REGION = "cn-beijing";
+ public static final int DEFAULT_TIMEOUT_MS = 600_000;
+ public static final int DEFAULT_CONNECT_TIMEOUT_MS = 10_000;
+ public static final String ENV_BASE_URL = "DASHSCOPE_AGENTSTUDIO_URL";
+ public static final String ENV_BASE_URL_ALT = "AGENTSTUDIO_URL";
+ public static final String ENV_WORKSPACE = "DASHSCOPE_WORKSPACE";
+ public static final String ENV_REGION = "DASHSCOPE_API_REGION";
+
+ private AgentStudioConstants() {}
+
+ public static final class SSEEventType {
+ public static final String MESSAGE = "message";
+ public static final String INTERRUPT = "interrupt";
+ public static final String TOOL_CONFIRMATION = "tool_confirmation";
+ public static final String FUNCTION_CALL_OUTPUT = "function_call_output";
+ public static final String TOOL_CALL_OUTPUT = "tool_call_output";
+ public static final String DEFINE_OUTCOME = "define_outcome";
+ public static final String FUNCTION_CALL = "function_call";
+ public static final String TOOL_CALL = "tool_call";
+ public static final String REASONING = "reasoning";
+ public static final String MCP_CALL = "mcp_call";
+ public static final String MCP_CALL_OUTPUT = "mcp_call_output";
+ public static final String SESSION_STATUS = "session_status";
+ public static final String ERROR = "error";
+ public static final String SESSION_UPDATED = "session_updated";
+ public static final String OUTCOME_EVALUATION = "outcome_evaluation";
+
+ private SSEEventType() {}
+ }
+
+ public static final class MessageRole {
+ public static final String USER = "user";
+ public static final String ASSISTANT = "assistant";
+ public static final String TOOL = "tool";
+
+ private MessageRole() {}
+ }
+
+ public static final class BlockType {
+ public static final String TEXT = "text";
+ public static final String IMAGE = "image";
+ public static final String AUDIO = "audio";
+ public static final String DATA = "data";
+ public static final String FILE = "file";
+ public static final String REFUSAL = "refusal";
+ public static final String ERROR = "error";
+
+ private BlockType() {}
+ }
+
+ public static final class SessionStatusValue {
+ public static final String IDLE = "idle";
+ public static final String RUNNING = "running";
+ public static final String RESCHEDULING = "rescheduling";
+ public static final String TERMINATED = "terminated";
+
+ private SessionStatusValue() {}
+ }
+
+ public static String resolveBaseUrl(String workspace, String region) {
+ String ws = workspace;
+ if (ws == null || ws.isEmpty()) {
+ ws = System.getenv(ENV_WORKSPACE);
+ }
+ if (ws == null || ws.isEmpty()) {
+ throw new IllegalArgumentException(
+ "workspace is required. Pass it to the constructor, "
+ + "set DASHSCOPE_WORKSPACE env var, or set DASHSCOPE_AGENTSTUDIO_URL.");
+ }
+ String r = region;
+ if (r == null || r.isEmpty()) {
+ r = System.getenv(ENV_REGION);
+ }
+ if (r == null || r.isEmpty()) {
+ r = DEFAULT_REGION;
+ }
+ return String.format(BASE_URL_TEMPLATE, ws, r);
+ }
+
+ /**
+ * Build a {@link GeneralServiceOption} for an agentstudio endpoint. When {@code baseUrl} is
+ * non-null it overrides the global default; otherwise the request falls back to {@code
+ * Constants.baseHttpApiUrl} via {@code GeneralApi}.
+ */
+ public static GeneralServiceOption newServiceOption(
+ HttpMethod method, String path, String baseUrl) {
+ GeneralServiceOption opt =
+ GeneralServiceOption.builder()
+ .protocol(Protocol.HTTP)
+ .httpMethod(method)
+ .streamingMode(StreamingMode.OUT)
+ .path(path)
+ .build();
+ if (baseUrl != null) {
+ opt.setBaseHttpUrl(baseUrl);
+ }
+ return opt;
+ }
+
+ /**
+ * Stamp the client's instance apiKey onto a param if the caller didn't set one. The global
+ * fallback chain in {@link com.alibaba.dashscope.utils.ApiKey#getApiKey} still applies when
+ * {@code apiKey} is null.
+ */
+ public static P withApiKey(String apiKey, P param) {
+ if (apiKey != null && param.getApiKey() == null) {
+ param.setApiKey(apiKey);
+ }
+ return param;
+ }
+
+ /**
+ * Append {@code key=value} (URL-encoded) to {@code sb} if value is non-null. Joins with {@literal
+ * &}.
+ */
+ public static void appendParam(StringBuilder sb, String key, Object value) {
+ if (value == null) {
+ return;
+ }
+ if (sb.length() > 0) {
+ sb.append("&");
+ }
+ try {
+ sb.append(key).append("=").append(URLEncoder.encode(value.toString(), "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ sb.append(key).append("=").append(value);
+ }
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/message/ClientEvents.java b/src/main/java/com/alibaba/dashscope/agentstudio/message/ClientEvents.java
new file mode 100644
index 0000000..249edbb
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/message/ClientEvents.java
@@ -0,0 +1,194 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.message;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import java.util.List;
+import java.util.Map;
+
+public final class ClientEvents {
+
+ private ClientEvents() {}
+
+ public static JsonObject userMessage(String text) {
+ return userMessage(text, null, null);
+ }
+
+ public static JsonObject userMessage(List blocks) {
+ return userMessage(blocks, null, null);
+ }
+
+ public static JsonObject userMessage(String text, String sessionThreadId) {
+ return userMessage(text, sessionThreadId, null);
+ }
+
+ public static JsonObject userMessage(
+ String text, String sessionThreadId, Map metadata) {
+ JsonArray content = new JsonArray();
+ JsonObject textBlock = new JsonObject();
+ textBlock.addProperty("type", "text");
+ textBlock.addProperty("text", text);
+ content.add(textBlock);
+ return buildUserMessage(content, sessionThreadId, metadata);
+ }
+
+ public static JsonObject userMessage(
+ List blocks, String sessionThreadId, Map metadata) {
+ JsonArray content = new JsonArray();
+ for (JsonObject block : blocks) {
+ content.add(block);
+ }
+ return buildUserMessage(content, sessionThreadId, metadata);
+ }
+
+ private static JsonObject buildUserMessage(
+ JsonArray content, String sessionThreadId, Map metadata) {
+ JsonObject event = new JsonObject();
+ event.addProperty("type", "message");
+ event.addProperty("role", "user");
+ event.add("content", content);
+ if (sessionThreadId != null) {
+ event.addProperty("session_thread_id", sessionThreadId);
+ }
+ if (metadata != null && !metadata.isEmpty()) {
+ JsonObject meta = new JsonObject();
+ for (Map.Entry e : metadata.entrySet()) {
+ meta.addProperty(e.getKey(), e.getValue());
+ }
+ event.add("metadata", meta);
+ }
+ return event;
+ }
+
+ public static JsonObject userInterrupt() {
+ return userInterrupt(null);
+ }
+
+ public static JsonObject userInterrupt(String sessionThreadId) {
+ JsonObject event = new JsonObject();
+ event.addProperty("type", "interrupt");
+ event.addProperty("role", "user");
+ if (sessionThreadId != null) {
+ event.addProperty("session_thread_id", sessionThreadId);
+ }
+ return event;
+ }
+
+ public static JsonObject userToolConfirmation(String toolUseId, String result) {
+ return userToolConfirmation(toolUseId, result, null, null);
+ }
+
+ public static JsonObject userToolConfirmation(
+ String toolUseId, String result, String denyMessage) {
+ return userToolConfirmation(toolUseId, result, denyMessage, null);
+ }
+
+ public static JsonObject userToolConfirmation(
+ String toolUseId, String result, String denyMessage, String sessionThreadId) {
+ if (!"allow".equals(result) && !"deny".equals(result)) {
+ throw new IllegalArgumentException("tool_confirmation result must be 'allow' or 'deny'");
+ }
+ JsonObject data = new JsonObject();
+ data.addProperty("call_id", toolUseId);
+ data.addProperty("result", result);
+ if (denyMessage != null && "deny".equals(result)) {
+ data.addProperty("deny_message", denyMessage);
+ }
+ JsonObject dataBlock = new JsonObject();
+ dataBlock.addProperty("type", "data");
+ dataBlock.add("data", data);
+ JsonArray content = new JsonArray();
+ content.add(dataBlock);
+ JsonObject event = new JsonObject();
+ event.addProperty("type", "tool_confirmation");
+ event.addProperty("role", "user");
+ event.add("content", content);
+ if (sessionThreadId != null) {
+ event.addProperty("session_thread_id", sessionThreadId);
+ }
+ return event;
+ }
+
+ public static JsonObject userCustomToolResult(
+ String customToolUseId, String resultContent, boolean isError) {
+ return userCustomToolResult(customToolUseId, resultContent, isError, null);
+ }
+
+ public static JsonObject userCustomToolResult(
+ String customToolUseId, String resultContent, boolean isError, String sessionThreadId) {
+ JsonObject data = new JsonObject();
+ data.addProperty("call_id", customToolUseId);
+ data.addProperty("output", resultContent);
+ JsonObject dataBlock = new JsonObject();
+ dataBlock.addProperty("type", "data");
+ dataBlock.add("data", data);
+ JsonArray content = new JsonArray();
+ content.add(dataBlock);
+ JsonObject event = new JsonObject();
+ event.addProperty("type", "function_call_output");
+ event.addProperty("role", "tool");
+ event.add("content", content);
+ event.addProperty("is_error", isError);
+ if (sessionThreadId != null) {
+ event.addProperty("session_thread_id", sessionThreadId);
+ }
+ return event;
+ }
+
+ public static JsonObject userToolResult(String toolUseId, String resultContent, boolean isError) {
+ return userToolResult(toolUseId, resultContent, isError, null);
+ }
+
+ public static JsonObject userToolResult(
+ String toolUseId, String resultContent, boolean isError, String sessionThreadId) {
+ JsonObject data = new JsonObject();
+ data.addProperty("call_id", toolUseId);
+ data.addProperty("output", resultContent);
+ JsonObject dataBlock = new JsonObject();
+ dataBlock.addProperty("type", "data");
+ dataBlock.add("data", data);
+ JsonArray content = new JsonArray();
+ content.add(dataBlock);
+ JsonObject event = new JsonObject();
+ event.addProperty("type", "tool_call_output");
+ event.addProperty("role", "tool");
+ event.add("content", content);
+ event.addProperty("is_error", isError);
+ if (sessionThreadId != null) {
+ event.addProperty("session_thread_id", sessionThreadId);
+ }
+ return event;
+ }
+
+ public static JsonObject userDefineOutcome(
+ String description, String rubric, Integer maxIterations) {
+ return userDefineOutcome(description, rubric, maxIterations, null);
+ }
+
+ public static JsonObject userDefineOutcome(
+ String description, String rubric, Integer maxIterations, String sessionThreadId) {
+ JsonObject data = new JsonObject();
+ if (description != null) {
+ data.addProperty("description", description);
+ }
+ if (rubric != null) {
+ data.addProperty("rubric", rubric);
+ }
+ if (maxIterations != null) {
+ data.addProperty("max_iterations", maxIterations);
+ }
+ JsonObject dataBlock = new JsonObject();
+ dataBlock.addProperty("type", "data");
+ dataBlock.add("data", data);
+ JsonArray content = new JsonArray();
+ content.add(dataBlock);
+ JsonObject event = new JsonObject();
+ event.addProperty("type", "define_outcome");
+ event.addProperty("role", "user");
+ event.add("content", content);
+ if (sessionThreadId != null) {
+ event.addProperty("session_thread_id", sessionThreadId);
+ }
+ return event;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/message/ContentBlock.java b/src/main/java/com/alibaba/dashscope/agentstudio/message/ContentBlock.java
new file mode 100644
index 0000000..23abff6
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/message/ContentBlock.java
@@ -0,0 +1,160 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.message;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.annotations.SerializedName;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+public abstract class ContentBlock {
+ @SerializedName("type")
+ private String type;
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class Text extends ContentBlock {
+ @SerializedName("text")
+ private String text;
+
+ @SerializedName("citations")
+ private List citations;
+ }
+
+ @Data
+ public static class Citation {
+ @SerializedName("url")
+ private String url;
+
+ @SerializedName("title")
+ private String title;
+
+ @SerializedName("cited_text")
+ private String citedText;
+ }
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class Image extends ContentBlock {
+ @SerializedName("image_url")
+ private String imageUrl;
+
+ @SerializedName("file_id")
+ private String fileId;
+
+ @SerializedName("image_data")
+ private String imageData;
+
+ @SerializedName("media_type")
+ private String mediaType;
+ }
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class Audio extends ContentBlock {
+ @SerializedName("data")
+ private String data;
+
+ @SerializedName("format")
+ private String format;
+
+ @SerializedName("file_id")
+ private String fileId;
+ }
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class DataContent extends ContentBlock {
+ @SerializedName("data")
+ private JsonObject data;
+
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("title")
+ private String title;
+
+ @SerializedName("context")
+ private String context;
+ }
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class File extends ContentBlock {
+ @SerializedName("file_url")
+ private String fileUrl;
+
+ @SerializedName("file_id")
+ private String fileId;
+
+ @SerializedName("file_data")
+ private String fileData;
+
+ @SerializedName("media_type")
+ private String mediaType;
+
+ @SerializedName("filename")
+ private String filename;
+ }
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class Refusal extends ContentBlock {
+ @SerializedName("refusal")
+ private String refusal;
+ }
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class Error extends ContentBlock {
+ @SerializedName("error_code")
+ private String errorCode;
+
+ @SerializedName("message")
+ private String message;
+ }
+
+ public static class Deserializer implements JsonDeserializer {
+ private static final Map> REGISTRY = new HashMap<>();
+ private static final Gson PLAIN_GSON = new GsonBuilder().create();
+
+ static {
+ REGISTRY.put("text", Text.class);
+ REGISTRY.put("image", Image.class);
+ REGISTRY.put("audio", Audio.class);
+ REGISTRY.put("data", DataContent.class);
+ REGISTRY.put("file", File.class);
+ REGISTRY.put("refusal", Refusal.class);
+ REGISTRY.put("error", Error.class);
+ }
+
+ @Override
+ public ContentBlock deserialize(
+ JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
+ if (!json.isJsonObject()) {
+ return null;
+ }
+ JsonObject obj = json.getAsJsonObject();
+ String type = null;
+ if (obj.has("type") && obj.get("type").isJsonPrimitive()) {
+ type = obj.get("type").getAsString();
+ }
+ Class extends ContentBlock> clazz = type != null ? REGISTRY.get(type) : null;
+ if (clazz == null) {
+ clazz = DataContent.class;
+ }
+ return PLAIN_GSON.fromJson(obj, clazz);
+ }
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/message/Message.java b/src/main/java/com/alibaba/dashscope/agentstudio/message/Message.java
new file mode 100644
index 0000000..2db5eac
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/message/Message.java
@@ -0,0 +1,74 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.message;
+
+import com.alibaba.dashscope.agentstudio.model.Session;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+
+@Data
+public class Message {
+ @SerializedName("object")
+ private String object;
+
+ @SerializedName("status")
+ private String status;
+
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("role")
+ private String role;
+
+ @SerializedName("content")
+ private List content;
+
+ @SerializedName("metadata")
+ private Map metadata;
+
+ @SerializedName("is_error")
+ private Boolean isError;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("sequence_number")
+ private Long sequenceNumber;
+
+ @SerializedName("session_thread_id")
+ private String sessionThreadId;
+
+ @SerializedName("code")
+ private String code;
+
+ @SerializedName("message")
+ private String message;
+
+ /**
+ * Extract stop_reason from a session_status event's data block.
+ *
+ * The SSE session_status idle event carries stop_reason in its data: {@code
+ * {"stop_reason":{"type":"end_turn"},"session_status":"idle"}}. This helper parses it out so
+ * callers don't need to manually dig through DataContent blocks.
+ *
+ * @return stop_reason (has type, eventIds), or null if not a session_status event or absent
+ */
+ public Session.StopReason getStopReason() {
+ if (!"session_status".equals(type) || content == null) return null;
+ for (ContentBlock block : content) {
+ if (block instanceof ContentBlock.DataContent) {
+ JsonObject data = ((ContentBlock.DataContent) block).getData();
+ if (data != null && data.has("stop_reason") && !data.get("stop_reason").isJsonNull()) {
+ return JsonUtils.fromJson(data.get("stop_reason"), Session.StopReason.class);
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/Agent.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/Agent.java
new file mode 100644
index 0000000..fc05b9f
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/Agent.java
@@ -0,0 +1,66 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.agentstudio.model.Configs.McpServerConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.ModelConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.SkillConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.ToolConfig;
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Agent extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("description")
+ private String description;
+
+ @SerializedName("model")
+ private ModelConfig model;
+
+ @SerializedName("system")
+ private String system;
+
+ @SerializedName("tools")
+ private List tools;
+
+ @SerializedName("skills")
+ private List skills;
+
+ @SerializedName("mcp_servers")
+ private List mcpServers;
+
+ @SerializedName("version")
+ private Integer version;
+
+ @SerializedName("metadata")
+ private Map metadata;
+
+ @SerializedName("workspace_id")
+ private String workspaceId;
+
+ @SerializedName("archived_at")
+ private String archivedAt;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("updated_at")
+ private String updatedAt;
+
+ public String getSystemPrompt() {
+ return system;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentStudioDeletionStatus.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentStudioDeletionStatus.java
new file mode 100644
index 0000000..1e33668
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentStudioDeletionStatus.java
@@ -0,0 +1,21 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AgentStudioDeletionStatus extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ public boolean isDeleted() {
+ return type != null && type.contains("deleted");
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentStudioFile.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentStudioFile.java
new file mode 100644
index 0000000..1d570c2
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentStudioFile.java
@@ -0,0 +1,35 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AgentStudioFile extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("filename")
+ private String filename;
+
+ @SerializedName("downloadable")
+ private Boolean downloadable;
+
+ @SerializedName("mime_type")
+ private String mimeType;
+
+ @SerializedName("size_bytes")
+ private Long sizeBytes;
+
+ @SerializedName("status")
+ private String status;
+
+ @SerializedName("created_at")
+ private String createdAt;
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentVersion.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentVersion.java
new file mode 100644
index 0000000..c388a43
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/AgentVersion.java
@@ -0,0 +1,56 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.agentstudio.model.Configs.McpServerConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.ModelConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.SkillConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.ToolConfig;
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AgentVersion extends FlattenResultBase {
+ @SerializedName("agent_id")
+ private String agentId;
+
+ @SerializedName("version")
+ private Integer version;
+
+ @SerializedName("config")
+ private AgentVersionConfig config;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @Data
+ public static class AgentVersionConfig {
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("description")
+ private String description;
+
+ @SerializedName("model")
+ private ModelConfig model;
+
+ @SerializedName("system")
+ private String system;
+
+ @SerializedName("tools")
+ private List tools;
+
+ @SerializedName("skills")
+ private List skills;
+
+ @SerializedName("mcp_servers")
+ private List mcpServers;
+
+ @SerializedName("metadata")
+ private Map metadata;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/Configs.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/Configs.java
new file mode 100644
index 0000000..7c515c1
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/Configs.java
@@ -0,0 +1,73 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import lombok.Data;
+
+public final class Configs {
+ private Configs() {}
+
+ @Data
+ public static class ModelConfig {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("name")
+ private String name;
+ }
+
+ @Data
+ public static class ToolConfig {
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("mcp_server_name")
+ private String mcpServerName;
+
+ @SerializedName("default_config")
+ private DefaultConfig defaultConfig;
+
+ @SerializedName("configs")
+ private List configs;
+
+ @Data
+ public static class DefaultConfig {
+ @SerializedName("enabled")
+ private Boolean enabled;
+ }
+
+ @Data
+ public static class PerToolConfig {
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("enabled")
+ private Boolean enabled;
+ }
+ }
+
+ @Data
+ public static class SkillConfig {
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("skill_id")
+ private String skillId;
+
+ @SerializedName("version")
+ private String version;
+ }
+
+ @Data
+ public static class McpServerConfig {
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("url")
+ private String url;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/Credential.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/Credential.java
new file mode 100644
index 0000000..a15968a
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/Credential.java
@@ -0,0 +1,75 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import java.util.Map;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Credential extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("vault_id")
+ private String vaultId;
+
+ @SerializedName("display_name")
+ private String displayName;
+
+ @SerializedName("auth")
+ private CredentialAuth auth;
+
+ @SerializedName("metadata")
+ private Map metadata;
+
+ @SerializedName("archived_at")
+ private String archivedAt;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("updated_at")
+ private String updatedAt;
+
+ @Data
+ public static class Networking {
+ @SerializedName("type")
+ private String type;
+ }
+
+ @Data
+ public static class CredentialAuth {
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("token")
+ private String token;
+
+ @SerializedName("secret_name")
+ private String secretName;
+
+ @SerializedName("secret_value")
+ private String secretValue;
+
+ @SerializedName("mcp_server_url")
+ private String mcpServerUrl;
+
+ @SerializedName("access_token")
+ private String accessToken;
+
+ @SerializedName("expires_at")
+ private String expiresAt;
+
+ @SerializedName("refresh")
+ private String refresh;
+
+ @SerializedName("networking")
+ private Networking networking;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/Environment.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/Environment.java
new file mode 100644
index 0000000..c8e0547
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/Environment.java
@@ -0,0 +1,85 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Environment extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("description")
+ private String description;
+
+ @SerializedName("status")
+ private String status;
+
+ @SerializedName("config")
+ private Config config;
+
+ @SerializedName("metadata")
+ private Map metadata;
+
+ @SerializedName("scope")
+ private String scope;
+
+ @SerializedName("archived_at")
+ private String archivedAt;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("updated_at")
+ private String updatedAt;
+
+ @Data
+ public static class Config {
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("networking")
+ private Networking networking;
+
+ @SerializedName("packages")
+ private Packages packages;
+
+ @Data
+ public static class Networking {
+ @SerializedName("type")
+ private String type;
+ }
+
+ @Data
+ public static class Packages {
+ @SerializedName("apt")
+ private List apt;
+
+ @SerializedName("gem")
+ private List gem;
+
+ @SerializedName("pip")
+ private List pip;
+
+ @SerializedName("cargo")
+ private List cargo;
+
+ @SerializedName("go")
+ private List go;
+
+ @SerializedName("npm")
+ private List npm;
+ }
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/Session.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/Session.java
new file mode 100644
index 0000000..b645cff
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/Session.java
@@ -0,0 +1,137 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.agentstudio.model.Configs.ModelConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.ToolConfig;
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.JsonObject;
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Session extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("title")
+ private String title;
+
+ @SerializedName("agent")
+ private SessionAgent agent;
+
+ @SerializedName("environment_id")
+ private String environmentId;
+
+ @SerializedName("status")
+ private String status;
+
+ @SerializedName("stop_reason")
+ private StopReason stopReason;
+
+ @SerializedName("resources")
+ private List resources;
+
+ @SerializedName("metadata")
+ private Map metadata;
+
+ @SerializedName("vault_ids")
+ private List vaultIds;
+
+ @SerializedName("stats")
+ private Stats stats;
+
+ @SerializedName("usage")
+ private Usage usage;
+
+ @SerializedName("archived_at")
+ private String archivedAt;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("updated_at")
+ private String updatedAt;
+
+ public String getAgentId() {
+ if (agent != null) return agent.getId();
+ return null;
+ }
+
+ public Integer getAgentVersion() {
+ if (agent != null) return agent.getVersion();
+ return null;
+ }
+
+ @Data
+ public static class SessionAgent {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("version")
+ private Integer version;
+
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("description")
+ private String description;
+
+ @SerializedName("model")
+ private ModelConfig model;
+
+ @SerializedName("system")
+ private String system;
+
+ @SerializedName("tools")
+ private List tools;
+ }
+
+ @Data
+ public static class StopReason {
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("event_ids")
+ private List eventIds;
+ }
+
+ @Data
+ public static class Usage {
+ @SerializedName("input_tokens")
+ private Long inputTokens;
+
+ @SerializedName("output_tokens")
+ private Long outputTokens;
+
+ @SerializedName("cache_creation_input_tokens")
+ private Long cacheCreationInputTokens;
+
+ @SerializedName("cache_read_input_tokens")
+ private Long cacheReadInputTokens;
+
+ @SerializedName("cache_creation")
+ private Long cacheCreation;
+
+ @SerializedName("speed")
+ private Double speed;
+ }
+
+ @Data
+ public static class Stats {
+ @SerializedName("active_seconds")
+ private Double activeSeconds;
+
+ @SerializedName("duration_seconds")
+ private Double durationSeconds;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/Skill.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/Skill.java
new file mode 100644
index 0000000..ea6b930
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/Skill.java
@@ -0,0 +1,56 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Skill extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("description")
+ private String description;
+
+ @SerializedName("source")
+ private String source;
+
+ @SerializedName("status")
+ private String status;
+
+ @SerializedName("latest_version")
+ private String latestVersion;
+
+ @SerializedName("version")
+ private String version;
+
+ @SerializedName("file_id")
+ private String fileId;
+
+ @SerializedName("scope")
+ private Scope scope;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("updated_at")
+ private String updatedAt;
+
+ @Data
+ public static class Scope {
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("id")
+ private String id;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/SkillVersion.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/SkillVersion.java
new file mode 100644
index 0000000..f0c4d1f
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/SkillVersion.java
@@ -0,0 +1,42 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.JsonElement;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SkillVersion extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("skill_id")
+ private String skillId;
+
+ @SerializedName("name")
+ private String name;
+
+ @SerializedName("description")
+ private String description;
+
+ @SerializedName("version")
+ private String version;
+
+ @SerializedName("status")
+ private String status;
+
+ @SerializedName("additional_properties")
+ private JsonElement additionalProperties;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("updated_at")
+ private String updatedAt;
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/model/Vault.java b/src/main/java/com/alibaba/dashscope/agentstudio/model/Vault.java
new file mode 100644
index 0000000..0157f40
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/model/Vault.java
@@ -0,0 +1,33 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.model;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import java.util.Map;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Vault extends FlattenResultBase {
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("type")
+ private String type;
+
+ @SerializedName("display_name")
+ private String displayName;
+
+ @SerializedName("metadata")
+ private Map metadata;
+
+ @SerializedName("archived_at")
+ private String archivedAt;
+
+ @SerializedName("created_at")
+ private String createdAt;
+
+ @SerializedName("updated_at")
+ private String updatedAt;
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/pagination/CursorPage.java b/src/main/java/com/alibaba/dashscope/agentstudio/pagination/CursorPage.java
new file mode 100644
index 0000000..4e875ad
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/pagination/CursorPage.java
@@ -0,0 +1,71 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.pagination;
+
+import com.alibaba.dashscope.common.FlattenResultBase;
+import com.google.gson.annotations.SerializedName;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CursorPage extends FlattenResultBase implements Iterable {
+ @SerializedName("data")
+ private List data;
+
+ @SerializedName("next_page")
+ private String nextPage;
+
+ @EqualsAndHashCode.Exclude
+ private transient Function>> fetchNext;
+
+ public boolean hasNext() {
+ return nextPage != null && fetchNext != null;
+ }
+
+ public CompletableFuture> getNext() {
+ if (!hasNext()) {
+ return CompletableFuture.completedFuture(null);
+ }
+ return fetchNext.apply(nextPage);
+ }
+
+ @Override
+ public Iterator iterator() {
+ return new Iterator() {
+ private CursorPage currentPage = CursorPage.this;
+ private int index = 0;
+
+ @Override
+ public boolean hasNext() {
+ if (currentPage == null) {
+ return false;
+ }
+ while (true) {
+ if (currentPage.data != null && index < currentPage.data.size()) {
+ return true;
+ }
+ if (!currentPage.hasNext()) {
+ currentPage = null;
+ return false;
+ }
+ currentPage = currentPage.getNext().join();
+ if (currentPage == null) {
+ return false;
+ }
+ index = 0;
+ }
+ }
+
+ @Override
+ public T next() {
+ if (!hasNext()) throw new NoSuchElementException();
+ return currentPage.data.get(index++);
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentCreateParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentCreateParam.java
new file mode 100644
index 0000000..867e6cf
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentCreateParam.java
@@ -0,0 +1,59 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.agentstudio.model.Configs.McpServerConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.SkillConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.ToolConfig;
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import java.util.List;
+import java.util.Map;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class AgentCreateParam extends FlattenHalfDuplexParamBase {
+ @NonNull private String name;
+ @NonNull private String model;
+ @Default private String description = null;
+ @Default private String systemPrompt = null;
+ @Default private List tools = null;
+ @Default private List mcpServers = null;
+ @Default private List skills = null;
+ @Default private Map metadata = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ JsonObject body = new JsonObject();
+ body.addProperty("name", name);
+ JsonObject modelObj = new JsonObject();
+ modelObj.addProperty("id", model);
+ body.add("model", modelObj);
+ if (description != null) {
+ body.addProperty("description", description);
+ }
+ if (systemPrompt != null) {
+ body.addProperty("system", systemPrompt);
+ }
+ if (tools != null) {
+ body.add("tools", JsonUtils.toJsonElement(tools));
+ }
+ if (mcpServers != null) {
+ body.add("mcp_servers", JsonUtils.toJsonElement(mcpServers));
+ }
+ if (skills != null) {
+ body.add("skills", JsonUtils.toJsonElement(skills));
+ }
+ if (metadata != null && !metadata.isEmpty()) {
+ body.add("metadata", JsonUtils.toJsonElement(metadata));
+ }
+ addExtraBody(body);
+ return body;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentListParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentListParam.java
new file mode 100644
index 0000000..a6652a4
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentListParam.java
@@ -0,0 +1,32 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.agentstudio.AgentStudioConstants;
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.google.gson.JsonObject;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class AgentListParam extends FlattenHalfDuplexParamBase {
+ @Default private Integer limit = null;
+ @Default private String page = null;
+ @Default private Boolean includeArchived = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ return new JsonObject();
+ }
+
+ public String toQueryString() {
+ StringBuilder sb = new StringBuilder();
+ AgentStudioConstants.appendParam(sb, "limit", limit);
+ AgentStudioConstants.appendParam(sb, "page", page);
+ AgentStudioConstants.appendParam(sb, "include_archived", includeArchived);
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentUpdateParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentUpdateParam.java
new file mode 100644
index 0000000..fdc89af
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/AgentUpdateParam.java
@@ -0,0 +1,78 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.agentstudio.model.Configs.McpServerConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.SkillConfig;
+import com.alibaba.dashscope.agentstudio.model.Configs.ToolConfig;
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.alibaba.dashscope.exception.InputRequiredException;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import java.util.List;
+import java.util.Map;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class AgentUpdateParam extends FlattenHalfDuplexParamBase {
+ /** Required: must equal the server's current (latest) version, or the update fails with 409. */
+ @Default private Integer version = null;
+
+ @Default private String name = null;
+ @Default private String model = null;
+ @Default private String description = null;
+ @Default private String systemPrompt = null;
+ @Default private List tools = null;
+ @Default private List mcpServers = null;
+ @Default private List skills = null;
+ @Default private Map metadata = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ JsonObject body = new JsonObject();
+ if (version != null) {
+ body.addProperty("version", version);
+ }
+ if (name != null) {
+ body.addProperty("name", name);
+ }
+ if (model != null) {
+ JsonObject modelObj = new JsonObject();
+ modelObj.addProperty("id", model);
+ body.add("model", modelObj);
+ }
+ if (description != null) {
+ body.addProperty("description", description);
+ }
+ if (systemPrompt != null) {
+ body.addProperty("system", systemPrompt);
+ }
+ if (tools != null) {
+ body.add("tools", JsonUtils.toJsonElement(tools));
+ }
+ if (mcpServers != null) {
+ body.add("mcp_servers", JsonUtils.toJsonElement(mcpServers));
+ }
+ if (skills != null) {
+ body.add("skills", JsonUtils.toJsonElement(skills));
+ }
+ if (metadata != null && !metadata.isEmpty()) {
+ body.add("metadata", JsonUtils.toJsonElement(metadata));
+ }
+ addExtraBody(body);
+ return body;
+ }
+
+ @Override
+ public void validate() throws InputRequiredException {
+ if (version == null) {
+ throw new InputRequiredException(
+ "version is required for update. Call agents().retrieve(agentId) first to obtain the"
+ + " current version (server rejects updates that don't match the latest version).");
+ }
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialCreateParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialCreateParam.java
new file mode 100644
index 0000000..a75f1b2
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialCreateParam.java
@@ -0,0 +1,35 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import java.util.Map;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class CredentialCreateParam extends FlattenHalfDuplexParamBase {
+ @NonNull private JsonObject auth;
+ @Default private String displayName = null;
+ @Default private Map metadata = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ JsonObject body = new JsonObject();
+ body.add("auth", auth);
+ if (displayName != null) {
+ body.addProperty("display_name", displayName);
+ }
+ if (metadata != null && !metadata.isEmpty()) {
+ body.add("metadata", JsonUtils.toJsonElement(metadata));
+ }
+ addExtraBody(body);
+ return body;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialListParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialListParam.java
new file mode 100644
index 0000000..6ac1081
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialListParam.java
@@ -0,0 +1,32 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.agentstudio.AgentStudioConstants;
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.google.gson.JsonObject;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class CredentialListParam extends FlattenHalfDuplexParamBase {
+ @Default private Integer limit = null;
+ @Default private String page = null;
+ @Default private Boolean includeArchived = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ return new JsonObject();
+ }
+
+ public String toQueryString() {
+ StringBuilder sb = new StringBuilder();
+ AgentStudioConstants.appendParam(sb, "limit", limit);
+ AgentStudioConstants.appendParam(sb, "page", page);
+ AgentStudioConstants.appendParam(sb, "include_archived", includeArchived);
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialUpdateParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialUpdateParam.java
new file mode 100644
index 0000000..ccb3a02
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/CredentialUpdateParam.java
@@ -0,0 +1,36 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import java.util.Map;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class CredentialUpdateParam extends FlattenHalfDuplexParamBase {
+ @Default private JsonObject auth = null;
+ @Default private String displayName = null;
+ @Default private Map metadata = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ JsonObject body = new JsonObject();
+ if (auth != null) {
+ body.add("auth", auth);
+ }
+ if (displayName != null) {
+ body.addProperty("display_name", displayName);
+ }
+ if (metadata != null) {
+ body.add("metadata", JsonUtils.toJsonElement(metadata));
+ }
+ addExtraBody(body);
+ return body;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentCreateParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentCreateParam.java
new file mode 100644
index 0000000..d7e0303
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentCreateParam.java
@@ -0,0 +1,67 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import java.util.Map;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class EnvironmentCreateParam extends FlattenHalfDuplexParamBase {
+ @NonNull private String name;
+
+ /**
+ * Environment runtime configuration (open structure, aligned with server-side {@code
+ * JSONObject}).
+ *
+ * Known keys:
+ *
+ *
+ * - {@code type} (String) — hosting type, e.g. "cloud"
+ *
- {@code networking} (Map) — e.g. {"type": "unrestricted"}
+ *
- {@code packages} (Map<String, List<String>>) — e.g. {"pip": ["numpy"]}
+ *
+ *
+ * Example:
+ *
+ *
{@code
+ * Map config = new HashMap<>();
+ * config.put("type", "cloud");
+ * config.put("networking", Collections.singletonMap("type", "unrestricted"));
+ *
+ * Map> packages = new HashMap<>();
+ * packages.put("pip", Arrays.asList("numpy", "pandas"));
+ * config.put("packages", packages);
+ * }
+ */
+ @NonNull private Map config;
+
+ @Default private String description = null;
+ @Default private String scope = null;
+ @Default private Map metadata = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ JsonObject body = new JsonObject();
+ body.addProperty("name", name);
+ body.add("config", JsonUtils.toJsonElement(config));
+ if (description != null) {
+ body.addProperty("description", description);
+ }
+ if (scope != null) {
+ body.addProperty("scope", scope);
+ }
+ if (metadata != null && !metadata.isEmpty()) {
+ body.add("metadata", JsonUtils.toJsonElement(metadata));
+ }
+ addExtraBody(body);
+ return body;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentListParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentListParam.java
new file mode 100644
index 0000000..e94a98a
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentListParam.java
@@ -0,0 +1,32 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.agentstudio.AgentStudioConstants;
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.google.gson.JsonObject;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class EnvironmentListParam extends FlattenHalfDuplexParamBase {
+ @Default private Integer limit = null;
+ @Default private String page = null;
+ @Default private Boolean includeArchived = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ return new JsonObject();
+ }
+
+ public String toQueryString() {
+ StringBuilder sb = new StringBuilder();
+ AgentStudioConstants.appendParam(sb, "limit", limit);
+ AgentStudioConstants.appendParam(sb, "page", page);
+ AgentStudioConstants.appendParam(sb, "include_archived", includeArchived);
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentUpdateParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentUpdateParam.java
new file mode 100644
index 0000000..7079c9b
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/EnvironmentUpdateParam.java
@@ -0,0 +1,44 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import java.util.Map;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class EnvironmentUpdateParam extends FlattenHalfDuplexParamBase {
+ @Default private String name = null;
+ @Default private String description = null;
+ @Default private Map config = null;
+ @Default private String scope = null;
+ @Default private Map metadata = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ JsonObject body = new JsonObject();
+ if (name != null) {
+ body.addProperty("name", name);
+ }
+ if (description != null) {
+ body.addProperty("description", description);
+ }
+ if (config != null) {
+ body.add("config", JsonUtils.toJsonElement(config));
+ }
+ if (scope != null) {
+ body.addProperty("scope", scope);
+ }
+ if (metadata != null) {
+ body.add("metadata", JsonUtils.toJsonElement(metadata));
+ }
+ addExtraBody(body);
+ return body;
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/FileListParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/FileListParam.java
new file mode 100644
index 0000000..ed675f2
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/FileListParam.java
@@ -0,0 +1,32 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.agentstudio.AgentStudioConstants;
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.google.gson.JsonObject;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class FileListParam extends FlattenHalfDuplexParamBase {
+ @Default private Integer limit = null;
+ @Default private String page = null;
+ @Default private String scopeId = null;
+
+ @Override
+ public JsonObject getHttpBody() {
+ return new JsonObject();
+ }
+
+ public String toQueryString() {
+ StringBuilder sb = new StringBuilder();
+ AgentStudioConstants.appendParam(sb, "limit", limit);
+ AgentStudioConstants.appendParam(sb, "page", page);
+ AgentStudioConstants.appendParam(sb, "scope_id", scopeId);
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/com/alibaba/dashscope/agentstudio/param/SessionCreateParam.java b/src/main/java/com/alibaba/dashscope/agentstudio/param/SessionCreateParam.java
new file mode 100644
index 0000000..3de391d
--- /dev/null
+++ b/src/main/java/com/alibaba/dashscope/agentstudio/param/SessionCreateParam.java
@@ -0,0 +1,44 @@
+// Copyright (c) Alibaba, Inc. and its affiliates.
+package com.alibaba.dashscope.agentstudio.param;
+
+import com.alibaba.dashscope.base.FlattenHalfDuplexParamBase;
+import com.alibaba.dashscope.utils.JsonUtils;
+import com.google.gson.JsonObject;
+import java.util.List;
+import java.util.Map;
+import lombok.Builder.Default;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+@EqualsAndHashCode(callSuper = true)
+public class SessionCreateParam extends FlattenHalfDuplexParamBase {
+ @NonNull private String agent;
+ @Default private String environmentId = null;
+ @Default private String title = null;
+ @Default private List