本文为您介绍大模型应用防火墙 C++ SDK 的安装方式和代码示例,帮助您快速了解如何使用 SDK 调用 OpenAPI。
安装 gcc 或其他 C 语言编译器。执行gcc --version
可以检查当前 gcc 的版本信息。
代码示例中使用了libcurl
、json-c
、openssl
等依赖库,您需要安装这些库及其开发包。以Debian/Ubuntu 系统为例,您可以使用如下命令安装:
libcurl
用于发起 HTTP 请求,安装命令如下:
sudo apt install libcurl4-openssl-dev
为确保兼容性,您需要根据目标运行环境编译静态库。
获取头文件和源文件。
头文件api_request.h
的具体内容如下:
#ifndef API_REQUEST_H #define API_REQUEST_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> #include <json-c/json.h> #include <openssl/sha.h> #include <openssl/hmac.h> #define MAX_LEN 40960 #define DATE_FORMAT "%Y%m%dT%H%M%SZ" // 定义常量,实际使用时请替换为真实值 extern const char *AccessKeyID; extern const char *SecretAccessKey; extern const char *Region; extern const char *Service; extern const char *Endpoint; extern const char *Action; extern const char *Version; extern const char *Content; // 回调函数,用于处理请求头 size_t request_header_callback(void *ptr, size_t size, size_t nmemb, void *userdata); // 回调函数,用于处理请求体 size_t request_body_callback(void *ptr, size_t size, size_t nmemb, void *userdata); // 回调函数,用于处理响应头 size_t response_header_callback(void *ptr, size_t size, size_t nmemb, void *userdata); // 回调函数,用于处理响应体 size_t response_body_callback(void *ptr, size_t size, size_t nmemb, void *userdata); // HMAC - SHA256计算 unsigned char *hmacSHA256(const unsigned char *key, size_t key_len, const unsigned char *content, size_t content_len); // 获取签名密钥 unsigned char *getSignedKey(const char *secretKey, const char *date, const char *region, const char *service); // SHA256哈希计算 char *hashSHA256(const unsigned char *content, size_t len); // 构建规范字符串 void buildCanonicalString(const char *method, const char *queryString, const char *host, const char *date, const char *payload, char *canonicalString); // 构建签名字符串 void buildSignString(const char *date, const char *authDate, const char *hashedCanonicalString, char *signString); // 构建认证请求头 void buildAuthorization(const char *authDate, const char *signString, char *authorization); // 构建请求体JSON字符串 void buildCheckLLMPromptBody(const char *content, int contentType, const char *host, int msgClass, const char *region, char *requestBody); // 构建请求体JSON字符串 void buildQueryLLMGenerateBody(const char *msgid, int useStream , char *requestBody); // 执行curl请求 int performCurlRequest(CURL *curl, const char *url, const char *requestBody, struct curl_slist *headers); // 初始化curl相关设置 CURL *initCurl(); // 构建请求地址 void buildRequestAddress(const char *endpoint, const char *queryString, char *requestAddr, size_t size); // 构建查询字符串 void buildQueryString(const char *action, const char *version, char *queryString, size_t size); // 构建签名相关材料 void buildSignatureMaterials(char *date, char *authDate, const char *requestBody, char *payload, size_t payloadSize); #endif
使用以下命令编译成libapi_request.a
静态库:
gcc -c api_request.c -o api_request.o -lcurl -ljson-c -lssl -lcrypto ar rcs libapi_request.a api_request.o
以下提供调用CheckLLMPrompt
判别大模型提示词是否合规的示例代码,实际使用时,您可以替换成 SDK 中已经支持的任意接口。CheckLLMPrompt
相关参数的详细说明,可参考CheckLLMPrompt - 判别大模型提示词是否合规。
#include "api_request.h" // 定义常量,实际使用时请替换为真实值 const char *AccessKeyID = "Your AK"; const char *SecretAccessKey = "Your SK"; const char *Region = "cn-beijing"; const char *Service = "waf"; const char *Endpoint = "open.volcengineapi.com"; const char *Action = "CheckLLMPrompt"; const char *Version = "2023-12-25"; const char *Content = "请输入您想要校验的内容,文本内容或资源URL"; int main() { CURL *curl; CURLcode res; struct curl_slist *headers = NULL; char queryString[MAX_LEN] = {0}; char requestAddr[MAX_LEN] = {0}; char date[64] = {0}; char authDate[9] = {0}; char payload[MAX_LEN] = {0}; char canonicalString[MAX_LEN * 2] = {0}; char hashedCanonicalString[MAX_LEN] = {0}; char signString[MAX_LEN * 2] = {0}; char authorization[MAX_LEN] = {0}; char requestBody[MAX_LEN] = {0}; char x_date_header[MAX_LEN] = {0}; char x_content_sha256_header[MAX_LEN] = {0}; // 构建签名材料 time_t now = time(NULL); struct tm *tm_info = gmtime(&now); if (strftime(date, sizeof(date), DATE_FORMAT, tm_info) == 0) { fprintf(stderr, "Failed to format date\n"); return 1; } strncpy(authDate, date, 8); authDate[8] = '\0'; // 构建请求体 buildRequestBody(Content, 1, "example.com", 0, Region, requestBody); // 构建查询字符串 buildQueryString(Action, Version, queryString, MAX_LEN); // 构建请求地址 buildRequestAddress(Endpoint, queryString, requestAddr, MAX_LEN); // 构建签名相关材料 buildSignatureMaterials(date, authDate, requestBody, payload, MAX_LEN); // 构建规范字符串 buildCanonicalString("POST", queryString, Endpoint, date, payload, canonicalString); strcpy(hashedCanonicalString, hashSHA256((const unsigned char *)canonicalString, strlen(canonicalString))); // 构建签名字符串 buildSignString(date, authDate, hashedCanonicalString, signString); // 构建认证请求头 buildAuthorization(authDate, signString, authorization); // 初始化libcurl curl = initCurl(); if (curl) { // 设置请求头 headers = curl_slist_append(headers, "Content-Type: application/json"); if (snprintf(x_date_header, MAX_LEN, "X-Date: %s", date) >= MAX_LEN) { fprintf(stderr, "x_date_header buffer overflow\n"); curl_slist_free_all(headers); curl_easy_cleanup(curl); return 1; } headers = curl_slist_append(headers, x_date_header); if (snprintf(x_content_sha256_header, MAX_LEN, "X-Content-Sha256: %s", payload) >= MAX_LEN) { fprintf(stderr, "x_content_sha256_header buffer overflow\n"); curl_slist_free_all(headers); curl_easy_cleanup(curl); return 1; } headers = curl_slist_append(headers, x_content_sha256_header); char Authorization[4096] = {0}; sprintf(Authorization, "Authorization: %s", authorization); headers = curl_slist_append(headers, Authorization); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 执行请求 res = performCurlRequest(curl, requestAddr, requestBody, headers); // 清理请求头列表 curl_slist_free_all(headers); // 清理libcurl句柄 curl_easy_cleanup(curl); } return 0; }