[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fapi\u002Feduwin-ai-api":3},{"id":4,"title":5,"body":6,"description":54,"extension":373,"meta":374,"navigation":172,"path":375,"seo":376,"stem":377,"__hash__":378},"content\u002Fdocs\u002Fapi\u002Feduwin-ai-api.md","eduwin AI 大模型 API",{"type":7,"value":8,"toc":364},"minimark",[9,13,29,44,48,64,75,91,94,109,116,149,155,158,179,186,215,218,238,249,295,298,304,307,313,343,346,352,360],[10,11,5],"h1",{"id":12},"eduwin-ai-大模型-api",[14,15,16],"blockquote",{},[17,18,19,20,24,25,28],"p",{},"头文件：",[21,22,23],"code",{},"eduwin_ai.h","（或通过 ",[21,26,27],{},"eduwin.h"," 统一引用）",[17,30,31,32,35,36,39,40,43],{},"基于 WinHTTP 调用大语言模型 API，提供同步、异步、窗口异步三种调用方式。依赖 ",[21,33,34],{},"eduwin_net"," 的 HTTP 能力。线程安全——异步接口内部使用 ",[21,37,38],{},"eduwin_thread"," 的 ",[21,41,42],{},"thread_run"," 管理线程。",[45,46,47],"h2",{"id":47},"初始化",[49,50,55],"pre",{"className":51,"code":52,"language":53,"meta":54,"style":54},"language-c shiki shiki-themes github-light github-dark","void ai_setup(const char *api_key, const char *model, const char *base_url);\n","c","",[21,56,57],{"__ignoreMap":54},[58,59,62],"span",{"class":60,"line":61},"line",1,[58,63,52],{},[17,65,66,67,74],{},"配置 API Key、模型名、Base URL。",[68,69,70,71],"strong",{},"必须先调 ",[21,72,73],{},"net_init()","。",[49,76,78],{"className":51,"code":77,"language":53,"meta":54,"style":54},"net_init();\nai_setup(\"sk-xxx\", \"deepseek-chat\", \"https:\u002F\u002Fapi.deepseek.com\u002Fv1\");\n",[21,79,80,85],{"__ignoreMap":54},[58,81,82],{"class":60,"line":61},[58,83,84],{},"net_init();\n",[58,86,88],{"class":60,"line":87},2,[58,89,90],{},"ai_setup(\"sk-xxx\", \"deepseek-chat\", \"https:\u002F\u002Fapi.deepseek.com\u002Fv1\");\n",[45,92,93],{"id":93},"同步调用",[49,95,97],{"className":51,"code":96,"language":53,"meta":54,"style":54},"char* ai_chat(const char *prompt);\nvoid  ai_free(char *ptr);\n",[21,98,99,104],{"__ignoreMap":54},[58,100,101],{"class":60,"line":61},[58,102,103],{},"char* ai_chat(const char *prompt);\n",[58,105,106],{"class":60,"line":87},[58,107,108],{},"void  ai_free(char *ptr);\n",[17,110,111,112,115],{},"发送 prompt，阻塞等待完整回复。返回的字符串需用 ",[21,113,114],{},"ai_free"," 释放。",[49,117,119],{"className":51,"code":118,"language":53,"meta":54,"style":54},"char *reply = ai_chat(\"用 C 语言实现冒泡排序\");\nif (reply) {\n    printf(\"%s\", reply);\n    ai_free(reply);\n}\n",[21,120,121,126,131,137,143],{"__ignoreMap":54},[58,122,123],{"class":60,"line":61},[58,124,125],{},"char *reply = ai_chat(\"用 C 语言实现冒泡排序\");\n",[58,127,128],{"class":60,"line":87},[58,129,130],{},"if (reply) {\n",[58,132,134],{"class":60,"line":133},3,[58,135,136],{},"    printf(\"%s\", reply);\n",[58,138,140],{"class":60,"line":139},4,[58,141,142],{},"    ai_free(reply);\n",[58,144,146],{"class":60,"line":145},5,[58,147,148],{},"}\n",[17,150,151,154],{},[68,152,153],{},"注意："," 同步调用会阻塞当前线程。GUI 程序请用异步或窗口异步接口。",[45,156,157],{"id":157},"异步调用",[49,159,161],{"className":51,"code":160,"language":53,"meta":54,"style":54},"typedef void (*ai_callback_t)(const char *reply, void *userdata);\n\nvoid ai_chat_async(const char *prompt, ai_callback_t callback, void *userdata);\n",[21,162,163,168,174],{"__ignoreMap":54},[58,164,165],{"class":60,"line":61},[58,166,167],{},"typedef void (*ai_callback_t)(const char *reply, void *userdata);\n",[58,169,170],{"class":60,"line":87},[58,171,173],{"emptyLinePlaceholder":172},true,"\n",[58,175,176],{"class":60,"line":133},[58,177,178],{},"void ai_chat_async(const char *prompt, ai_callback_t callback, void *userdata);\n",[17,180,181,182,185],{},"不阻塞调用线程，请求完成后通过回调返回结果。",[21,183,184],{},"userdata"," 在回调中原样传回。",[49,187,189],{"className":51,"code":188,"language":53,"meta":54,"style":54},"void on_reply(const char *reply, void *userdata) {\n    if (reply) set_text(g_label, L\"AI 回复已收到\");\n    ai_free((void*)reply);\n}\nai_chat_async(\"你好\", on_reply, NULL);\n",[21,190,191,196,201,206,210],{"__ignoreMap":54},[58,192,193],{"class":60,"line":61},[58,194,195],{},"void on_reply(const char *reply, void *userdata) {\n",[58,197,198],{"class":60,"line":87},[58,199,200],{},"    if (reply) set_text(g_label, L\"AI 回复已收到\");\n",[58,202,203],{"class":60,"line":133},[58,204,205],{},"    ai_free((void*)reply);\n",[58,207,208],{"class":60,"line":139},[58,209,148],{},[58,211,212],{"class":60,"line":145},[58,213,214],{},"ai_chat_async(\"你好\", on_reply, NULL);\n",[45,216,217],{"id":217},"窗口异步调用",[49,219,221],{"className":51,"code":220,"language":53,"meta":54,"style":54},"void ai_chat_async_to_hwnd(HWND hwnd, const char *prompt, void *userdata);\nint  ai_handle_async_msg(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,\n                                void (*on_result)(const char *reply, void *userdata));\n",[21,222,223,228,233],{"__ignoreMap":54},[58,224,225],{"class":60,"line":61},[58,226,227],{},"void ai_chat_async_to_hwnd(HWND hwnd, const char *prompt, void *userdata);\n",[58,229,230],{"class":60,"line":87},[58,231,232],{},"int  ai_handle_async_msg(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,\n",[58,234,235],{"class":60,"line":133},[58,236,237],{},"                                void (*on_result)(const char *reply, void *userdata));\n",[17,239,240,241,244,245,248],{},"请求完成后通过 ",[21,242,243],{},"PostMessage"," 通知指定窗口，在窗口过程中用 ",[21,246,247],{},"ai_handle_async_msg"," 处理。",[49,250,252],{"className":51,"code":251,"language":53,"meta":54,"style":54},"\u002F\u002F 窗口过程中\nLRESULT CALLBACK WndProc(HWND h, UINT m, WPARAM w, LPARAM l) {\n    if (ai_handle_async_msg(h, m, w, l, on_result))\n        return 0;\n}\n\n\u002F\u002F 任意位置发起请求\nai_chat_async_to_hwnd(g_win, \"写一首诗\", NULL);\n",[21,253,254,259,264,269,274,278,283,289],{"__ignoreMap":54},[58,255,256],{"class":60,"line":61},[58,257,258],{},"\u002F\u002F 窗口过程中\n",[58,260,261],{"class":60,"line":87},[58,262,263],{},"LRESULT CALLBACK WndProc(HWND h, UINT m, WPARAM w, LPARAM l) {\n",[58,265,266],{"class":60,"line":133},[58,267,268],{},"    if (ai_handle_async_msg(h, m, w, l, on_result))\n",[58,270,271],{"class":60,"line":139},[58,272,273],{},"        return 0;\n",[58,275,276],{"class":60,"line":145},[58,277,148],{},[58,279,281],{"class":60,"line":280},6,[58,282,173],{"emptyLinePlaceholder":172},[58,284,286],{"class":60,"line":285},7,[58,287,288],{},"\u002F\u002F 任意位置发起请求\n",[58,290,292],{"class":60,"line":291},8,[58,293,294],{},"ai_chat_async_to_hwnd(g_win, \"写一首诗\", NULL);\n",[45,296,297],{"id":297},"完整示例",[17,299,300,301,74],{},"参见 ",[21,302,303],{},"samples\u002Fai_chat_demo\u002F",[45,305,306],{"id":306},"模型兼容性",[17,308,309,312],{},[21,310,311],{},"eduwin_ai"," 使用 OpenAI 兼容 API 格式（Chat Completion），支持：",[314,315,316,324,330,336],"ul",{},[317,318,319,320,323],"li",{},"DeepSeek (",[21,321,322],{},"api.deepseek.com",")",[317,325,326,327,323],{},"智谱 GLM (",[21,328,329],{},"open.bigmodel.cn",[317,331,332,333,323],{},"阿里通义千问 (",[21,334,335],{},"dashscope.aliyuncs.com\u002Fcompatible-mode",[317,337,338,339,342],{},"任何提供 ",[21,340,341],{},"\u002Fv1\u002Fchat\u002Fcompletions"," 端点的服务",[45,344,345],{"id":345},"编译要求",[17,347,348,349,351],{},"与 ",[21,350,34],{}," 相同，需要在 link 命令中添加：",[49,353,358],{"className":354,"code":356,"language":357},[355],"language-text","ws2_32.lib winhttp.lib\n","text",[21,359,356],{"__ignoreMap":54},[361,362,363],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":54,"searchDepth":87,"depth":87,"links":365},[366,367,368,369,370,371,372],{"id":47,"depth":87,"text":47},{"id":93,"depth":87,"text":93},{"id":157,"depth":87,"text":157},{"id":217,"depth":87,"text":217},{"id":297,"depth":87,"text":297},{"id":306,"depth":87,"text":306},{"id":345,"depth":87,"text":345},"md",{},"\u002Fdocs\u002Fapi\u002Feduwin-ai-api",{"title":5,"description":54},"docs\u002Fapi\u002Feduwin-ai-api","6OxCEzfo-eu6G7UzhOjnbLgN7SjK8Rygv_CGbDIfAS8",1782488679849]