Files

1 line
54 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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 <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <curl/curl.h>\r\n#include <cjson/cJSON.h>\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 <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <curl/curl.h>\r\n#include <cjson/cJSON.h>\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 <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <curl/curl.h>\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 <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <curl/curl.h>\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 <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <curl/curl.h>\r\n#include <cjson/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}"}}}}