Skip to content
Merged
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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 2025-03-04(Python 1.1.1)
- Update __init__.py to enhance the import experience
- Reduce unnecessary log output
- Optimize WebSocket reconnection logic

## 2025-02-26(Nodejs 0.1.0-alpha)
- Release Node.js implementation

## 2025-01-16(1.1.0)
- Updated the API sequence to be consistent with the documentation.
- Updated the license.
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ The **KuCoin Universal SDK** is the official SDK provided by KuCoin, offering a

## 🛠️ Installation

### Latest Version: `1.1.0`
### Latest Version: `1.1.0`(Global API version)

### Python Installation
### Python Installation(`1.1.1`)

```bash
pip install kucoin-universal-sdk
Expand All @@ -47,7 +47,7 @@ go get github.com/Kucoin/kucoin-universal-sdk/sdk/golang
go mod tidy
```

### Node.js Installation (`0.1.0-alpha`)
### Node.js Installation (`0.1.1-alpha`)
Note: This SDK is currently in the Alpha phase. We are actively iterating and improving its features, stability, and documentation. Feedback and contributions are highly encouraged to help us refine the SDK.
```bash
npm install kucoin-universal-sdk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.kucoin.universal.sdk.plugin.service.impl.OperationServiceImpl;
import com.kucoin.universal.sdk.plugin.service.impl.SchemaServiceImpl;
import com.kucoin.universal.sdk.plugin.util.SpecificationUtil;
import com.opencsv.CSVReader;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.media.Schema;
Expand All @@ -25,6 +26,7 @@

import javax.annotation.Nullable;
import java.io.File;
import java.io.FileReader;
import java.util.*;

import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
Expand All @@ -44,6 +46,10 @@ public class PythonSdkGenerator extends AbstractPythonCodegen implements NameSer
// map of codegen models
private HashMap<String, CodegenModel> codegenModelMap = new HashMap<>();

// model export(init.py)
private Set<String> exports = new LinkedHashSet<>();
private Set<String> serviceExports = new LinkedHashSet<>();

private String service;
private String subService;

Expand Down Expand Up @@ -99,7 +105,7 @@ public void processOpts() {
}
case ENTRY: {
apiTemplateFiles.put("api_entry.mustache", ".py");
supportingFiles.add(new SupportingFile("module.mustache", String.format("./%s/__init__.py", "service")));
supportingFiles.add(new SupportingFile("module_service.mustache", String.format("./%s/__init__.py", "service")));
break;
}
case TEST: {
Expand All @@ -111,8 +117,8 @@ public void processOpts() {
}

supportingFiles.add(new SupportingFile("version.mustache", "version.py"));
supportingFiles.add(new SupportingFile("module.mustache", "__init__.py"));
supportingFiles.add(new SupportingFile("module.mustache", String.format("./%s/__init__.py", service)));
supportingFiles.add(new SupportingFile("module_empty.mustache", "__init__.py"));
supportingFiles.add(new SupportingFile("module_empty.mustache", String.format("./%s/__init__.py", service)));

templateDir = "python-sdk";

Expand Down Expand Up @@ -446,6 +452,18 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo

case API:
case TEST: {
allModels.forEach(m-> {
String importName = (String)m.get("importPath");
String fileName = m.getModel().getClassFilename();
// from .model_get_part_order_book_req import GetPartOrderBookReqBuilder
exports.add(String.format("from .%s import %s", fileName, importName));
if (m.getModel().getVendorExtensions().containsKey("x-request-model")) {
exports.add(String.format("from .%s import %s", fileName, importName+"Builder"));
}
});
exports.add(String.format("from .%s import %sAPI", toApiFilename(meta.getSubService()), formatService(meta.getSubService())));


if (op.hasParams) {
modelImport.addAll(generateApiImport(meta, true));
}
Expand All @@ -459,6 +477,14 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
}
case WS:
case WS_TEST: {
allModels.forEach(m-> {
String importName = (String)m.get("importPath");
String fileName = m.getModel().getClassFilename();
// from .model_get_part_order_book_req import GetPartOrderBookReqBuilder
exports.add(String.format("from .%s import %s", fileName, importName));
});
exports.add(String.format("from .%s import %sWS", toApiFilename(meta.getSubService()), formatService(meta.getSubService())));

modelImport.addAll(generateApiImport(meta, false));
break;
}
Expand Down Expand Up @@ -719,6 +745,46 @@ private ModelsMap postProcessModelsMap(ModelsMap objs) {
return objs;
}


@Override
public Map<String, Object> postProcessSupportingFileData(Map<String, Object> objs) {
Map<String, Object> data = super.postProcessSupportingFileData(objs);
data.put("exports", exports);

if (!modeSwitch.isEntry()) {
return data;
}

String csvPath = (String) additionalProperties.get("CSV_PATH");
if (csvPath == null) {
log.error("no csv path found");
return data;
}

String apiCsvFile = csvPath + "/apis.csv";

Set<String> services = new TreeSet<>();
try {

CSVReader reader = new CSVReader(new FileReader(apiCsvFile));
List<String[]> rows = reader.readAll();
for (int i = 1; i < rows.size(); i++) {
services.add(rows.get(i)[0].toLowerCase());
}
} catch (Exception e) {
throw new RuntimeException("read csv fail", e);
}

services.forEach(s-> {
Map<String,String> specialKeywords = Map.of("copytrading", "CopyTrading", "viplending", "VIPLending");
String service = formatService(specialKeywords.getOrDefault(s, s));
serviceExports.add(String.format("from .%s_api import %sService", s, service));
});
data.put("serviceExports", serviceExports);

return data;
}

private PythonType getPydanticType(CodegenProperty cp,
Set<String> modelImports,
Set<String> exampleImports,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{{#exports}}
{{{.}}}
{{/exports}}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{{#serviceExports}}
{{{.}}}
{{/serviceExports}}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

public class SdkGeneratorTest {

private static final String SDK_NAME = "node-sdk";
private static final String SPEC_NAME = "../../spec/rest/api/openapi-spot-market.json";
private static final String SPEC_ENTRY_NAME = "../../spec/rest/entry/openapi-spot.json";
private static final String SDK_NAME = "python-sdk";
private static final String SPEC_NAME = "../../spec/rest/api/openapi-account-subaccount.json";
private static final String SPEC_ENTRY_NAME = "../../spec/rest/entry/openapi-account.json";
private static final String WS_SPEC_NAME = "../../spec/ws/openapi-spot-public.json";
private static final String OUTPUT_DIR = "./out";
private static final String CSV_PATH = "../../spec";
Expand Down
8 changes: 8 additions & 0 deletions sdk/python/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 2025-03-04(Python 1.1.1)
- Update __init__.py to enhance the import experience
- Reduce unnecessary log output
- Optimize WebSocket reconnection logic

## 2025-02-26(Nodejs 0.1.0-alpha)
- Release Node.js implementation

## 2025-01-16(1.1.0)
- Updated the API sequence to be consistent with the documentation.
- Updated the license.
Expand Down
12 changes: 6 additions & 6 deletions sdk/python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ For an overview of the project and SDKs in other languages, refer to the [Main R

## 📦 Installation

### Latest Version: `1.1.0`
### Latest Version: `1.1.1`
Install the Python SDK using `pip`:

```bash
Expand All @@ -23,12 +23,12 @@ Here's a quick example to get you started with the SDK in **Python**.
import logging
import os

from kucoin_universal_sdk.api.client import DefaultClient
from kucoin_universal_sdk.generate.spot.market.model_get_part_order_book_req import GetPartOrderBookReqBuilder
from kucoin_universal_sdk.model.client_option import ClientOptionBuilder
from kucoin_universal_sdk.model.constants import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
from kucoin_universal_sdk.api import DefaultClient
from kucoin_universal_sdk.generate.spot.market import GetPartOrderBookReqBuilder
from kucoin_universal_sdk.model import ClientOptionBuilder
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
GLOBAL_BROKER_API_ENDPOINT
from kucoin_universal_sdk.model.transport_option import TransportOptionBuilder
from kucoin_universal_sdk.model import TransportOptionBuilder


def example():
Expand Down
25 changes: 12 additions & 13 deletions sdk/python/example/example_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,19 @@
import uuid
from datetime import datetime, timedelta

from kucoin_universal_sdk.api.client import DefaultClient
from kucoin_universal_sdk.generate.account.fee.model_get_spot_actual_fee_req import GetSpotActualFeeReqBuilder
from kucoin_universal_sdk.generate.futures.market.model_get_klines_req import GetKlinesReqBuilder, GetKlinesReq
from kucoin_universal_sdk.generate.service.account_api import AccountService
from kucoin_universal_sdk.generate.service.futures_api import FuturesService
from kucoin_universal_sdk.generate.service.spot_api import SpotService
from kucoin_universal_sdk.generate.spot.order.model_add_order_sync_req import AddOrderSyncReqBuilder, AddOrderSyncReq
from kucoin_universal_sdk.generate.spot.order.model_cancel_order_by_order_id_sync_req import \
CancelOrderByOrderIdSyncReqBuilder
from kucoin_universal_sdk.generate.spot.order.model_get_order_by_order_id_req import GetOrderByOrderIdReqBuilder
from kucoin_universal_sdk.model.client_option import ClientOptionBuilder
from kucoin_universal_sdk.model.constants import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
from kucoin_universal_sdk.api import DefaultClient
from kucoin_universal_sdk.generate.account.fee import GetSpotActualFeeReqBuilder
from kucoin_universal_sdk.generate.futures.market import GetKlinesReqBuilder, GetKlinesReq
from kucoin_universal_sdk.generate.service import AccountService
from kucoin_universal_sdk.generate.service import FuturesService
from kucoin_universal_sdk.generate.service import SpotService
from kucoin_universal_sdk.generate.spot.order import AddOrderSyncReqBuilder, AddOrderSyncReq
from kucoin_universal_sdk.generate.spot.order import CancelOrderByOrderIdSyncReqBuilder
from kucoin_universal_sdk.generate.spot.order import GetOrderByOrderIdReqBuilder
from kucoin_universal_sdk.model import ClientOptionBuilder
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
GLOBAL_BROKER_API_ENDPOINT
from kucoin_universal_sdk.model.transport_option import TransportOptionBuilder
from kucoin_universal_sdk.model import TransportOptionBuilder


def rest_example():
Expand Down
53 changes: 24 additions & 29 deletions sdk/python/example/example_arbitrage_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,40 +16,35 @@
from datetime import datetime, timedelta
from enum import Enum

from kucoin_universal_sdk.api.client import DefaultClient
from kucoin_universal_sdk.generate.account.account.model_get_cross_margin_account_req import \
GetCrossMarginAccountReqBuilder, GetCrossMarginAccountReq
from kucoin_universal_sdk.generate.account.account.model_get_futures_account_req import GetFuturesAccountReqBuilder
from kucoin_universal_sdk.generate.account.account.model_get_spot_account_list_req import GetSpotAccountListReqBuilder, \
GetSpotAccountListReq
from kucoin_universal_sdk.generate.futures.fundingfees.model_get_current_funding_rate_req import \
GetCurrentFundingRateReqBuilder
from kucoin_universal_sdk.generate.futures.market.model_get_symbol_req import GetSymbolReqBuilder
from kucoin_universal_sdk.generate.futures.order.model_add_order_req import AddOrderReqBuilder, AddOrderReq
from kucoin_universal_sdk.generate.futures.order.model_cancel_order_by_id_req import CancelOrderByIdReqBuilder
from kucoin_universal_sdk.generate.futures.order.model_get_order_by_order_id_req import \
from kucoin_universal_sdk.api import DefaultClient
from kucoin_universal_sdk.generate.account.account import GetCrossMarginAccountReqBuilder, GetCrossMarginAccountReq
from kucoin_universal_sdk.generate.account.account import GetFuturesAccountReqBuilder
from kucoin_universal_sdk.generate.account.account import GetSpotAccountListReqBuilder, GetSpotAccountListReq
from kucoin_universal_sdk.generate.futures.fundingfees import GetCurrentFundingRateReqBuilder
from kucoin_universal_sdk.generate.futures.market import GetSymbolReqBuilder
from kucoin_universal_sdk.generate.futures.order import AddOrderReqBuilder, AddOrderReq
from kucoin_universal_sdk.generate.futures.order import CancelOrderByIdReqBuilder
from kucoin_universal_sdk.generate.futures.order import \
GetOrderByOrderIdReqBuilder as FuturesGetOrderByOrderIdReqBuilder
from kucoin_universal_sdk.generate.futures.order.model_get_order_by_order_id_resp import GetOrderByOrderIdResp
from kucoin_universal_sdk.generate.margin.order.model_add_order_req import \
from kucoin_universal_sdk.generate.futures.order import GetOrderByOrderIdResp
from kucoin_universal_sdk.generate.margin.order import \
AddOrderReqBuilder as MarginAddOrderReqBuilder, AddOrderReq as MarginAddOrderReq
from kucoin_universal_sdk.generate.margin.order.model_cancel_order_by_order_id_req import CancelOrderByOrderIdReqBuilder
from kucoin_universal_sdk.generate.margin.order.model_get_order_by_order_id_req import \
from kucoin_universal_sdk.generate.margin.order import CancelOrderByOrderIdReqBuilder
from kucoin_universal_sdk.generate.margin.order import \
GetOrderByOrderIdReqBuilder as MarginGetOrderByOrderIdReqBuilder
from kucoin_universal_sdk.generate.service.account_api import AccountService
from kucoin_universal_sdk.generate.service.futures_api import FuturesService
from kucoin_universal_sdk.generate.service.margin_api import MarginService
from kucoin_universal_sdk.generate.service.spot_api import SpotService
from kucoin_universal_sdk.generate.spot.market.model_get_ticker_req import GetTickerReqBuilder
from kucoin_universal_sdk.generate.spot.order.model_add_order_sync_req import AddOrderSyncReqBuilder, AddOrderSyncReq
from kucoin_universal_sdk.generate.spot.order.model_cancel_order_by_order_id_sync_req import \
CancelOrderByOrderIdSyncReqBuilder
from kucoin_universal_sdk.generate.spot.order.model_cancel_order_by_order_id_sync_resp import \
CancelOrderByOrderIdSyncResp
from kucoin_universal_sdk.generate.service import AccountService
from kucoin_universal_sdk.generate.service import FuturesService
from kucoin_universal_sdk.generate.service import MarginService
from kucoin_universal_sdk.generate.service import SpotService
from kucoin_universal_sdk.generate.spot.market import GetTickerReqBuilder
from kucoin_universal_sdk.generate.spot.order import AddOrderSyncReqBuilder, AddOrderSyncReq
from kucoin_universal_sdk.generate.spot.order import CancelOrderByOrderIdSyncReqBuilder
from kucoin_universal_sdk.generate.spot.order import CancelOrderByOrderIdSyncResp
from kucoin_universal_sdk.generate.spot.order.model_get_order_by_order_id_req import GetOrderByOrderIdReqBuilder
from kucoin_universal_sdk.model.client_option import ClientOptionBuilder
from kucoin_universal_sdk.model.constants import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
from kucoin_universal_sdk.model import ClientOptionBuilder
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
GLOBAL_BROKER_API_ENDPOINT
from kucoin_universal_sdk.model.transport_option import TransportOptionBuilder
from kucoin_universal_sdk.model import TransportOptionBuilder

SPOT_SYMBOL = "DOGE-USDT"
FUTURES_SYMBOL = "DOGEUSDTM"
Expand Down
10 changes: 5 additions & 5 deletions sdk/python/example/example_get_started.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import logging
import os

from kucoin_universal_sdk.api.client import DefaultClient
from kucoin_universal_sdk.generate.spot.market.model_get_part_order_book_req import GetPartOrderBookReqBuilder
from kucoin_universal_sdk.model.client_option import ClientOptionBuilder
from kucoin_universal_sdk.model.constants import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
from kucoin_universal_sdk.api import DefaultClient
from kucoin_universal_sdk.generate.spot.market import GetPartOrderBookReqBuilder
from kucoin_universal_sdk.model import ClientOptionBuilder
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
GLOBAL_BROKER_API_ENDPOINT
from kucoin_universal_sdk.model.transport_option import TransportOptionBuilder
from kucoin_universal_sdk.model import TransportOptionBuilder


def example():
Expand Down
29 changes: 14 additions & 15 deletions sdk/python/example/example_ma_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,22 @@
from datetime import datetime
from enum import Enum

from kucoin_universal_sdk.api.client import DefaultClient
from kucoin_universal_sdk.generate.account.account.api_account import AccountAPI
from kucoin_universal_sdk.generate.account.account.model_get_spot_account_list_req import GetSpotAccountListReqBuilder, \
from kucoin_universal_sdk.api import DefaultClient
from kucoin_universal_sdk.generate.account.account import AccountAPI
from kucoin_universal_sdk.generate.account.account import GetSpotAccountListReqBuilder, \
GetSpotAccountListReq
from kucoin_universal_sdk.generate.spot.market.api_market import MarketAPI
from kucoin_universal_sdk.generate.spot.market.model_get24hr_stats_req import Get24hrStatsReqBuilder
from kucoin_universal_sdk.generate.spot.market.model_get_klines_req import GetKlinesReqBuilder, GetKlinesReq
from kucoin_universal_sdk.generate.spot.order.api_order import OrderAPI
from kucoin_universal_sdk.generate.spot.order.model_add_order_sync_req import AddOrderSyncReqBuilder, AddOrderSyncReq
from kucoin_universal_sdk.generate.spot.order.model_cancel_all_orders_by_symbol_req import \
CancelAllOrdersBySymbolReqBuilder
from kucoin_universal_sdk.generate.spot.order.model_get_open_orders_req import GetOpenOrdersReqBuilder
from kucoin_universal_sdk.generate.spot.order.model_set_dcp_req import SetDcpReqBuilder
from kucoin_universal_sdk.model.client_option import ClientOptionBuilder
from kucoin_universal_sdk.model.constants import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
from kucoin_universal_sdk.generate.spot.market import Get24hrStatsReqBuilder
from kucoin_universal_sdk.generate.spot.market import GetKlinesReqBuilder, GetKlinesReq
from kucoin_universal_sdk.generate.spot.market import MarketAPI
from kucoin_universal_sdk.generate.spot.order import AddOrderSyncReqBuilder, AddOrderSyncReq
from kucoin_universal_sdk.generate.spot.order import CancelAllOrdersBySymbolReqBuilder
from kucoin_universal_sdk.generate.spot.order import GetOpenOrdersReqBuilder
from kucoin_universal_sdk.generate.spot.order import OrderAPI
from kucoin_universal_sdk.generate.spot.order import SetDcpReqBuilder
from kucoin_universal_sdk.model import ClientOptionBuilder
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
GLOBAL_BROKER_API_ENDPOINT
from kucoin_universal_sdk.model.transport_option import TransportOptionBuilder
from kucoin_universal_sdk.model import TransportOptionBuilder


class Action(Enum):
Expand Down
Loading
Loading