{"repo": "atlas-f/aismart", "files": {"dpskUbuntu.md": {"1dec343eb23bbdf74facfe8c18c548454ec35cea": {"t": 1785746375.565638, "n": 5352, "h": "b901a5b0a49549b8", "c": "下面是一个使用C语言调用DeepSeek API的示例程序,使用libcurl库发送HTTP请求并处理JSON响应:\r\n\r\n```c\r\n#include \r\n#include \r\n#include \r\n#include \r\n#include \r\n\r\n// 用于存储HTTP响应数据的结构体\r\nstruct MemoryStruct {\r\n char *memory;\r\n size_t size;\r\n};\r\n\r\n// libcurl回调函数,用于写入响应数据\r\nstatic size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {\r\n size_t realsize = size * nmemb;\r\n struct MemoryStruct *mem = (struct MemoryStruct *)userp;\r\n\r\n char *ptr = realloc(mem->memory, mem->size + realsize + 1);\r\n if(!ptr) {\r\n printf(\"内存分配错误\\n\");\r\n return 0;\r\n }\r\n\r\n mem->memory = ptr;\r\n memcpy(&(mem->memory[mem->size]), contents, realsize);\r\n mem->size += realsize;\r\n mem->memory[mem->size] = 0;\r\n\r\n return realsize;\r\n}\r\n\r\n// 调用DeepSeek API函数\r\nchar* call_deepseek(const char *api_key, const char *prompt) {\r\n CURL *curl;\r\n CURLcode res;\r\n struct MemoryStruct chunk;\r\n chunk.memory = malloc(1);\r\n chunk.size = 0;\r\n\r\n curl_global_init(CURL_GLOBAL_DEFAULT);\r\n curl = curl_easy_init();\r\n\r\n if(curl) {\r\n // 设置API端点\r\n curl_easy_setopt(curl, CURLOPT_URL, \"https://api.deepseek.com/v1/chat/completions\");\r\n \r\n // 设置请求头\r\n struct curl_slist *headers = NULL;\r\n headers = curl_slist_append(headers, \"Content-Type: application/json\");\r\n char auth_header[256];\r\n snprintf(auth_header, sizeof(auth_header), \"Authorization: Bearer %s\", api_key);\r\n headers = curl_slist_append(headers, auth_header);\r\n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\r\n \r\n // 构建请求体\r\n cJSON *root = cJSON_CreateObject();\r\n cJSON_AddStringToObject(root, \"model\", \"deepseek-chat\");\r\n \r\n cJSON *messages = cJSON_CreateArray();\r\n cJSON *message = cJSON_CreateObject();\r\n cJSON_AddStringToObject(message, \"role\", \"user\");\r\n cJSON_AddStringToObject(message, \"content\", prompt);\r\n cJSON_AddItemToArray(messages, message);\r\n \r\n cJSON_AddItemToObject(root, \"messages\", messages);\r\n char *post_data = cJSON_PrintUnformatted(root);\r\n \r\n // 设置POST数据\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(post_data));\r\n \r\n // 设置响应回调\r\n curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);\r\n curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);\r\n \r\n // 执行请求\r\n res = curl_easy_perform(curl);\r\n \r\n // 清理\r\n curl_easy_cleanup(curl);\r\n curl_slist_free_all(headers);\r\n cJSON_Delete(root);\r\n free(post_data);\r\n \r\n if(res != CURLE_OK) {\r\n fprintf(stderr, \"请求失败: %s\\n\", curl_easy_strerror(res));\r\n return NULL;\r\n }\r\n }\r\n \r\n curl_global_cleanup();\r\n \r\n // 解析API响应\r\n cJSON *response_json = cJSON_Parse(chunk.memory);\r\n if(!response_json) {\r\n const char *error_ptr = cJSON_GetErrorPtr();\r\n if(error_ptr) fprintf(stderr, \"JSON解析错误: %s\\n\", error_ptr);\r\n free(chunk.memory);\r\n return NULL;\r\n }\r\n \r\n // 提取响应内容\r\n cJSON *choices = cJSON_GetObjectItemCaseSensitive(response_json, \"choices\");\r\n if(cJSON_IsArray(choices) && cJSON_GetArraySize(choices) > 0) {\r\n cJSON *first_choice = cJSON_GetArrayItem(choices, 0);\r\n cJSON *message = cJSON_GetObjectItemCaseSensitive(first_choice, \"message\");\r\n cJSON *content = cJSON_GetObjectItemCaseSensitive(message, \"content\");\r\n \r\n if(cJSON_IsString(content) && content->valuestring != NULL) {\r\n char *result = strdup(content->valuestring);\r\n cJSON_Delete(response_json);\r\n free(chunk.memory);\r\n return result;\r\n }\r\n }\r\n \r\n cJSON_Delete(response_json);\r\n free(chunk.memory);\r\n return NULL;\r\n}\r\n\r\nint main() {\r\n // 替换为你的DeepSeek API密钥\r\n const char *api_key = \"你的API密钥\";\r\n \r\n printf(\"DeepSeek聊天客户端 (输入'exit'退出)\\n\");\r\n \r\n while(1) {\r\n printf(\"\\n你的问题: \");\r\n char input[1024];\r\n fgets(input, sizeof(input), stdin);\r\n \r\n // 移除换行符\r\n input[strcspn(input, \"\\n\")] = 0;\r\n \r\n if(strcmp(input, \"exit\") == 0) break;\r\n if(strlen(input) == 0) continue;\r\n \r\n char *response = call_deepseek(api_key, input);\r\n if(response) {\r\n printf(\"\\nDeepSeek回复:\\n%s\\n\", response);\r\n free(response);\r\n } else {\r\n printf(\"获取回复时出错\\n\");\r\n }\r\n }\r\n \r\n return 0;\r\n}\r\n```\r\n\r\n### 使用说明:\r\n\r\n1. **安装依赖库**:\r\n ```bash\r\n sudo apt-get install libcurl4-openssl-dev libcjson-dev\r\n ```\r\n\r\n2. **编译程序**:\r\n ```bash\r\n gcc deepseek_client.c -o deepseek_client -lcurl -lcjson\r\n ```\r\n\r\n3. **运行程序**:\r\n ```bash\r\n ./deepseek_client\r\n ```\r\n\r\n4. **使用说明**:\r\n - 将`你的API密钥`替换为实际的DeepSeek API密钥\r\n - 在提示符下输入问题或对话内容\r\n - 输入`exit`退出程序\r\n\r\n### 程序功能:\r\n\r\n1. 通过DeepSeek API进行文本交互\r\n2. 支持多轮对话\r\n3. 使用cJSON解析JSON响应\r\n4. 使用libcurl处理HTTP请求\r\n\r\n### 重要注意事项:\r\n\r\n1. **API密钥**:需要从DeepSeek官网获取有效API密钥\r\n2. **错误处理**:程序包含基本错误处理,但实际应用中可能需要增强\r\n3. **安全性**:API密钥以明文形式存储在代码中,生产环境应使用更安全的方式\r\n\r\n### 依赖库说明:\r\n\r\n- **libcurl**:用于处理HTTP请求\r\n- **libcjson**:用于解析和生成JSON数据\r\n\r\n这个程序提供了一个基本的命令行界面,可以与DeepSeek模型进行交互。程序会持续运行直到用户输入\"exit\"。"}, "441d094d06760ad4fb6ef81c4e263f1195d1f562": {"t": 1785763069.1970787, "n": 5352, "h": "b901a5b0a49549b8", "c": "下面是一个使用C语言调用DeepSeek API的示例程序,使用libcurl库发送HTTP请求并处理JSON响应:\r\n\r\n```c\r\n#include \r\n#include \r\n#include \r\n#include \r\n#include \r\n\r\n// 用于存储HTTP响应数据的结构体\r\nstruct MemoryStruct {\r\n char *memory;\r\n size_t size;\r\n};\r\n\r\n// libcurl回调函数,用于写入响应数据\r\nstatic size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {\r\n size_t realsize = size * nmemb;\r\n struct MemoryStruct *mem = (struct MemoryStruct *)userp;\r\n\r\n char *ptr = realloc(mem->memory, mem->size + realsize + 1);\r\n if(!ptr) {\r\n printf(\"内存分配错误\\n\");\r\n return 0;\r\n }\r\n\r\n mem->memory = ptr;\r\n memcpy(&(mem->memory[mem->size]), contents, realsize);\r\n mem->size += realsize;\r\n mem->memory[mem->size] = 0;\r\n\r\n return realsize;\r\n}\r\n\r\n// 调用DeepSeek API函数\r\nchar* call_deepseek(const char *api_key, const char *prompt) {\r\n CURL *curl;\r\n CURLcode res;\r\n struct MemoryStruct chunk;\r\n chunk.memory = malloc(1);\r\n chunk.size = 0;\r\n\r\n curl_global_init(CURL_GLOBAL_DEFAULT);\r\n curl = curl_easy_init();\r\n\r\n if(curl) {\r\n // 设置API端点\r\n curl_easy_setopt(curl, CURLOPT_URL, \"https://api.deepseek.com/v1/chat/completions\");\r\n \r\n // 设置请求头\r\n struct curl_slist *headers = NULL;\r\n headers = curl_slist_append(headers, \"Content-Type: application/json\");\r\n char auth_header[256];\r\n snprintf(auth_header, sizeof(auth_header), \"Authorization: Bearer %s\", api_key);\r\n headers = curl_slist_append(headers, auth_header);\r\n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\r\n \r\n // 构建请求体\r\n cJSON *root = cJSON_CreateObject();\r\n cJSON_AddStringToObject(root, \"model\", \"deepseek-chat\");\r\n \r\n cJSON *messages = cJSON_CreateArray();\r\n cJSON *message = cJSON_CreateObject();\r\n cJSON_AddStringToObject(message, \"role\", \"user\");\r\n cJSON_AddStringToObject(message, \"content\", prompt);\r\n cJSON_AddItemToArray(messages, message);\r\n \r\n cJSON_AddItemToObject(root, \"messages\", messages);\r\n char *post_data = cJSON_PrintUnformatted(root);\r\n \r\n // 设置POST数据\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(post_data));\r\n \r\n // 设置响应回调\r\n curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);\r\n curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);\r\n \r\n // 执行请求\r\n res = curl_easy_perform(curl);\r\n \r\n // 清理\r\n curl_easy_cleanup(curl);\r\n curl_slist_free_all(headers);\r\n cJSON_Delete(root);\r\n free(post_data);\r\n \r\n if(res != CURLE_OK) {\r\n fprintf(stderr, \"请求失败: %s\\n\", curl_easy_strerror(res));\r\n return NULL;\r\n }\r\n }\r\n \r\n curl_global_cleanup();\r\n \r\n // 解析API响应\r\n cJSON *response_json = cJSON_Parse(chunk.memory);\r\n if(!response_json) {\r\n const char *error_ptr = cJSON_GetErrorPtr();\r\n if(error_ptr) fprintf(stderr, \"JSON解析错误: %s\\n\", error_ptr);\r\n free(chunk.memory);\r\n return NULL;\r\n }\r\n \r\n // 提取响应内容\r\n cJSON *choices = cJSON_GetObjectItemCaseSensitive(response_json, \"choices\");\r\n if(cJSON_IsArray(choices) && cJSON_GetArraySize(choices) > 0) {\r\n cJSON *first_choice = cJSON_GetArrayItem(choices, 0);\r\n cJSON *message = cJSON_GetObjectItemCaseSensitive(first_choice, \"message\");\r\n cJSON *content = cJSON_GetObjectItemCaseSensitive(message, \"content\");\r\n \r\n if(cJSON_IsString(content) && content->valuestring != NULL) {\r\n char *result = strdup(content->valuestring);\r\n cJSON_Delete(response_json);\r\n free(chunk.memory);\r\n return result;\r\n }\r\n }\r\n \r\n cJSON_Delete(response_json);\r\n free(chunk.memory);\r\n return NULL;\r\n}\r\n\r\nint main() {\r\n // 替换为你的DeepSeek API密钥\r\n const char *api_key = \"你的API密钥\";\r\n \r\n printf(\"DeepSeek聊天客户端 (输入'exit'退出)\\n\");\r\n \r\n while(1) {\r\n printf(\"\\n你的问题: \");\r\n char input[1024];\r\n fgets(input, sizeof(input), stdin);\r\n \r\n // 移除换行符\r\n input[strcspn(input, \"\\n\")] = 0;\r\n \r\n if(strcmp(input, \"exit\") == 0) break;\r\n if(strlen(input) == 0) continue;\r\n \r\n char *response = call_deepseek(api_key, input);\r\n if(response) {\r\n printf(\"\\nDeepSeek回复:\\n%s\\n\", response);\r\n free(response);\r\n } else {\r\n printf(\"获取回复时出错\\n\");\r\n }\r\n }\r\n \r\n return 0;\r\n}\r\n```\r\n\r\n### 使用说明:\r\n\r\n1. **安装依赖库**:\r\n ```bash\r\n sudo apt-get install libcurl4-openssl-dev libcjson-dev\r\n ```\r\n\r\n2. **编译程序**:\r\n ```bash\r\n gcc deepseek_client.c -o deepseek_client -lcurl -lcjson\r\n ```\r\n\r\n3. **运行程序**:\r\n ```bash\r\n ./deepseek_client\r\n ```\r\n\r\n4. **使用说明**:\r\n - 将`你的API密钥`替换为实际的DeepSeek API密钥\r\n - 在提示符下输入问题或对话内容\r\n - 输入`exit`退出程序\r\n\r\n### 程序功能:\r\n\r\n1. 通过DeepSeek API进行文本交互\r\n2. 支持多轮对话\r\n3. 使用cJSON解析JSON响应\r\n4. 使用libcurl处理HTTP请求\r\n\r\n### 重要注意事项:\r\n\r\n1. **API密钥**:需要从DeepSeek官网获取有效API密钥\r\n2. **错误处理**:程序包含基本错误处理,但实际应用中可能需要增强\r\n3. **安全性**:API密钥以明文形式存储在代码中,生产环境应使用更安全的方式\r\n\r\n### 依赖库说明:\r\n\r\n- **libcurl**:用于处理HTTP请求\r\n- **libcjson**:用于解析和生成JSON数据\r\n\r\n这个程序提供了一个基本的命令行界面,可以与DeepSeek模型进行交互。程序会持续运行直到用户输入\"exit\"。"}}, "Armfb-lvgl/depskmainCopy.c": {"1dec343eb23bbdf74facfe8c18c548454ec35cea": {"t": 1785746530.3437688, "n": 12021, "h": "efa1326c70948382", "c": "#include \r\n#include \r\n#include \r\n#include \r\n#include \"cJSON.h\"\r\n\r\n\r\n\r\n// 使用缓冲区输入输出是没问题的,需要解决循环的问题,\r\nchar textbuf[128] = \"who are you\";\r\nchar dpOut[128] = {0};\r\n\r\n// ================== 前置声明 ==================\r\nstruct MemoryStruct;\r\nstruct APIResponse;\r\nchar* get_api_key();\r\nstruct APIResponse call_deepseek(const char *api_key, const char *prompt);\r\nvoid print_token_usage(int prompt_tokens, int completion_tokens, int total_tokens);\r\n\r\n// ================== 数据结构定义 ==================\r\n// 存储HTTP响应\r\nstruct MemoryStruct {\r\n char *memory;\r\n size_t size;\r\n};\r\n\r\n// 存储API响应内容\r\nstruct APIResponse {\r\n char *content;\r\n int prompt_tokens;\r\n int completion_tokens;\r\n int total_tokens;\r\n};\r\n\r\n// 会话上下文\r\ntypedef struct {\r\n char *api_key;\r\n int total_prompt_tokens;\r\n int total_completion_tokens;\r\n int total_all_tokens;\r\n} DeepSeekSession;\r\n\r\n// ================== 辅助函数 ==================\r\n// libcurl回调函数\r\nstatic size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {\r\n size_t realsize = size * nmemb;\r\n struct MemoryStruct *mem = (struct MemoryStruct *)userp;\r\n\r\n char *ptr = realloc(mem->memory, mem->size + realsize + 1);\r\n if(!ptr) {\r\n fprintf(stderr, \"内存分配错误\\n\");\r\n return 0;\r\n }\r\n\r\n mem->memory = ptr;\r\n memcpy(&(mem->memory[mem->size]), contents, realsize);\r\n mem->size += realsize;\r\n mem->memory[mem->size] = 0;\r\n\r\n return realsize;\r\n}\r\n\r\n// 获取API密钥\r\nchar* get_api_key() {\r\n char *api_key = getenv(\"DEEPSEEK_API_KEY\");\r\n if (api_key && strlen(api_key) > 0) {\r\n return strdup(api_key);\r\n }\r\n \r\n printf(\"未找到环境变量 DEEPSEEK_API_KEY\\n\");\r\n printf(\"请访问 https://platform.deepseek.com/api-keys 创建API密钥\\n\");\r\n \r\n char *input_key = malloc(256);\r\n if (!input_key) {\r\n fprintf(stderr, \"内存分配失败\\n\");\r\n return NULL;\r\n }\r\n \r\n printf(\"请输入您的DeepSeek API密钥: \");\r\n if (fgets(input_key, 256, stdin) == NULL) {\r\n free(input_key);\r\n return NULL;\r\n }\r\n \r\n input_key[strcspn(input_key, \"\\n\")] = 0;\r\n return input_key;\r\n}\r\n\r\n// ================== 核心API函数 ==================\r\n// 调用DeepSeek API\r\nstruct APIResponse call_deepseek(const char *api_key, const char *prompt) {\r\n CURL *curl;\r\n CURLcode res;\r\n struct MemoryStruct chunk = {0};\r\n long http_code = 0;\r\n struct APIResponse api_response = {0};\r\n\r\n curl_global_init(CURL_GLOBAL_DEFAULT);\r\n curl = curl_easy_init();\r\n\r\n if(!curl) {\r\n fprintf(stderr, \"无法初始化cURL\\n\");\r\n return api_response;\r\n }\r\n\r\n // 设置API端点\r\n curl_easy_setopt(curl, CURLOPT_URL, \"https://api.deepseek.com/chat/completions\");\r\n \r\n // 设置请求头\r\n struct curl_slist *headers = NULL;\r\n headers = curl_slist_append(headers, \"Content-Type: application/json\");\r\n char auth_header[256];\r\n snprintf(auth_header, sizeof(auth_header), \"Authorization: Bearer %s\", api_key);\r\n headers = curl_slist_append(headers, auth_header);\r\n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\r\n \r\n // 构建请求体\r\n cJSON *root = cJSON_CreateObject();\r\n cJSON_AddStringToObject(root, \"model\", \"deepseek-chat\");\r\n cJSON_AddNumberToObject(root, \"max_tokens\", 2000);\r\n \r\n cJSON *messages = cJSON_CreateArray();\r\n cJSON *message = cJSON_CreateObject();\r\n cJSON_AddStringToObject(message, \"role\", \"user\");\r\n cJSON_AddStringToObject(message, \"content\", prompt);\r\n cJSON_AddItemToArray(messages, message);\r\n \r\n cJSON_AddItemToObject(root, \"messages\", messages);\r\n char *post_data = cJSON_PrintUnformatted(root);\r\n \r\n // 设置POST数据\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(post_data));\r\n \r\n // 设置响应回调\r\n curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\r\n curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);\r\n \r\n // 设置超时\r\n curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);\r\n \r\n // 执行请求\r\n res = curl_easy_perform(curl);\r\n \r\n // 检查HTTP状态码\r\n curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);\r\n \r\n // 清理cURL资源\r\n curl_easy_cleanup(curl);\r\n curl_slist_free_all(headers);\r\n cJSON_Delete(root);\r\n free(post_data);\r\n \r\n // 调试信息\r\n printf(\"\\n--- API请求详情 ---\\n\");\r\n printf(\"端点: https://api.deepseek.com/chat/completions\\n\");\r\n printf(\"模型: deepseek-chat\\n\");\r\n printf(\"提示: %s\\n\", prompt);\r\n printf(\"状态码: %ld\\n\", http_code);\r\n \r\n if(res != CURLE_OK) {\r\n fprintf(stderr, \"cURL错误: %s\\n\", curl_easy_strerror(res));\r\n if(chunk.memory) free(chunk.memory);\r\n curl_global_cleanup();\r\n return api_response;\r\n }\r\n \r\n // 检查HTTP状态码\r\n if(http_code != 200) {\r\n fprintf(stderr, \"API错误: HTTP %ld\\n\", http_code);\r\n if(chunk.memory) {\r\n printf(\"原始响应: %s\\n\", chunk.memory);\r\n \r\n cJSON *error_json = cJSON_Parse(chunk.memory);\r\n if(error_json) {\r\n cJSON *error_obj = cJSON_GetObjectItem(error_json, \"error\");\r\n if(error_obj) {\r\n cJSON *message = cJSON_GetObjectItem(error_obj, \"message\");\r\n cJSON *code = cJSON_GetObjectItem(error_obj, \"code\");\r\n \r\n if(cJSON_IsString(message)) {\r\n fprintf(stderr, \"错误信息: %s\\n\", message->valuestring);\r\n }\r\n if(cJSON_IsString(code)) {\r\n fprintf(stderr, \"错误代码: %s\\n\", code->valuestring);\r\n }\r\n }\r\n cJSON_Delete(error_json);\r\n }\r\n }\r\n if(chunk.memory) free(chunk.memory);\r\n curl_global_cleanup();\r\n return api_response;\r\n }\r\n \r\n curl_global_cleanup();\r\n \r\n // 解析API响应\r\n cJSON *response_json = cJSON_Parse(chunk.memory);\r\n if (!response_json) {\r\n const char *error_ptr = cJSON_GetErrorPtr();\r\n if (error_ptr) fprintf(stderr, \"JSON解析错误: %s\\n\", error_ptr);\r\n fprintf(stderr, \"原始响应: %s\\n\", chunk.memory);\r\n free(chunk.memory);\r\n return api_response;\r\n }\r\n \r\n // 提取令牌使用信息\r\n cJSON *usage = cJSON_GetObjectItem(response_json, \"usage\");\r\n if (usage) {\r\n cJSON *prompt_tokens = cJSON_GetObjectItem(usage, \"prompt_tokens\");\r\n cJSON *completion_tokens = cJSON_GetObjectItem(usage, \"completion_tokens\");\r\n cJSON *total_tokens = cJSON_GetObjectItem(usage, \"total_tokens\");\r\n \r\n if (cJSON_IsNumber(prompt_tokens)) api_response.prompt_tokens = prompt_tokens->valueint;\r\n if (cJSON_IsNumber(completion_tokens)) api_response.completion_tokens = completion_tokens->valueint;\r\n if (cJSON_IsNumber(total_tokens)) api_response.total_tokens = total_tokens->valueint;\r\n }\r\n \r\n // 提取回复内容\r\n cJSON *choices = cJSON_GetObjectItem(response_json, \"choices\");\r\n if (cJSON_IsArray(choices) && cJSON_GetArraySize(choices) > 0) {\r\n cJSON *first_choice = cJSON_GetArrayItem(choices, 0);\r\n cJSON *message = cJSON_GetObjectItem(first_choice, \"message\");\r\n cJSON *content = cJSON_GetObjectItem(message, \"content\");\r\n \r\n if (cJSON_IsString(content) && content->valuestring != NULL) {\r\n api_response.content = strdup(content->valuestring);\r\n }\r\n }\r\n \r\n cJSON_Delete(response_json);\r\n free(chunk.memory);\r\n return api_response;\r\n}\r\n\r\n// 显示令牌使用信息\r\nvoid print_token_usage(int prompt_tokens, int completion_tokens, int total_tokens) {\r\n printf(\"\\n--- 令牌使用 ---\\n\");\r\n printf(\"提示令牌: %d\\n\", prompt_tokens);\r\n printf(\"完成令牌: %d\\n\", completion_tokens);\r\n printf(\"总令牌: %d\\n\", total_tokens);\r\n \r\n // 估算成本\r\n double estimated_cost = total_tokens * 0.0000015; // $0.0015/1K tokens\r\n printf(\"估算成本: $%.6f\\n\", estimated_cost);\r\n}\r\n\r\n// ================== 会话管理函数 ==================\r\n// 创建新会话\r\nDeepSeekSession* deepseek_create_session(const char *api_key) {\r\n DeepSeekSession *session = malloc(sizeof(DeepSeekSession));\r\n if (!session) return NULL;\r\n \r\n // 修复类型不匹配问题\r\n if (api_key) {\r\n session->api_key = strdup(api_key);\r\n } else {\r\n session->api_key = get_api_key();\r\n }\r\n \r\n session->total_prompt_tokens = 0;\r\n session->total_completion_tokens = 0;\r\n session->total_all_tokens = 0;\r\n \r\n return session;\r\n}\r\n\r\n// 销毁会话\r\nvoid deepseek_destroy_session(DeepSeekSession *session) {\r\n if (!session) return;\r\n \r\n free(session->api_key);\r\n free(session);\r\n}\r\n\r\n// 发送消息并获取回复\r\nchar* deepseek_send_message(\r\n DeepSeekSession *session, \r\n const char *message,\r\n int *prompt_tokens, // 返回本次提示令牌\r\n int *completion_tokens, // 返回本次完成令牌\r\n int *total_tokens // 返回本次总令牌\r\n) {\r\n if (!session || !message) return NULL;\r\n \r\n struct APIResponse response = call_deepseek(session->api_key, message);\r\n \r\n if (response.content) {\r\n // 更新会话令牌计数\r\n session->total_prompt_tokens += response.prompt_tokens;\r\n session->total_completion_tokens += response.completion_tokens;\r\n session->total_all_tokens += response.total_tokens;\r\n \r\n // 设置输出参数\r\n if (prompt_tokens) *prompt_tokens = response.prompt_tokens;\r\n if (completion_tokens) *completion_tokens = response.completion_tokens;\r\n if (total_tokens) *total_tokens = response.total_tokens;\r\n \r\n return response.content;\r\n }\r\n \r\n return NULL;\r\n}\r\n\r\n// 获取会话令牌统计\r\nvoid deepseek_get_token_stats(\r\n DeepSeekSession *session,\r\n int *total_prompt,\r\n int *total_completion,\r\n int *total_all\r\n) {\r\n if (!session) return;\r\n \r\n if (total_prompt) *total_prompt = session->total_prompt_tokens;\r\n if (total_completion) *total_completion = session->total_completion_tokens;\r\n if (total_all) *total_all = session->total_all_tokens;\r\n}\r\n\r\n// ================== 主函数 ==================\r\nint depmain() {\r\n // 创建会话 - 修复API密钥传递问题\r\n DeepSeekSession *session = deepseek_create_session(\"sk-28b778879e5b4fd6b227d767812fd83d\");\r\n if (!session) {\r\n fprintf(stderr, \"创建会话失败\\n\");\r\n return 1;\r\n }\r\n \r\n printf(\"DeepSeek聊天客户端 (输入'exit'退出)\\n\");\r\n printf(\"使用的API密钥: %.6s...\\n\", session->api_key);\r\n \r\n while(1) {\r\n printf(\"\\n你的问题: \");\r\n char input[1024];\r\n // fgets(input, sizeof(input), stdin);\r\n // 使用这种方式需要处理循环的问题以及刷新。\r\n sscanf(textbuf, \"%s\", input);\r\n printf(\"%s\\n\", textbuf);\r\n \r\n // 移除换行符\r\n input[strcspn(input, \"\\n\")] = 0;\r\n \r\n if(strcmp(input, \"exit\") == 0) break;\r\n if(strlen(input) == 0) continue;\r\n \r\n printf(\"正在查询DeepSeek API...\\n\");\r\n \r\n \r\n int prompt_tokens, completion_tokens, total_tokens;\r\n char *response = deepseek_send_message(\r\n session, \r\n input,\r\n &prompt_tokens,\r\n &completion_tokens,\r\n &total_tokens\r\n );\r\n \r\n if(response) {\r\n // printf(\"\\n--- DeepSeek回复 ---\\n%s\\n\", response);\r\n printf(\"\\n--- DeepSeek回复 ---\\n\");\r\n sprintf(dpOut, \"%s\", response);\r\n printf(\"%s\\n\", dpOut);\r\n \r\n // 显示令牌使用\r\n print_token_usage(prompt_tokens, completion_tokens, total_tokens);\r\n \r\n free(response);\r\n } else {\r\n printf(\"获取回复时出错\\n\");\r\n }\r\n }\r\n \r\n // 显示累计令牌使用\r\n // int total_prompt, total_completion, total_all;\r\n // deepseek_get_token_stats(session, &total_prompt, &total_completion, &total_all);\r\n \r\n // printf(\"\\n--- 本次会话累计令牌使用 ---\\n\");\r\n // printf(\"总提示令牌: %d\\n\", total_prompt);\r\n // printf(\"总完成令牌: %d\\n\", total_completion);\r\n // printf(\"总令牌: %d\\n\", total_all);\r\n \r\n // double estimated_total_cost = total_all * 0.0000015;\r\n // printf(\"估算总成本: $%.6f\\n\\n\", estimated_total_cost);\r\n \r\n // 清理资源\r\n deepseek_destroy_session(session);\r\n return 0;\r\n}\r\n\r\nint main()\r\n{\r\n depmain();\r\n}"}, "f3a08411284329c2135d632b6065b247b7b2ebf1": {"t": 1785763070.7882683, "n": 12021, "h": "efa1326c70948382", "c": "#include \r\n#include \r\n#include \r\n#include \r\n#include \"cJSON.h\"\r\n\r\n\r\n\r\n// 使用缓冲区输入输出是没问题的,需要解决循环的问题,\r\nchar textbuf[128] = \"who are you\";\r\nchar dpOut[128] = {0};\r\n\r\n// ================== 前置声明 ==================\r\nstruct MemoryStruct;\r\nstruct APIResponse;\r\nchar* get_api_key();\r\nstruct APIResponse call_deepseek(const char *api_key, const char *prompt);\r\nvoid print_token_usage(int prompt_tokens, int completion_tokens, int total_tokens);\r\n\r\n// ================== 数据结构定义 ==================\r\n// 存储HTTP响应\r\nstruct MemoryStruct {\r\n char *memory;\r\n size_t size;\r\n};\r\n\r\n// 存储API响应内容\r\nstruct APIResponse {\r\n char *content;\r\n int prompt_tokens;\r\n int completion_tokens;\r\n int total_tokens;\r\n};\r\n\r\n// 会话上下文\r\ntypedef struct {\r\n char *api_key;\r\n int total_prompt_tokens;\r\n int total_completion_tokens;\r\n int total_all_tokens;\r\n} DeepSeekSession;\r\n\r\n// ================== 辅助函数 ==================\r\n// libcurl回调函数\r\nstatic size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {\r\n size_t realsize = size * nmemb;\r\n struct MemoryStruct *mem = (struct MemoryStruct *)userp;\r\n\r\n char *ptr = realloc(mem->memory, mem->size + realsize + 1);\r\n if(!ptr) {\r\n fprintf(stderr, \"内存分配错误\\n\");\r\n return 0;\r\n }\r\n\r\n mem->memory = ptr;\r\n memcpy(&(mem->memory[mem->size]), contents, realsize);\r\n mem->size += realsize;\r\n mem->memory[mem->size] = 0;\r\n\r\n return realsize;\r\n}\r\n\r\n// 获取API密钥\r\nchar* get_api_key() {\r\n char *api_key = getenv(\"DEEPSEEK_API_KEY\");\r\n if (api_key && strlen(api_key) > 0) {\r\n return strdup(api_key);\r\n }\r\n \r\n printf(\"未找到环境变量 DEEPSEEK_API_KEY\\n\");\r\n printf(\"请访问 https://platform.deepseek.com/api-keys 创建API密钥\\n\");\r\n \r\n char *input_key = malloc(256);\r\n if (!input_key) {\r\n fprintf(stderr, \"内存分配失败\\n\");\r\n return NULL;\r\n }\r\n \r\n printf(\"请输入您的DeepSeek API密钥: \");\r\n if (fgets(input_key, 256, stdin) == NULL) {\r\n free(input_key);\r\n return NULL;\r\n }\r\n \r\n input_key[strcspn(input_key, \"\\n\")] = 0;\r\n return input_key;\r\n}\r\n\r\n// ================== 核心API函数 ==================\r\n// 调用DeepSeek API\r\nstruct APIResponse call_deepseek(const char *api_key, const char *prompt) {\r\n CURL *curl;\r\n CURLcode res;\r\n struct MemoryStruct chunk = {0};\r\n long http_code = 0;\r\n struct APIResponse api_response = {0};\r\n\r\n curl_global_init(CURL_GLOBAL_DEFAULT);\r\n curl = curl_easy_init();\r\n\r\n if(!curl) {\r\n fprintf(stderr, \"无法初始化cURL\\n\");\r\n return api_response;\r\n }\r\n\r\n // 设置API端点\r\n curl_easy_setopt(curl, CURLOPT_URL, \"https://api.deepseek.com/chat/completions\");\r\n \r\n // 设置请求头\r\n struct curl_slist *headers = NULL;\r\n headers = curl_slist_append(headers, \"Content-Type: application/json\");\r\n char auth_header[256];\r\n snprintf(auth_header, sizeof(auth_header), \"Authorization: Bearer %s\", api_key);\r\n headers = curl_slist_append(headers, auth_header);\r\n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\r\n \r\n // 构建请求体\r\n cJSON *root = cJSON_CreateObject();\r\n cJSON_AddStringToObject(root, \"model\", \"deepseek-chat\");\r\n cJSON_AddNumberToObject(root, \"max_tokens\", 2000);\r\n \r\n cJSON *messages = cJSON_CreateArray();\r\n cJSON *message = cJSON_CreateObject();\r\n cJSON_AddStringToObject(message, \"role\", \"user\");\r\n cJSON_AddStringToObject(message, \"content\", prompt);\r\n cJSON_AddItemToArray(messages, message);\r\n \r\n cJSON_AddItemToObject(root, \"messages\", messages);\r\n char *post_data = cJSON_PrintUnformatted(root);\r\n \r\n // 设置POST数据\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(post_data));\r\n \r\n // 设置响应回调\r\n curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\r\n curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);\r\n \r\n // 设置超时\r\n curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);\r\n \r\n // 执行请求\r\n res = curl_easy_perform(curl);\r\n \r\n // 检查HTTP状态码\r\n curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);\r\n \r\n // 清理cURL资源\r\n curl_easy_cleanup(curl);\r\n curl_slist_free_all(headers);\r\n cJSON_Delete(root);\r\n free(post_data);\r\n \r\n // 调试信息\r\n printf(\"\\n--- API请求详情 ---\\n\");\r\n printf(\"端点: https://api.deepseek.com/chat/completions\\n\");\r\n printf(\"模型: deepseek-chat\\n\");\r\n printf(\"提示: %s\\n\", prompt);\r\n printf(\"状态码: %ld\\n\", http_code);\r\n \r\n if(res != CURLE_OK) {\r\n fprintf(stderr, \"cURL错误: %s\\n\", curl_easy_strerror(res));\r\n if(chunk.memory) free(chunk.memory);\r\n curl_global_cleanup();\r\n return api_response;\r\n }\r\n \r\n // 检查HTTP状态码\r\n if(http_code != 200) {\r\n fprintf(stderr, \"API错误: HTTP %ld\\n\", http_code);\r\n if(chunk.memory) {\r\n printf(\"原始响应: %s\\n\", chunk.memory);\r\n \r\n cJSON *error_json = cJSON_Parse(chunk.memory);\r\n if(error_json) {\r\n cJSON *error_obj = cJSON_GetObjectItem(error_json, \"error\");\r\n if(error_obj) {\r\n cJSON *message = cJSON_GetObjectItem(error_obj, \"message\");\r\n cJSON *code = cJSON_GetObjectItem(error_obj, \"code\");\r\n \r\n if(cJSON_IsString(message)) {\r\n fprintf(stderr, \"错误信息: %s\\n\", message->valuestring);\r\n }\r\n if(cJSON_IsString(code)) {\r\n fprintf(stderr, \"错误代码: %s\\n\", code->valuestring);\r\n }\r\n }\r\n cJSON_Delete(error_json);\r\n }\r\n }\r\n if(chunk.memory) free(chunk.memory);\r\n curl_global_cleanup();\r\n return api_response;\r\n }\r\n \r\n curl_global_cleanup();\r\n \r\n // 解析API响应\r\n cJSON *response_json = cJSON_Parse(chunk.memory);\r\n if (!response_json) {\r\n const char *error_ptr = cJSON_GetErrorPtr();\r\n if (error_ptr) fprintf(stderr, \"JSON解析错误: %s\\n\", error_ptr);\r\n fprintf(stderr, \"原始响应: %s\\n\", chunk.memory);\r\n free(chunk.memory);\r\n return api_response;\r\n }\r\n \r\n // 提取令牌使用信息\r\n cJSON *usage = cJSON_GetObjectItem(response_json, \"usage\");\r\n if (usage) {\r\n cJSON *prompt_tokens = cJSON_GetObjectItem(usage, \"prompt_tokens\");\r\n cJSON *completion_tokens = cJSON_GetObjectItem(usage, \"completion_tokens\");\r\n cJSON *total_tokens = cJSON_GetObjectItem(usage, \"total_tokens\");\r\n \r\n if (cJSON_IsNumber(prompt_tokens)) api_response.prompt_tokens = prompt_tokens->valueint;\r\n if (cJSON_IsNumber(completion_tokens)) api_response.completion_tokens = completion_tokens->valueint;\r\n if (cJSON_IsNumber(total_tokens)) api_response.total_tokens = total_tokens->valueint;\r\n }\r\n \r\n // 提取回复内容\r\n cJSON *choices = cJSON_GetObjectItem(response_json, \"choices\");\r\n if (cJSON_IsArray(choices) && cJSON_GetArraySize(choices) > 0) {\r\n cJSON *first_choice = cJSON_GetArrayItem(choices, 0);\r\n cJSON *message = cJSON_GetObjectItem(first_choice, \"message\");\r\n cJSON *content = cJSON_GetObjectItem(message, \"content\");\r\n \r\n if (cJSON_IsString(content) && content->valuestring != NULL) {\r\n api_response.content = strdup(content->valuestring);\r\n }\r\n }\r\n \r\n cJSON_Delete(response_json);\r\n free(chunk.memory);\r\n return api_response;\r\n}\r\n\r\n// 显示令牌使用信息\r\nvoid print_token_usage(int prompt_tokens, int completion_tokens, int total_tokens) {\r\n printf(\"\\n--- 令牌使用 ---\\n\");\r\n printf(\"提示令牌: %d\\n\", prompt_tokens);\r\n printf(\"完成令牌: %d\\n\", completion_tokens);\r\n printf(\"总令牌: %d\\n\", total_tokens);\r\n \r\n // 估算成本\r\n double estimated_cost = total_tokens * 0.0000015; // $0.0015/1K tokens\r\n printf(\"估算成本: $%.6f\\n\", estimated_cost);\r\n}\r\n\r\n// ================== 会话管理函数 ==================\r\n// 创建新会话\r\nDeepSeekSession* deepseek_create_session(const char *api_key) {\r\n DeepSeekSession *session = malloc(sizeof(DeepSeekSession));\r\n if (!session) return NULL;\r\n \r\n // 修复类型不匹配问题\r\n if (api_key) {\r\n session->api_key = strdup(api_key);\r\n } else {\r\n session->api_key = get_api_key();\r\n }\r\n \r\n session->total_prompt_tokens = 0;\r\n session->total_completion_tokens = 0;\r\n session->total_all_tokens = 0;\r\n \r\n return session;\r\n}\r\n\r\n// 销毁会话\r\nvoid deepseek_destroy_session(DeepSeekSession *session) {\r\n if (!session) return;\r\n \r\n free(session->api_key);\r\n free(session);\r\n}\r\n\r\n// 发送消息并获取回复\r\nchar* deepseek_send_message(\r\n DeepSeekSession *session, \r\n const char *message,\r\n int *prompt_tokens, // 返回本次提示令牌\r\n int *completion_tokens, // 返回本次完成令牌\r\n int *total_tokens // 返回本次总令牌\r\n) {\r\n if (!session || !message) return NULL;\r\n \r\n struct APIResponse response = call_deepseek(session->api_key, message);\r\n \r\n if (response.content) {\r\n // 更新会话令牌计数\r\n session->total_prompt_tokens += response.prompt_tokens;\r\n session->total_completion_tokens += response.completion_tokens;\r\n session->total_all_tokens += response.total_tokens;\r\n \r\n // 设置输出参数\r\n if (prompt_tokens) *prompt_tokens = response.prompt_tokens;\r\n if (completion_tokens) *completion_tokens = response.completion_tokens;\r\n if (total_tokens) *total_tokens = response.total_tokens;\r\n \r\n return response.content;\r\n }\r\n \r\n return NULL;\r\n}\r\n\r\n// 获取会话令牌统计\r\nvoid deepseek_get_token_stats(\r\n DeepSeekSession *session,\r\n int *total_prompt,\r\n int *total_completion,\r\n int *total_all\r\n) {\r\n if (!session) return;\r\n \r\n if (total_prompt) *total_prompt = session->total_prompt_tokens;\r\n if (total_completion) *total_completion = session->total_completion_tokens;\r\n if (total_all) *total_all = session->total_all_tokens;\r\n}\r\n\r\n// ================== 主函数 ==================\r\nint depmain() {\r\n // 创建会话 - 修复API密钥传递问题\r\n DeepSeekSession *session = deepseek_create_session(\"sk-28b778879e5b4fd6b227d767812fd83d\");\r\n if (!session) {\r\n fprintf(stderr, \"创建会话失败\\n\");\r\n return 1;\r\n }\r\n \r\n printf(\"DeepSeek聊天客户端 (输入'exit'退出)\\n\");\r\n printf(\"使用的API密钥: %.6s...\\n\", session->api_key);\r\n \r\n while(1) {\r\n printf(\"\\n你的问题: \");\r\n char input[1024];\r\n // fgets(input, sizeof(input), stdin);\r\n // 使用这种方式需要处理循环的问题以及刷新。\r\n sscanf(textbuf, \"%s\", input);\r\n printf(\"%s\\n\", textbuf);\r\n \r\n // 移除换行符\r\n input[strcspn(input, \"\\n\")] = 0;\r\n \r\n if(strcmp(input, \"exit\") == 0) break;\r\n if(strlen(input) == 0) continue;\r\n \r\n printf(\"正在查询DeepSeek API...\\n\");\r\n \r\n \r\n int prompt_tokens, completion_tokens, total_tokens;\r\n char *response = deepseek_send_message(\r\n session, \r\n input,\r\n &prompt_tokens,\r\n &completion_tokens,\r\n &total_tokens\r\n );\r\n \r\n if(response) {\r\n // printf(\"\\n--- DeepSeek回复 ---\\n%s\\n\", response);\r\n printf(\"\\n--- DeepSeek回复 ---\\n\");\r\n sprintf(dpOut, \"%s\", response);\r\n printf(\"%s\\n\", dpOut);\r\n \r\n // 显示令牌使用\r\n print_token_usage(prompt_tokens, completion_tokens, total_tokens);\r\n \r\n free(response);\r\n } else {\r\n printf(\"获取回复时出错\\n\");\r\n }\r\n }\r\n \r\n // 显示累计令牌使用\r\n // int total_prompt, total_completion, total_all;\r\n // deepseek_get_token_stats(session, &total_prompt, &total_completion, &total_all);\r\n \r\n // printf(\"\\n--- 本次会话累计令牌使用 ---\\n\");\r\n // printf(\"总提示令牌: %d\\n\", total_prompt);\r\n // printf(\"总完成令牌: %d\\n\", total_completion);\r\n // printf(\"总令牌: %d\\n\", total_all);\r\n \r\n // double estimated_total_cost = total_all * 0.0000015;\r\n // printf(\"估算总成本: $%.6f\\n\\n\", estimated_total_cost);\r\n \r\n // 清理资源\r\n deepseek_destroy_session(session);\r\n return 0;\r\n}\r\n\r\nint main()\r\n{\r\n depmain();\r\n}"}, "441d094d06760ad4fb6ef81c4e263f1195d1f562": {"t": 1785763072.9414206, "n": 12027, "h": "df731703572a065f", "c": "#include \r\n#include \r\n#include \r\n#include \r\n#include \r\n\r\n\r\n\r\n// 使用缓冲区输入输出是没问题的,需要解决循环的问题,\r\nchar textbuf[128] = \"who are you\";\r\nchar dpOut[128] = {0};\r\n\r\n// ================== 前置声明 ==================\r\nstruct MemoryStruct;\r\nstruct APIResponse;\r\nchar* get_api_key();\r\nstruct APIResponse call_deepseek(const char *api_key, const char *prompt);\r\nvoid print_token_usage(int prompt_tokens, int completion_tokens, int total_tokens);\r\n\r\n// ================== 数据结构定义 ==================\r\n// 存储HTTP响应\r\nstruct MemoryStruct {\r\n char *memory;\r\n size_t size;\r\n};\r\n\r\n// 存储API响应内容\r\nstruct APIResponse {\r\n char *content;\r\n int prompt_tokens;\r\n int completion_tokens;\r\n int total_tokens;\r\n};\r\n\r\n// 会话上下文\r\ntypedef struct {\r\n char *api_key;\r\n int total_prompt_tokens;\r\n int total_completion_tokens;\r\n int total_all_tokens;\r\n} DeepSeekSession;\r\n\r\n// ================== 辅助函数 ==================\r\n// libcurl回调函数\r\nstatic size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {\r\n size_t realsize = size * nmemb;\r\n struct MemoryStruct *mem = (struct MemoryStruct *)userp;\r\n\r\n char *ptr = realloc(mem->memory, mem->size + realsize + 1);\r\n if(!ptr) {\r\n fprintf(stderr, \"内存分配错误\\n\");\r\n return 0;\r\n }\r\n\r\n mem->memory = ptr;\r\n memcpy(&(mem->memory[mem->size]), contents, realsize);\r\n mem->size += realsize;\r\n mem->memory[mem->size] = 0;\r\n\r\n return realsize;\r\n}\r\n\r\n// 获取API密钥\r\nchar* get_api_key() {\r\n char *api_key = getenv(\"DEEPSEEK_API_KEY\");\r\n if (api_key && strlen(api_key) > 0) {\r\n return strdup(api_key);\r\n }\r\n \r\n printf(\"未找到环境变量 DEEPSEEK_API_KEY\\n\");\r\n printf(\"请访问 https://platform.deepseek.com/api-keys 创建API密钥\\n\");\r\n \r\n char *input_key = malloc(256);\r\n if (!input_key) {\r\n fprintf(stderr, \"内存分配失败\\n\");\r\n return NULL;\r\n }\r\n \r\n printf(\"请输入您的DeepSeek API密钥: \");\r\n if (fgets(input_key, 256, stdin) == NULL) {\r\n free(input_key);\r\n return NULL;\r\n }\r\n \r\n input_key[strcspn(input_key, \"\\n\")] = 0;\r\n return input_key;\r\n}\r\n\r\n// ================== 核心API函数 ==================\r\n// 调用DeepSeek API\r\nstruct APIResponse call_deepseek(const char *api_key, const char *prompt) {\r\n CURL *curl;\r\n CURLcode res;\r\n struct MemoryStruct chunk = {0};\r\n long http_code = 0;\r\n struct APIResponse api_response = {0};\r\n\r\n curl_global_init(CURL_GLOBAL_DEFAULT);\r\n curl = curl_easy_init();\r\n\r\n if(!curl) {\r\n fprintf(stderr, \"无法初始化cURL\\n\");\r\n return api_response;\r\n }\r\n\r\n // 设置API端点\r\n curl_easy_setopt(curl, CURLOPT_URL, \"https://api.deepseek.com/chat/completions\");\r\n \r\n // 设置请求头\r\n struct curl_slist *headers = NULL;\r\n headers = curl_slist_append(headers, \"Content-Type: application/json\");\r\n char auth_header[256];\r\n snprintf(auth_header, sizeof(auth_header), \"Authorization: Bearer %s\", api_key);\r\n headers = curl_slist_append(headers, auth_header);\r\n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\r\n \r\n // 构建请求体\r\n cJSON *root = cJSON_CreateObject();\r\n cJSON_AddStringToObject(root, \"model\", \"deepseek-chat\");\r\n cJSON_AddNumberToObject(root, \"max_tokens\", 2000);\r\n \r\n cJSON *messages = cJSON_CreateArray();\r\n cJSON *message = cJSON_CreateObject();\r\n cJSON_AddStringToObject(message, \"role\", \"user\");\r\n cJSON_AddStringToObject(message, \"content\", prompt);\r\n cJSON_AddItemToArray(messages, message);\r\n \r\n cJSON_AddItemToObject(root, \"messages\", messages);\r\n char *post_data = cJSON_PrintUnformatted(root);\r\n \r\n // 设置POST数据\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);\r\n curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(post_data));\r\n \r\n // 设置响应回调\r\n curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\r\n curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);\r\n \r\n // 设置超时\r\n curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);\r\n \r\n // 执行请求\r\n res = curl_easy_perform(curl);\r\n \r\n // 检查HTTP状态码\r\n curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);\r\n \r\n // 清理cURL资源\r\n curl_easy_cleanup(curl);\r\n curl_slist_free_all(headers);\r\n cJSON_Delete(root);\r\n free(post_data);\r\n \r\n // 调试信息\r\n printf(\"\\n--- API请求详情 ---\\n\");\r\n printf(\"端点: https://api.deepseek.com/chat/completions\\n\");\r\n printf(\"模型: deepseek-chat\\n\");\r\n printf(\"提示: %s\\n\", prompt);\r\n printf(\"状态码: %ld\\n\", http_code);\r\n \r\n if(res != CURLE_OK) {\r\n fprintf(stderr, \"cURL错误: %s\\n\", curl_easy_strerror(res));\r\n if(chunk.memory) free(chunk.memory);\r\n curl_global_cleanup();\r\n return api_response;\r\n }\r\n \r\n // 检查HTTP状态码\r\n if(http_code != 200) {\r\n fprintf(stderr, \"API错误: HTTP %ld\\n\", http_code);\r\n if(chunk.memory) {\r\n printf(\"原始响应: %s\\n\", chunk.memory);\r\n \r\n cJSON *error_json = cJSON_Parse(chunk.memory);\r\n if(error_json) {\r\n cJSON *error_obj = cJSON_GetObjectItem(error_json, \"error\");\r\n if(error_obj) {\r\n cJSON *message = cJSON_GetObjectItem(error_obj, \"message\");\r\n cJSON *code = cJSON_GetObjectItem(error_obj, \"code\");\r\n \r\n if(cJSON_IsString(message)) {\r\n fprintf(stderr, \"错误信息: %s\\n\", message->valuestring);\r\n }\r\n if(cJSON_IsString(code)) {\r\n fprintf(stderr, \"错误代码: %s\\n\", code->valuestring);\r\n }\r\n }\r\n cJSON_Delete(error_json);\r\n }\r\n }\r\n if(chunk.memory) free(chunk.memory);\r\n curl_global_cleanup();\r\n return api_response;\r\n }\r\n \r\n curl_global_cleanup();\r\n \r\n // 解析API响应\r\n cJSON *response_json = cJSON_Parse(chunk.memory);\r\n if (!response_json) {\r\n const char *error_ptr = cJSON_GetErrorPtr();\r\n if (error_ptr) fprintf(stderr, \"JSON解析错误: %s\\n\", error_ptr);\r\n fprintf(stderr, \"原始响应: %s\\n\", chunk.memory);\r\n free(chunk.memory);\r\n return api_response;\r\n }\r\n \r\n // 提取令牌使用信息\r\n cJSON *usage = cJSON_GetObjectItem(response_json, \"usage\");\r\n if (usage) {\r\n cJSON *prompt_tokens = cJSON_GetObjectItem(usage, \"prompt_tokens\");\r\n cJSON *completion_tokens = cJSON_GetObjectItem(usage, \"completion_tokens\");\r\n cJSON *total_tokens = cJSON_GetObjectItem(usage, \"total_tokens\");\r\n \r\n if (cJSON_IsNumber(prompt_tokens)) api_response.prompt_tokens = prompt_tokens->valueint;\r\n if (cJSON_IsNumber(completion_tokens)) api_response.completion_tokens = completion_tokens->valueint;\r\n if (cJSON_IsNumber(total_tokens)) api_response.total_tokens = total_tokens->valueint;\r\n }\r\n \r\n // 提取回复内容\r\n cJSON *choices = cJSON_GetObjectItem(response_json, \"choices\");\r\n if (cJSON_IsArray(choices) && cJSON_GetArraySize(choices) > 0) {\r\n cJSON *first_choice = cJSON_GetArrayItem(choices, 0);\r\n cJSON *message = cJSON_GetObjectItem(first_choice, \"message\");\r\n cJSON *content = cJSON_GetObjectItem(message, \"content\");\r\n \r\n if (cJSON_IsString(content) && content->valuestring != NULL) {\r\n api_response.content = strdup(content->valuestring);\r\n }\r\n }\r\n \r\n cJSON_Delete(response_json);\r\n free(chunk.memory);\r\n return api_response;\r\n}\r\n\r\n// 显示令牌使用信息\r\nvoid print_token_usage(int prompt_tokens, int completion_tokens, int total_tokens) {\r\n printf(\"\\n--- 令牌使用 ---\\n\");\r\n printf(\"提示令牌: %d\\n\", prompt_tokens);\r\n printf(\"完成令牌: %d\\n\", completion_tokens);\r\n printf(\"总令牌: %d\\n\", total_tokens);\r\n \r\n // 估算成本\r\n double estimated_cost = total_tokens * 0.0000015; // $0.0015/1K tokens\r\n printf(\"估算成本: $%.6f\\n\", estimated_cost);\r\n}\r\n\r\n// ================== 会话管理函数 ==================\r\n// 创建新会话\r\nDeepSeekSession* deepseek_create_session(const char *api_key) {\r\n DeepSeekSession *session = malloc(sizeof(DeepSeekSession));\r\n if (!session) return NULL;\r\n \r\n // 修复类型不匹配问题\r\n if (api_key) {\r\n session->api_key = strdup(api_key);\r\n } else {\r\n session->api_key = get_api_key();\r\n }\r\n \r\n session->total_prompt_tokens = 0;\r\n session->total_completion_tokens = 0;\r\n session->total_all_tokens = 0;\r\n \r\n return session;\r\n}\r\n\r\n// 销毁会话\r\nvoid deepseek_destroy_session(DeepSeekSession *session) {\r\n if (!session) return;\r\n \r\n free(session->api_key);\r\n free(session);\r\n}\r\n\r\n// 发送消息并获取回复\r\nchar* deepseek_send_message(\r\n DeepSeekSession *session, \r\n const char *message,\r\n int *prompt_tokens, // 返回本次提示令牌\r\n int *completion_tokens, // 返回本次完成令牌\r\n int *total_tokens // 返回本次总令牌\r\n) {\r\n if (!session || !message) return NULL;\r\n \r\n struct APIResponse response = call_deepseek(session->api_key, message);\r\n \r\n if (response.content) {\r\n // 更新会话令牌计数\r\n session->total_prompt_tokens += response.prompt_tokens;\r\n session->total_completion_tokens += response.completion_tokens;\r\n session->total_all_tokens += response.total_tokens;\r\n \r\n // 设置输出参数\r\n if (prompt_tokens) *prompt_tokens = response.prompt_tokens;\r\n if (completion_tokens) *completion_tokens = response.completion_tokens;\r\n if (total_tokens) *total_tokens = response.total_tokens;\r\n \r\n return response.content;\r\n }\r\n \r\n return NULL;\r\n}\r\n\r\n// 获取会话令牌统计\r\nvoid deepseek_get_token_stats(\r\n DeepSeekSession *session,\r\n int *total_prompt,\r\n int *total_completion,\r\n int *total_all\r\n) {\r\n if (!session) return;\r\n \r\n if (total_prompt) *total_prompt = session->total_prompt_tokens;\r\n if (total_completion) *total_completion = session->total_completion_tokens;\r\n if (total_all) *total_all = session->total_all_tokens;\r\n}\r\n\r\n// ================== 主函数 ==================\r\nint depmain() {\r\n // 创建会话 - 修复API密钥传递问题\r\n DeepSeekSession *session = deepseek_create_session(\"sk-28b778879e5b4fd6b227d767812fd83d\");\r\n if (!session) {\r\n fprintf(stderr, \"创建会话失败\\n\");\r\n return 1;\r\n }\r\n \r\n printf(\"DeepSeek聊天客户端 (输入'exit'退出)\\n\");\r\n printf(\"使用的API密钥: %.6s...\\n\", session->api_key);\r\n \r\n while(1) {\r\n printf(\"\\n你的问题: \");\r\n char input[1024];\r\n // fgets(input, sizeof(input), stdin);\r\n // 使用这种方式需要处理循环的问题以及刷新。\r\n sscanf(textbuf, \"%s\", input);\r\n printf(\"%s\\n\", textbuf);\r\n \r\n // 移除换行符\r\n input[strcspn(input, \"\\n\")] = 0;\r\n \r\n if(strcmp(input, \"exit\") == 0) break;\r\n if(strlen(input) == 0) continue;\r\n \r\n printf(\"正在查询DeepSeek API...\\n\");\r\n \r\n \r\n int prompt_tokens, completion_tokens, total_tokens;\r\n char *response = deepseek_send_message(\r\n session, \r\n input,\r\n &prompt_tokens,\r\n &completion_tokens,\r\n &total_tokens\r\n );\r\n \r\n if(response) {\r\n // printf(\"\\n--- DeepSeek回复 ---\\n%s\\n\", response);\r\n printf(\"\\n--- DeepSeek回复 ---\\n\");\r\n sprintf(dpOut, \"%s\", response);\r\n printf(\"%s\\n\", dpOut);\r\n \r\n // 显示令牌使用\r\n print_token_usage(prompt_tokens, completion_tokens, total_tokens);\r\n \r\n free(response);\r\n } else {\r\n printf(\"获取回复时出错\\n\");\r\n }\r\n }\r\n \r\n // 显示累计令牌使用\r\n // int total_prompt, total_completion, total_all;\r\n // deepseek_get_token_stats(session, &total_prompt, &total_completion, &total_all);\r\n \r\n // printf(\"\\n--- 本次会话累计令牌使用 ---\\n\");\r\n // printf(\"总提示令牌: %d\\n\", total_prompt);\r\n // printf(\"总完成令牌: %d\\n\", total_completion);\r\n // printf(\"总令牌: %d\\n\", total_all);\r\n \r\n // double estimated_total_cost = total_all * 0.0000015;\r\n // printf(\"估算总成本: $%.6f\\n\\n\", estimated_total_cost);\r\n \r\n // 清理资源\r\n deepseek_destroy_session(session);\r\n return 0;\r\n}\r\n\r\nint main()\r\n{\r\n depmain();\r\n}"}}}}