[{"data":1,"prerenderedAt":1723},["ShallowReactive",2],{"navigation":3,"\u002Fllm\u002Feino1":144,"\u002Fllm\u002Feino1-surround":1718},[4,36,53,86,131],{"title":5,"path":6,"stem":7,"children":8,"icon":35},"Golang","\u002Fgolang","1.golang\u002F1.index",[9,11,15,19,23,27,31],{"title":10,"path":6,"stem":7},"golang-各种golang学习以及使用过程中记录",{"title":12,"path":13,"stem":14},"gopls-官方gopls内置mcp server的基本使用","\u002Fgolang\u002Fgopls_mcp_usages","1.golang\u002F2.gopls_mcp_usages",{"title":16,"path":17,"stem":18},"实践-(一)创建简单的http服务器","\u002Fgolang\u002Fgo_http_simple_server","1.golang\u002F3.go_http_simple_server",{"title":20,"path":21,"stem":22},"wails入门系列(一)环境安装与demo","\u002Fgolang\u002Fwails_start","1.golang\u002F4.wails_start",{"title":24,"path":25,"stem":26},"wails入门系列(二)无边框应用的菜单栏以及窗口拖拽","\u002Fgolang\u002Fwails_frameless","1.golang\u002F5.wails_frameless",{"title":28,"path":29,"stem":30},"go\u002Fredis-redis中大数字自动转换成指数形式的处理","\u002Fgolang\u002Fredis_big_num","1.golang\u002F6.redis_big_num",{"title":32,"path":33,"stem":34},"go\u002F方法记录-局部坐标与世界坐标间的相互转换(位置\u002F方向)","\u002Fgolang\u002Fworld_local_transform","1.golang\u002F7.world_local_transform",false,{"title":37,"icon":35,"path":38,"stem":39,"children":40,"page":35},"瞎折腾","\u002Ftinkering","2.tinkering",[41,45,49],{"title":42,"path":43,"stem":44},"mi50显卡ubuntu运行大模型开坑(一)显卡准备以及驱动安装","\u002Ftinkering\u002Fmi50_gpu_llm_1","2.tinkering\u002F1.mi50_gpu_llm_1",{"title":46,"path":47,"stem":48},"mi50显卡ubuntu运行大模型开坑(二)使用llama.cpp部署Qwen3系列","\u002Ftinkering\u002Fmi50_gpu_llm_2","2.tinkering\u002F2.mi50_gpu_llm_2",{"title":50,"path":51,"stem":52},"mi50显卡ubuntu运行大模型开坑(三)安装风扇并且控制转速","\u002Ftinkering\u002Fmi50_gpu_llm_3","2.tinkering\u002F3.mi50_gpu_llm_3",{"title":54,"icon":35,"path":55,"stem":56,"children":57,"page":35},"LLM","\u002Fllm","3.llm",[58,62,66,70,74,78,82],{"title":59,"path":60,"stem":61},"langchain入门-安装以及初次使用(deepseek api版本)","\u002Fllm\u002Flangchain1","3.llm\u002F01.langchain1",{"title":63,"path":64,"stem":65},"langchain入门-使用langchain调用本地部署的大模型(以llama.cpp以及ollama为例)","\u002Fllm\u002Flangchain2","3.llm\u002F02.langchain2",{"title":67,"path":68,"stem":69},"langchain入门-使用langchain编写一个简单的聊天机器人(DeepSeek API&命令行版本)","\u002Fllm\u002Flangchain3","3.llm\u002F03.langchain3",{"title":71,"path":72,"stem":73},"langchain入门-使用langchain构建一个拥有RAG能力的代码问答应用(DeepSeek API&本地bge-m3&命令行版本)","\u002Fllm\u002Flangchain4","3.llm\u002F04.langchain4",{"title":75,"path":76,"stem":77},"golang\u002Feino eino框架的基础使用 Message以及ChatModel入门","\u002Fllm\u002Feino1","3.llm\u002F05.eino1",{"title":79,"path":80,"stem":81},"golang\u002Feino eino框架的基础使用 在ChatModel中使用工具","\u002Fllm\u002Feino2","3.llm\u002F06.eino2",{"title":83,"path":84,"stem":85},"llm\u002Fagent agent-zero初步搭建与使用","\u002Fllm\u002Fagent_zero_start","3.llm\u002F07.agent_zero_start",{"title":87,"icon":35,"path":88,"stem":89,"children":90,"page":35},"Verilog","\u002Fverilog","4.verilog",[91,95,99,103,107,111,115,119,123,127],{"title":92,"path":93,"stem":94},"31条指令单周期cpu设计(Verilog)-(一)相关软件","\u002Fverilog\u002Fmips1","4.verilog\u002F01.mips1",{"title":96,"path":97,"stem":98},"31条指令单周期cpu设计(Verilog)-(二)总体设计","\u002Fverilog\u002Fmips2","4.verilog\u002F02.mips2",{"title":100,"path":101,"stem":102},"31条指令单周期cpu设计(Verilog)-(三)指令分析","\u002Fverilog\u002Fmips3","4.verilog\u002F03.mips3",{"title":104,"path":105,"stem":106},"31条指令单周期cpu设计(Verilog)-(四)数据输入输出关系表","\u002Fverilog\u002Fmips4","4.verilog\u002F04.mips4",{"title":108,"path":109,"stem":110},"31条指令单周期cpu设计(Verilog)-(五)整体数据通路图设计","\u002Fverilog\u002Fmips5","4.verilog\u002F05.mips5",{"title":112,"path":113,"stem":114},"31条指令单周期cpu设计(Verilog)-(六)指令操作时间表设计","\u002Fverilog\u002Fmips6","4.verilog\u002F06.mips6",{"title":116,"path":117,"stem":118},"31条指令单周期cpu设计(Verilog)-(七)整体代码结构","\u002Fverilog\u002Fmips7","4.verilog\u002F07.mips7",{"title":120,"path":121,"stem":122},"31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器","\u002Fverilog\u002Fmips8","4.verilog\u002F08.mips8",{"title":124,"path":125,"stem":126},"31条指令单周期cpu设计(Verilog)-(九)上代码→基础模块实现","\u002Fverilog\u002Fmips9","4.verilog\u002F09.mips9",{"title":128,"path":129,"stem":130},"31条指令单周期cpu设计(Verilog)-(十)上代码→顶层模块设计&总结","\u002Fverilog\u002Fmips10","4.verilog\u002F10.mips10",{"title":132,"icon":35,"path":133,"stem":134,"children":135,"page":35},"Rust","\u002Frust","5.rust",[136,140],{"title":137,"path":138,"stem":139},"egui(一)从编译运行template开始","\u002Frust\u002Fegui1","5.rust\u002F01.egui1",{"title":141,"path":142,"stem":143},"egui(二)看看template的main函数：日志输出以及eframe run_native","\u002Frust\u002Fegui2","5.rust\u002F02.egui2",{"id":145,"title":75,"body":146,"description":1710,"extension":1711,"links":1712,"meta":1713,"navigation":54,"path":76,"seo":1714,"stem":77,"__hash__":1717},"docs\u002F3.llm\u002F05.eino1.md",{"type":147,"value":148,"toc":1704},"minimark",[149,154,177,181,433,437,854,857,1330,1700],[150,151,153],"h2",{"id":152},"eino","Eino",[155,156,157,161,170],"ul",{},[158,159,160],"li",{},"字节基于 Golang 的 AI 应用开发框架",[158,162,163],{},[164,165,169],"a",{"href":166,"rel":167},"https:\u002F\u002Fgithub.com\u002Fcloudwego\u002Feino",[168],"nofollow","github",[158,171,172],{},[164,173,176],{"href":174,"rel":175},"https:\u002F\u002Fwww.cloudwego.io\u002Fzh\u002Fdocs\u002Feino\u002Foverview\u002F",[168],"文档",[150,178,180],{"id":179},"message","Message",[155,182,183,186,403],{},[158,184,185],{},"对话的基本单位",[158,187,188,189],{},"定义\n",[190,191,196],"pre",{"className":192,"code":193,"language":194,"meta":195,"style":195},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type Message struct {\n    Role RoleType `json:\"role\"`\n\n    \u002F\u002F 消息内容 用户或者模型的实际输出文本\n    Content string `json:\"content\"`\n\n    \u002F\u002F MultiContent 多模态消息内容 用户或者模型的多模态输出文本\n    \u002F\u002F 如果 MultiContent 不为空，使用 MultiContent 而不是 Content\n    \u002F\u002F Deprecated: Use UserInputMultiContent for user multimodal inputs and AssistantGenMultiContent for model multimodal outputs.\n    MultiContent []ChatMessagePart `json:\"multi_content,omitempty\"`\n\n    \u002F\u002F UserInputMultiContent passes multimodal content provided by the user to the model.\n    UserInputMultiContent []MessageInputPart `json:\"user_input_multi_content,omitempty\"`\n\n    \u002F\u002F AssistantGenMultiContent is for receiving multimodal output from the model.\n    AssistantGenMultiContent []MessageOutputPart `json:\"assistant_output_multi_content,omitempty\"`\n\n    Name string `json:\"name,omitempty\"`\n\n    \u002F\u002F ToolCalls 工具调用列表 仅用于模型回复\n    ToolCalls []ToolCall `json:\"tool_calls,omitempty\"`\n\n    \u002F\u002F 工具调用ID 仅用于工具调用消息\n    ToolCallID string `json:\"tool_call_id,omitempty\"`\n    \u002F\u002F 工具名称 仅用于工具调用消息\n    ToolName string `json:\"tool_name,omitempty\"`\n\n    ResponseMeta *ResponseMeta `json:\"response_meta,omitempty\"`\n\n    \u002F\u002F ReasoningContent is the thinking process of the model, which will be included when the model returns reasoning content.\n    ReasoningContent string `json:\"reasoning_content,omitempty\"`\n\n    \u002F\u002F customized information for model implementation\n    Extra map[string]any `json:\"extra,omitempty\"`\n}\n","go","",[197,198,199,207,213,220,226,232,237,243,249,255,261,266,272,278,283,289,295,300,306,311,317,323,328,334,340,346,352,357,363,368,374,380,385,391,397],"code",{"__ignoreMap":195},[200,201,204],"span",{"class":202,"line":203},"line",1,[200,205,206],{},"type Message struct {\n",[200,208,210],{"class":202,"line":209},2,[200,211,212],{},"    Role RoleType `json:\"role\"`\n",[200,214,216],{"class":202,"line":215},3,[200,217,219],{"emptyLinePlaceholder":218},true,"\n",[200,221,223],{"class":202,"line":222},4,[200,224,225],{},"    \u002F\u002F 消息内容 用户或者模型的实际输出文本\n",[200,227,229],{"class":202,"line":228},5,[200,230,231],{},"    Content string `json:\"content\"`\n",[200,233,235],{"class":202,"line":234},6,[200,236,219],{"emptyLinePlaceholder":218},[200,238,240],{"class":202,"line":239},7,[200,241,242],{},"    \u002F\u002F MultiContent 多模态消息内容 用户或者模型的多模态输出文本\n",[200,244,246],{"class":202,"line":245},8,[200,247,248],{},"    \u002F\u002F 如果 MultiContent 不为空，使用 MultiContent 而不是 Content\n",[200,250,252],{"class":202,"line":251},9,[200,253,254],{},"    \u002F\u002F Deprecated: Use UserInputMultiContent for user multimodal inputs and AssistantGenMultiContent for model multimodal outputs.\n",[200,256,258],{"class":202,"line":257},10,[200,259,260],{},"    MultiContent []ChatMessagePart `json:\"multi_content,omitempty\"`\n",[200,262,264],{"class":202,"line":263},11,[200,265,219],{"emptyLinePlaceholder":218},[200,267,269],{"class":202,"line":268},12,[200,270,271],{},"    \u002F\u002F UserInputMultiContent passes multimodal content provided by the user to the model.\n",[200,273,275],{"class":202,"line":274},13,[200,276,277],{},"    UserInputMultiContent []MessageInputPart `json:\"user_input_multi_content,omitempty\"`\n",[200,279,281],{"class":202,"line":280},14,[200,282,219],{"emptyLinePlaceholder":218},[200,284,286],{"class":202,"line":285},15,[200,287,288],{},"    \u002F\u002F AssistantGenMultiContent is for receiving multimodal output from the model.\n",[200,290,292],{"class":202,"line":291},16,[200,293,294],{},"    AssistantGenMultiContent []MessageOutputPart `json:\"assistant_output_multi_content,omitempty\"`\n",[200,296,298],{"class":202,"line":297},17,[200,299,219],{"emptyLinePlaceholder":218},[200,301,303],{"class":202,"line":302},18,[200,304,305],{},"    Name string `json:\"name,omitempty\"`\n",[200,307,309],{"class":202,"line":308},19,[200,310,219],{"emptyLinePlaceholder":218},[200,312,314],{"class":202,"line":313},20,[200,315,316],{},"    \u002F\u002F ToolCalls 工具调用列表 仅用于模型回复\n",[200,318,320],{"class":202,"line":319},21,[200,321,322],{},"    ToolCalls []ToolCall `json:\"tool_calls,omitempty\"`\n",[200,324,326],{"class":202,"line":325},22,[200,327,219],{"emptyLinePlaceholder":218},[200,329,331],{"class":202,"line":330},23,[200,332,333],{},"    \u002F\u002F 工具调用ID 仅用于工具调用消息\n",[200,335,337],{"class":202,"line":336},24,[200,338,339],{},"    ToolCallID string `json:\"tool_call_id,omitempty\"`\n",[200,341,343],{"class":202,"line":342},25,[200,344,345],{},"    \u002F\u002F 工具名称 仅用于工具调用消息\n",[200,347,349],{"class":202,"line":348},26,[200,350,351],{},"    ToolName string `json:\"tool_name,omitempty\"`\n",[200,353,355],{"class":202,"line":354},27,[200,356,219],{"emptyLinePlaceholder":218},[200,358,360],{"class":202,"line":359},28,[200,361,362],{},"    ResponseMeta *ResponseMeta `json:\"response_meta,omitempty\"`\n",[200,364,366],{"class":202,"line":365},29,[200,367,219],{"emptyLinePlaceholder":218},[200,369,371],{"class":202,"line":370},30,[200,372,373],{},"    \u002F\u002F ReasoningContent is the thinking process of the model, which will be included when the model returns reasoning content.\n",[200,375,377],{"class":202,"line":376},31,[200,378,379],{},"    ReasoningContent string `json:\"reasoning_content,omitempty\"`\n",[200,381,383],{"class":202,"line":382},32,[200,384,219],{"emptyLinePlaceholder":218},[200,386,388],{"class":202,"line":387},33,[200,389,390],{},"    \u002F\u002F customized information for model implementation\n",[200,392,394],{"class":202,"line":393},34,[200,395,396],{},"    Extra map[string]any `json:\"extra,omitempty\"`\n",[200,398,400],{"class":202,"line":399},35,[200,401,402],{},"}\n",[158,404,405,406],{},"RoleType\n",[155,407,408,415,421,427],{},[158,409,410,411,414],{},"Assistant = \"assistant\"",[412,413],"br",{},"模型回复",[158,416,417,418,420],{},"User = \"user\"",[412,419],{},"用户输入",[158,422,423,424,426],{},"System = \"system\"",[412,425],{},"系统提示",[158,428,429,430,432],{},"Tool = \"tool\"",[412,431],{},"工具调用",[150,434,436],{"id":435},"chatmodel","ChatModel",[155,438,439,442,474,494,557,708],{},[158,440,441],{},"对话模型",[158,443,444,445],{},"定义",[190,446,448],{"className":192,"code":447,"language":194,"meta":195,"style":195},"type BaseChatModel interface {\n    Generate(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.Message, error)\n    Stream(ctx context.Context, input []*schema.Message, opts ...Option) (\n      *schema.StreamReader[*schema.Message], error)\n}\n",[197,449,450,455,460,465,470],{"__ignoreMap":195},[200,451,452],{"class":202,"line":203},[200,453,454],{},"type BaseChatModel interface {\n",[200,456,457],{"class":202,"line":209},[200,458,459],{},"    Generate(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.Message, error)\n",[200,461,462],{"class":202,"line":215},[200,463,464],{},"    Stream(ctx context.Context, input []*schema.Message, opts ...Option) (\n",[200,466,467],{"class":202,"line":222},[200,468,469],{},"      *schema.StreamReader[*schema.Message], error)\n",[200,471,472],{"class":202,"line":228},[200,473,402],{},[158,475,476,479,480],{},[197,477,478],{},"BaseChatModel"," 定义了对话模型的基本接口",[155,481,482,488],{},[158,483,484,487],{},[197,485,486],{},"Generate"," 生成单次消息的完整返回",[158,489,490,493],{},[197,491,492],{},"Stream"," 生成一条消息的流式返回，即模型会实时返回消息的内容（通常是一个token一个token的返回），而不是等待模型完成后再返回",[158,495,496,497,546,548,549,552,553,556],{},"eino 提供了多个对话模型的实现，如 OpenAI、Claude等，在使用时需要调用对应的实现",[190,498,500],{"className":192,"code":499,"language":194,"meta":195,"style":195},"import (\n  \"github.com\u002Fcloudwego\u002Feino-ext\u002Fcomponents\u002Fmodel\u002Fopenai\"\n)\n\nchatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{\n    Model:   \"qwen\u002Fqwen3.6-plus:free\",\n    BaseURL: \"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\",\n    APIKey:  \"\",\n  })\n",[197,501,502,507,512,517,521,526,531,536,541],{"__ignoreMap":195},[200,503,504],{"class":202,"line":203},[200,505,506],{},"import (\n",[200,508,509],{"class":202,"line":209},[200,510,511],{},"  \"github.com\u002Fcloudwego\u002Feino-ext\u002Fcomponents\u002Fmodel\u002Fopenai\"\n",[200,513,514],{"class":202,"line":215},[200,515,516],{},")\n",[200,518,519],{"class":202,"line":222},[200,520,219],{"emptyLinePlaceholder":218},[200,522,523],{"class":202,"line":228},[200,524,525],{},"chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{\n",[200,527,528],{"class":202,"line":234},[200,529,530],{},"    Model:   \"qwen\u002Fqwen3.6-plus:free\",\n",[200,532,533],{"class":202,"line":239},[200,534,535],{},"    BaseURL: \"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\",\n",[200,537,538],{"class":202,"line":245},[200,539,540],{},"    APIKey:  \"\",\n",[200,542,543],{"class":202,"line":251},[200,544,545],{},"  })\n",[412,547],{},"如上述代码所示，",[197,550,551],{},"chatModel"," 就是一个 OpenAI 对话模型的实例，可以使用",[197,554,555],{},"BaseURL","来指定模型的 API 地址，来调用OpenAI Compatible API",[158,558,559,561,562,596,598,599],{},[197,560,486],{}," 方法使用示例",[190,563,565],{"className":192,"code":564,"language":194,"meta":195,"style":195},"ret, err := chatModel.Generate(ctx, messages)\nif err != nil {\n  _, _ = fmt.Fprintln(os.Stderr, err)\n  os.Exit(1)\n}\nfmt.Println(ret.String())\n",[197,566,567,572,577,582,587,591],{"__ignoreMap":195},[200,568,569],{"class":202,"line":203},[200,570,571],{},"ret, err := chatModel.Generate(ctx, messages)\n",[200,573,574],{"class":202,"line":209},[200,575,576],{},"if err != nil {\n",[200,578,579],{"class":202,"line":215},[200,580,581],{},"  _, _ = fmt.Fprintln(os.Stderr, err)\n",[200,583,584],{"class":202,"line":222},[200,585,586],{},"  os.Exit(1)\n",[200,588,589],{"class":202,"line":228},[200,590,402],{},[200,592,593],{"class":202,"line":234},[200,594,595],{},"fmt.Println(ret.String())\n",[412,597],{},"输出示例",[190,600,604],{"className":601,"code":602,"language":603,"meta":195,"style":195},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","assistant: Hello! How can I assist you today?\nreasoning content:\n\"Here's a thinking process:\\n\\n1.  **Analyze User Input:** The user said \\\"hello\\\". This is a simple greeting.\\n2.  **Identify Intent:** The user is initiating a conversation.\\n3.  **Determine Response Strategy:** \\n   - Acknowledge the greeting warmly.\\n   - Offer assistance.\\n   - Keep it concise and friendly.\\n4.  **Draft Response:** \\\"Hello! How can I assist you today?\\\" or \\\"Hi there! What can I help you with?\\\"\\n5.  **Refine Response:** Both are good. I'll go with a friendly, open-ended response that invites the user to ask a question or state their need.\\n6.  **Final Output Generation:** \\\"Hello! How can I assist you today?\\\" (matches the refined response)✅\"\nfinish_reason: stop\nusage: &{22 {0} 184 206 {170}}\n","shell",[197,605,606,634,642,688,696],{"__ignoreMap":195},[200,607,608,612,616,619,622,625,628,631],{"class":202,"line":203},[200,609,611],{"class":610},"sBMFI","assistant:",[200,613,615],{"class":614},"sfazB"," Hello!",[200,617,618],{"class":614}," How",[200,620,621],{"class":614}," can",[200,623,624],{"class":614}," I",[200,626,627],{"class":614}," assist",[200,629,630],{"class":614}," you",[200,632,633],{"class":614}," today?\n",[200,635,636,639],{"class":202,"line":209},[200,637,638],{"class":610},"reasoning",[200,640,641],{"class":614}," content:\n",[200,643,644,647,651,654,656,659,661,664,666,669,671,674,676,679,681,683,685],{"class":202,"line":215},[200,645,646],{"class":610},"\"Here's a thinking process:\\n\\n1.  **Analyze User Input:** The user said ",[200,648,650],{"class":649},"sTEyZ","\\\"",[200,652,653],{"class":610},"hello",[200,655,650],{"class":649},[200,657,658],{"class":610},". This is a simple greeting.\\n2.  **Identify Intent:** The user is initiating a conversation.\\n3.  **Determine Response Strategy:** \\n   - Acknowledge the greeting warmly.\\n   - Offer assistance.\\n   - Keep it concise and friendly.\\n4.  **Draft Response:** ",[200,660,650],{"class":649},[200,662,663],{"class":610},"Hello! How can I assist you today?",[200,665,650],{"class":649},[200,667,668],{"class":610}," or ",[200,670,650],{"class":649},[200,672,673],{"class":610},"Hi there! What can I help you with?",[200,675,650],{"class":649},[200,677,678],{"class":610},"\\n5.  **Refine Response:** Both are good. I'll go with a friendly, open-ended response that invites the user to ask a question or state their need.\\n6.  **Final Output Generation:** ",[200,680,650],{"class":649},[200,682,663],{"class":610},[200,684,650],{"class":649},[200,686,687],{"class":610}," (matches the refined response)✅\"\n",[200,689,690,693],{"class":202,"line":222},[200,691,692],{"class":610},"finish_reason:",[200,694,695],{"class":614}," stop\n",[200,697,698,701,705],{"class":202,"line":228},[200,699,700],{"class":610},"usage:",[200,702,704],{"class":703},"sMK4o"," &",[200,706,707],{"class":649},"{22 {0} 184 206 {170}}\n",[158,709,710,561,712,818,598,820],{},[197,711,492],{},[190,713,715],{"className":192,"code":714,"language":194,"meta":195,"style":195},"stream, err := cm.Stream(ctx, messages)\n  if err != nil {\n    _, _ = fmt.Fprintln(os.Stderr, err)\n    os.Exit(1)\n  }\n  defer stream.Close()\n\n  for {\n    frame, err := stream.Recv()\n    if errors.Is(err, io.EOF) {\n      break\n    }\n    if err != nil {\n      _, _ = fmt.Fprintln(os.Stderr, err)\n      os.Exit(1)\n    }\n    if frame != nil {\n      _, _ = fmt.Fprint(os.Stdout, frame.Content)\n    }\n  }\n  _, _ = fmt.Fprintln(os.Stdout)\n",[197,716,717,722,727,732,737,742,747,751,756,761,766,771,776,781,786,791,795,800,805,809,813],{"__ignoreMap":195},[200,718,719],{"class":202,"line":203},[200,720,721],{},"stream, err := cm.Stream(ctx, messages)\n",[200,723,724],{"class":202,"line":209},[200,725,726],{},"  if err != nil {\n",[200,728,729],{"class":202,"line":215},[200,730,731],{},"    _, _ = fmt.Fprintln(os.Stderr, err)\n",[200,733,734],{"class":202,"line":222},[200,735,736],{},"    os.Exit(1)\n",[200,738,739],{"class":202,"line":228},[200,740,741],{},"  }\n",[200,743,744],{"class":202,"line":234},[200,745,746],{},"  defer stream.Close()\n",[200,748,749],{"class":202,"line":239},[200,750,219],{"emptyLinePlaceholder":218},[200,752,753],{"class":202,"line":245},[200,754,755],{},"  for {\n",[200,757,758],{"class":202,"line":251},[200,759,760],{},"    frame, err := stream.Recv()\n",[200,762,763],{"class":202,"line":257},[200,764,765],{},"    if errors.Is(err, io.EOF) {\n",[200,767,768],{"class":202,"line":263},[200,769,770],{},"      break\n",[200,772,773],{"class":202,"line":268},[200,774,775],{},"    }\n",[200,777,778],{"class":202,"line":274},[200,779,780],{},"    if err != nil {\n",[200,782,783],{"class":202,"line":280},[200,784,785],{},"      _, _ = fmt.Fprintln(os.Stderr, err)\n",[200,787,788],{"class":202,"line":285},[200,789,790],{},"      os.Exit(1)\n",[200,792,793],{"class":202,"line":291},[200,794,775],{},[200,796,797],{"class":202,"line":297},[200,798,799],{},"    if frame != nil {\n",[200,801,802],{"class":202,"line":302},[200,803,804],{},"      _, _ = fmt.Fprint(os.Stdout, frame.Content)\n",[200,806,807],{"class":202,"line":308},[200,808,775],{},[200,810,811],{"class":202,"line":313},[200,812,741],{},[200,814,815],{"class":202,"line":319},[200,816,817],{},"  _, _ = fmt.Fprintln(os.Stdout)\n",[412,819],{},[190,821,823],{"className":601,"code":822,"language":603,"meta":195,"style":195},"[assistant] Hello! How can I assist you today?\n",[197,824,825],{"__ignoreMap":195},[200,826,827,830,833,836,839,842,844,846,848,850,852],{"class":202,"line":203},[200,828,829],{"class":703},"[",[200,831,832],{"class":649},"assistant",[200,834,835],{"class":703},"]",[200,837,838],{"class":649}," Hello",[200,840,841],{"class":703},"!",[200,843,618],{"class":610},[200,845,621],{"class":614},[200,847,624],{"class":614},[200,849,627],{"class":614},[200,851,630],{"class":614},[200,853,633],{"class":614},[150,855,856],{"id":856},"交互式完整示例",[190,858,860],{"className":192,"code":859,"language":194,"meta":195,"style":195},"package main\n\nimport (\n    \"bufio\"\n    \"context\"\n    \"errors\"\n    \"flag\"\n    \"fmt\"\n    \"io\"\n    \"os\"\n    \"strings\"\n\n    \"github.com\u002Fcloudwego\u002Feino-ext\u002Fcomponents\u002Fmodel\u002Fopenai\"\n    \"github.com\u002Fcloudwego\u002Feino\u002Fcomponents\u002Fmodel\"\n    \"github.com\u002Fcloudwego\u002Feino\u002Fschema\"\n)\n\nfunc main() {\n    var instruction string\n    flag.StringVar(&instruction, \"instruction\", \"You are a helpful assistant.\", \"\")\n    flag.Parse()\n\n    ctx := context.Background()\n    cm, err := newChatModel(ctx)\n    if err != nil {\n        _, _ = fmt.Fprintln(os.Stderr, err)\n        os.Exit(1)\n    }\n\n    fmt.Println(\"Chat session started. Type 'exit' or 'quit' to end.\")\n    scanner := bufio.NewScanner(os.Stdin)\n\n    messages := []*schema.Message{\n        schema.SystemMessage(instruction),\n    }\n    for {\n        fmt.Print(\"\\n[User] \")\n        if !scanner.Scan() {\n            break\n        }\n\n        query := strings.TrimSpace(scanner.Text())\n        if query == \"\" {\n            continue\n        }\n\n        if query == \"exit\" || query == \"quit\" {\n            break\n        }\n\n        messages = append(messages, schema.UserMessage(query))\n\n        fmt.Print(\"[Assistant] \")\n        stream, err := cm.Stream(ctx, messages)\n        if err != nil {\n            fmt.Fprintf(os.Stderr, \"\\nError: %v\\n\", err)\n            continue\n        }\n\n        var response string\n        for {\n            frame, err := stream.Recv()\n            if errors.Is(err, io.EOF) {\n                break\n            }\n            if err != nil {\n                fmt.Fprintf(os.Stderr, \"\\nStream error: %v\\n\", err)\n                break\n            }\n            if frame != nil {\n                fmt.Print(frame.Content)\n                response += frame.Content\n            }\n        }\n\n        messages = append(messages, schema.AssistantMessage(response, nil))\n\n        fmt.Println()\n        stream.Close()\n    }\n}\n\nfunc newChatModel(ctx context.Context) (model.ToolCallingChatModel, error) {\n    return openai.NewChatModel(ctx, &openai.ChatModelConfig{\n        APIKey:  \"\",\n        Model:   \"qwen\u002Fqwen3.6-plus:free\",\n        BaseURL: \"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\",\n    })\n}\n\n",[197,861,862,867,871,875,880,885,890,895,900,905,910,915,919,924,929,934,938,942,947,952,957,962,966,971,976,980,985,990,994,998,1003,1008,1012,1017,1022,1026,1032,1038,1044,1050,1056,1061,1067,1073,1079,1084,1089,1095,1100,1105,1110,1116,1121,1127,1133,1139,1145,1150,1155,1160,1166,1172,1178,1184,1190,1196,1202,1208,1213,1218,1224,1230,1236,1241,1246,1251,1257,1262,1268,1274,1279,1284,1289,1295,1301,1307,1313,1319,1325],{"__ignoreMap":195},[200,863,864],{"class":202,"line":203},[200,865,866],{},"package main\n",[200,868,869],{"class":202,"line":209},[200,870,219],{"emptyLinePlaceholder":218},[200,872,873],{"class":202,"line":215},[200,874,506],{},[200,876,877],{"class":202,"line":222},[200,878,879],{},"    \"bufio\"\n",[200,881,882],{"class":202,"line":228},[200,883,884],{},"    \"context\"\n",[200,886,887],{"class":202,"line":234},[200,888,889],{},"    \"errors\"\n",[200,891,892],{"class":202,"line":239},[200,893,894],{},"    \"flag\"\n",[200,896,897],{"class":202,"line":245},[200,898,899],{},"    \"fmt\"\n",[200,901,902],{"class":202,"line":251},[200,903,904],{},"    \"io\"\n",[200,906,907],{"class":202,"line":257},[200,908,909],{},"    \"os\"\n",[200,911,912],{"class":202,"line":263},[200,913,914],{},"    \"strings\"\n",[200,916,917],{"class":202,"line":268},[200,918,219],{"emptyLinePlaceholder":218},[200,920,921],{"class":202,"line":274},[200,922,923],{},"    \"github.com\u002Fcloudwego\u002Feino-ext\u002Fcomponents\u002Fmodel\u002Fopenai\"\n",[200,925,926],{"class":202,"line":280},[200,927,928],{},"    \"github.com\u002Fcloudwego\u002Feino\u002Fcomponents\u002Fmodel\"\n",[200,930,931],{"class":202,"line":285},[200,932,933],{},"    \"github.com\u002Fcloudwego\u002Feino\u002Fschema\"\n",[200,935,936],{"class":202,"line":291},[200,937,516],{},[200,939,940],{"class":202,"line":297},[200,941,219],{"emptyLinePlaceholder":218},[200,943,944],{"class":202,"line":302},[200,945,946],{},"func main() {\n",[200,948,949],{"class":202,"line":308},[200,950,951],{},"    var instruction string\n",[200,953,954],{"class":202,"line":313},[200,955,956],{},"    flag.StringVar(&instruction, \"instruction\", \"You are a helpful assistant.\", \"\")\n",[200,958,959],{"class":202,"line":319},[200,960,961],{},"    flag.Parse()\n",[200,963,964],{"class":202,"line":325},[200,965,219],{"emptyLinePlaceholder":218},[200,967,968],{"class":202,"line":330},[200,969,970],{},"    ctx := context.Background()\n",[200,972,973],{"class":202,"line":336},[200,974,975],{},"    cm, err := newChatModel(ctx)\n",[200,977,978],{"class":202,"line":342},[200,979,780],{},[200,981,982],{"class":202,"line":348},[200,983,984],{},"        _, _ = fmt.Fprintln(os.Stderr, err)\n",[200,986,987],{"class":202,"line":354},[200,988,989],{},"        os.Exit(1)\n",[200,991,992],{"class":202,"line":359},[200,993,775],{},[200,995,996],{"class":202,"line":365},[200,997,219],{"emptyLinePlaceholder":218},[200,999,1000],{"class":202,"line":370},[200,1001,1002],{},"    fmt.Println(\"Chat session started. Type 'exit' or 'quit' to end.\")\n",[200,1004,1005],{"class":202,"line":376},[200,1006,1007],{},"    scanner := bufio.NewScanner(os.Stdin)\n",[200,1009,1010],{"class":202,"line":382},[200,1011,219],{"emptyLinePlaceholder":218},[200,1013,1014],{"class":202,"line":387},[200,1015,1016],{},"    messages := []*schema.Message{\n",[200,1018,1019],{"class":202,"line":393},[200,1020,1021],{},"        schema.SystemMessage(instruction),\n",[200,1023,1024],{"class":202,"line":399},[200,1025,775],{},[200,1027,1029],{"class":202,"line":1028},36,[200,1030,1031],{},"    for {\n",[200,1033,1035],{"class":202,"line":1034},37,[200,1036,1037],{},"        fmt.Print(\"\\n[User] \")\n",[200,1039,1041],{"class":202,"line":1040},38,[200,1042,1043],{},"        if !scanner.Scan() {\n",[200,1045,1047],{"class":202,"line":1046},39,[200,1048,1049],{},"            break\n",[200,1051,1053],{"class":202,"line":1052},40,[200,1054,1055],{},"        }\n",[200,1057,1059],{"class":202,"line":1058},41,[200,1060,219],{"emptyLinePlaceholder":218},[200,1062,1064],{"class":202,"line":1063},42,[200,1065,1066],{},"        query := strings.TrimSpace(scanner.Text())\n",[200,1068,1070],{"class":202,"line":1069},43,[200,1071,1072],{},"        if query == \"\" {\n",[200,1074,1076],{"class":202,"line":1075},44,[200,1077,1078],{},"            continue\n",[200,1080,1082],{"class":202,"line":1081},45,[200,1083,1055],{},[200,1085,1087],{"class":202,"line":1086},46,[200,1088,219],{"emptyLinePlaceholder":218},[200,1090,1092],{"class":202,"line":1091},47,[200,1093,1094],{},"        if query == \"exit\" || query == \"quit\" {\n",[200,1096,1098],{"class":202,"line":1097},48,[200,1099,1049],{},[200,1101,1103],{"class":202,"line":1102},49,[200,1104,1055],{},[200,1106,1108],{"class":202,"line":1107},50,[200,1109,219],{"emptyLinePlaceholder":218},[200,1111,1113],{"class":202,"line":1112},51,[200,1114,1115],{},"        messages = append(messages, schema.UserMessage(query))\n",[200,1117,1119],{"class":202,"line":1118},52,[200,1120,219],{"emptyLinePlaceholder":218},[200,1122,1124],{"class":202,"line":1123},53,[200,1125,1126],{},"        fmt.Print(\"[Assistant] \")\n",[200,1128,1130],{"class":202,"line":1129},54,[200,1131,1132],{},"        stream, err := cm.Stream(ctx, messages)\n",[200,1134,1136],{"class":202,"line":1135},55,[200,1137,1138],{},"        if err != nil {\n",[200,1140,1142],{"class":202,"line":1141},56,[200,1143,1144],{},"            fmt.Fprintf(os.Stderr, \"\\nError: %v\\n\", err)\n",[200,1146,1148],{"class":202,"line":1147},57,[200,1149,1078],{},[200,1151,1153],{"class":202,"line":1152},58,[200,1154,1055],{},[200,1156,1158],{"class":202,"line":1157},59,[200,1159,219],{"emptyLinePlaceholder":218},[200,1161,1163],{"class":202,"line":1162},60,[200,1164,1165],{},"        var response string\n",[200,1167,1169],{"class":202,"line":1168},61,[200,1170,1171],{},"        for {\n",[200,1173,1175],{"class":202,"line":1174},62,[200,1176,1177],{},"            frame, err := stream.Recv()\n",[200,1179,1181],{"class":202,"line":1180},63,[200,1182,1183],{},"            if errors.Is(err, io.EOF) {\n",[200,1185,1187],{"class":202,"line":1186},64,[200,1188,1189],{},"                break\n",[200,1191,1193],{"class":202,"line":1192},65,[200,1194,1195],{},"            }\n",[200,1197,1199],{"class":202,"line":1198},66,[200,1200,1201],{},"            if err != nil {\n",[200,1203,1205],{"class":202,"line":1204},67,[200,1206,1207],{},"                fmt.Fprintf(os.Stderr, \"\\nStream error: %v\\n\", err)\n",[200,1209,1211],{"class":202,"line":1210},68,[200,1212,1189],{},[200,1214,1216],{"class":202,"line":1215},69,[200,1217,1195],{},[200,1219,1221],{"class":202,"line":1220},70,[200,1222,1223],{},"            if frame != nil {\n",[200,1225,1227],{"class":202,"line":1226},71,[200,1228,1229],{},"                fmt.Print(frame.Content)\n",[200,1231,1233],{"class":202,"line":1232},72,[200,1234,1235],{},"                response += frame.Content\n",[200,1237,1239],{"class":202,"line":1238},73,[200,1240,1195],{},[200,1242,1244],{"class":202,"line":1243},74,[200,1245,1055],{},[200,1247,1249],{"class":202,"line":1248},75,[200,1250,219],{"emptyLinePlaceholder":218},[200,1252,1254],{"class":202,"line":1253},76,[200,1255,1256],{},"        messages = append(messages, schema.AssistantMessage(response, nil))\n",[200,1258,1260],{"class":202,"line":1259},77,[200,1261,219],{"emptyLinePlaceholder":218},[200,1263,1265],{"class":202,"line":1264},78,[200,1266,1267],{},"        fmt.Println()\n",[200,1269,1271],{"class":202,"line":1270},79,[200,1272,1273],{},"        stream.Close()\n",[200,1275,1277],{"class":202,"line":1276},80,[200,1278,775],{},[200,1280,1282],{"class":202,"line":1281},81,[200,1283,402],{},[200,1285,1287],{"class":202,"line":1286},82,[200,1288,219],{"emptyLinePlaceholder":218},[200,1290,1292],{"class":202,"line":1291},83,[200,1293,1294],{},"func newChatModel(ctx context.Context) (model.ToolCallingChatModel, error) {\n",[200,1296,1298],{"class":202,"line":1297},84,[200,1299,1300],{},"    return openai.NewChatModel(ctx, &openai.ChatModelConfig{\n",[200,1302,1304],{"class":202,"line":1303},85,[200,1305,1306],{},"        APIKey:  \"\",\n",[200,1308,1310],{"class":202,"line":1309},86,[200,1311,1312],{},"        Model:   \"qwen\u002Fqwen3.6-plus:free\",\n",[200,1314,1316],{"class":202,"line":1315},87,[200,1317,1318],{},"        BaseURL: \"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\",\n",[200,1320,1322],{"class":202,"line":1321},88,[200,1323,1324],{},"    })\n",[200,1326,1328],{"class":202,"line":1327},89,[200,1329,402],{},[190,1331,1333],{"className":601,"code":1332,"language":603,"meta":195,"style":195},"Chat session started. Type 'exit' or 'quit' to end.\n\n[User] hello\n[Assistant] Hello! How can I help you today?\n\n[User] i am spider man, remember this!\n[Assistant] Got it, Spider-Man! 🕷️ I'll keep that in mind for the rest of our conversation. Just a quick heads-up: I don't haave persistent memory between chats, so if you start a new session later, I might need a quick reminder. But for now, your web-slinger status is officially noted! \n\nWhat's on your mind today? Stopping villains, working through some Parker-level science homework, or just swinging by to chat?\n\n[User] who am i\n[Assistant] You're Spider-Man! 🕷️ You told me just a moment ago, and I've got it noted for this chat. \n\nWhat's up, web-head? Need help tracking down a villain, troubleshooting some web-fluid chemistry, or just working through the daily superhero life balance? 😄\n\n[User]\n",[197,1334,1335,1374,1378,1390,1416,1420,1434,1549,1553,1561,1565,1570,1612,1616,1687,1691],{"__ignoreMap":195},[200,1336,1337,1340,1343,1346,1349,1352,1355,1358,1361,1363,1366,1368,1371],{"class":202,"line":203},[200,1338,1339],{"class":610},"Chat",[200,1341,1342],{"class":614}," session",[200,1344,1345],{"class":614}," started.",[200,1347,1348],{"class":614}," Type",[200,1350,1351],{"class":703}," '",[200,1353,1354],{"class":614},"exit",[200,1356,1357],{"class":703},"'",[200,1359,1360],{"class":614}," or",[200,1362,1351],{"class":703},[200,1364,1365],{"class":614},"quit",[200,1367,1357],{"class":703},[200,1369,1370],{"class":614}," to",[200,1372,1373],{"class":614}," end.\n",[200,1375,1376],{"class":202,"line":209},[200,1377,219],{"emptyLinePlaceholder":218},[200,1379,1380,1382,1385,1387],{"class":202,"line":215},[200,1381,829],{"class":703},[200,1383,1384],{"class":649},"User",[200,1386,835],{"class":703},[200,1388,1389],{"class":649}," hello\n",[200,1391,1392,1394,1397,1399,1401,1403,1405,1407,1409,1412,1414],{"class":202,"line":222},[200,1393,829],{"class":703},[200,1395,1396],{"class":649},"Assistant",[200,1398,835],{"class":703},[200,1400,838],{"class":649},[200,1402,841],{"class":703},[200,1404,618],{"class":610},[200,1406,621],{"class":614},[200,1408,624],{"class":614},[200,1410,1411],{"class":614}," help",[200,1413,630],{"class":614},[200,1415,633],{"class":614},[200,1417,1418],{"class":202,"line":228},[200,1419,219],{"emptyLinePlaceholder":218},[200,1421,1422,1424,1426,1428,1431],{"class":202,"line":234},[200,1423,829],{"class":703},[200,1425,1384],{"class":649},[200,1427,835],{"class":703},[200,1429,1430],{"class":649}," i am spider man, remember this",[200,1432,1433],{"class":703},"!\n",[200,1435,1436,1438,1440,1442,1445,1448,1451,1454,1456,1458,1461,1463,1466,1469,1472,1475,1478,1481,1484,1487,1489,1492,1495,1498,1500,1503,1505,1508,1511,1513,1516,1519,1522,1525,1528,1531,1534,1537,1540,1543,1546],{"class":202,"line":239},[200,1437,829],{"class":703},[200,1439,1396],{"class":649},[200,1441,835],{"class":703},[200,1443,1444],{"class":610}," Got",[200,1446,1447],{"class":614}," it,",[200,1449,1450],{"class":614}," Spider-Man!",[200,1452,1453],{"class":614}," 🕷️",[200,1455,624],{"class":614},[200,1457,1357],{"class":703},[200,1459,1460],{"class":614},"ll keep that in mind for the rest of our conversation. Just a quick heads-up: I don",[200,1462,1357],{"class":703},[200,1464,1465],{"class":614},"t",[200,1467,1468],{"class":614}," haave",[200,1470,1471],{"class":614}," persistent",[200,1473,1474],{"class":614}," memory",[200,1476,1477],{"class":614}," between",[200,1479,1480],{"class":614}," chats,",[200,1482,1483],{"class":614}," so",[200,1485,1486],{"class":614}," if",[200,1488,630],{"class":614},[200,1490,1491],{"class":614}," start",[200,1493,1494],{"class":614}," a",[200,1496,1497],{"class":614}," new",[200,1499,1342],{"class":614},[200,1501,1502],{"class":614}," later,",[200,1504,624],{"class":614},[200,1506,1507],{"class":614}," might",[200,1509,1510],{"class":614}," need",[200,1512,1494],{"class":614},[200,1514,1515],{"class":614}," quick",[200,1517,1518],{"class":614}," reminder.",[200,1520,1521],{"class":614}," But",[200,1523,1524],{"class":614}," for",[200,1526,1527],{"class":614}," now,",[200,1529,1530],{"class":614}," your",[200,1532,1533],{"class":614}," web-slinger",[200,1535,1536],{"class":614}," status",[200,1538,1539],{"class":614}," is",[200,1541,1542],{"class":614}," officially",[200,1544,1545],{"class":614}," noted!",[200,1547,1548],{"class":649}," \n",[200,1550,1551],{"class":202,"line":245},[200,1552,219],{"emptyLinePlaceholder":218},[200,1554,1555,1558],{"class":202,"line":251},[200,1556,1557],{"class":610},"What",[200,1559,1560],{"class":610},"'s on your mind today? Stopping villains, working through some Parker-level science homework, or just swinging by to chat?\n",[200,1562,1563],{"class":202,"line":257},[200,1564,219],{"emptyLinePlaceholder":218},[200,1566,1567],{"class":202,"line":263},[200,1568,1569],{"class":610},"[User] who am i\n",[200,1571,1572,1575,1578,1580,1582,1585,1588,1591,1594,1596,1599,1602,1605,1607,1609],{"class":202,"line":268},[200,1573,1574],{"class":610},"[Assistant] You'",[200,1576,1577],{"class":610},"re",[200,1579,1450],{"class":614},[200,1581,1453],{"class":614},[200,1583,1584],{"class":614}," You",[200,1586,1587],{"class":614}," told",[200,1589,1590],{"class":614}," me",[200,1592,1593],{"class":614}," just",[200,1595,1494],{"class":614},[200,1597,1598],{"class":614}," moment",[200,1600,1601],{"class":614}," ago,",[200,1603,1604],{"class":614}," and",[200,1606,624],{"class":614},[200,1608,1357],{"class":703},[200,1610,1611],{"class":614},"ve got it noted for this chat. \n",[200,1613,1614],{"class":202,"line":274},[200,1615,219],{"emptyLinePlaceholder":218},[200,1617,1618,1620,1622,1625,1628,1631,1634,1636,1639,1642,1644,1647,1650,1653,1656,1659,1661,1663,1666,1669,1672,1675,1678,1681,1684],{"class":202,"line":280},[200,1619,1557],{"class":614},[200,1621,1357],{"class":703},[200,1623,1624],{"class":614},"s",[200,1626,1627],{"class":614}," up,",[200,1629,1630],{"class":614}," web-head?",[200,1632,1633],{"class":614}," Need",[200,1635,1411],{"class":614},[200,1637,1638],{"class":614}," tracking",[200,1640,1641],{"class":614}," down",[200,1643,1494],{"class":614},[200,1645,1646],{"class":614}," villain,",[200,1648,1649],{"class":614}," troubleshooting",[200,1651,1652],{"class":614}," some",[200,1654,1655],{"class":614}," web-fluid",[200,1657,1658],{"class":614}," chemistry,",[200,1660,1360],{"class":614},[200,1662,1593],{"class":614},[200,1664,1665],{"class":614}," working",[200,1667,1668],{"class":614}," through",[200,1670,1671],{"class":614}," the",[200,1673,1674],{"class":614}," daily",[200,1676,1677],{"class":614}," superhero",[200,1679,1680],{"class":614}," life",[200,1682,1683],{"class":614}," balance?",[200,1685,1686],{"class":614}," 😄\n",[200,1688,1689],{"class":202,"line":285},[200,1690,219],{"emptyLinePlaceholder":218},[200,1692,1693,1695,1697],{"class":202,"line":291},[200,1694,829],{"class":703},[200,1696,1384],{"class":649},[200,1698,1699],{"class":703},"]\n",[1701,1702,1703],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":195,"searchDepth":203,"depth":209,"links":1705},[1706,1707,1708,1709],{"id":152,"depth":209,"text":153},{"id":179,"depth":209,"text":180},{"id":435,"depth":209,"text":436},{"id":856,"depth":209,"text":856},"字节跳动 Eino Go 语言 AI 应用开发框架入门教程，介绍 Message 消息结构、RoleType 角色类型、ChatModel 对话模型接口以及 Generate\u002FStream 流式调用方法。","md",null,{},{"title":1715,"description":1716},"【llm\u002Feino】Eino框架入门 - Message与ChatModel基础使用","字节跳动 Eino Go 语言 AI 应用开发框架入门教程，介绍 Message 消息结构、RoleType 角色类型、ChatModel 对话模型接口以及 Generate\u002FStream 流式调用方法，包含完整交互式聊天示例。","UazssivBXMcH8wq2eum3gy9d-hbPfCxM5gVF31jG2_c",[1719,1721],{"title":71,"path":72,"stem":73,"description":1720,"children":-1},"详细介绍如何使用 Langchain 构建拥有 RAG 能力的代码问答应用，包括 DeepSeek API 集成、本地 bge-m3 嵌入模型配置、以及命令行版本实现。",{"title":79,"path":80,"stem":81,"description":1722,"children":-1},"字节跳动 Eino 框架工具调用教程，介绍 Tool 接口定义、ToolInfo 构造方法、JSON Schema 参数定义、限流重试处理以及完整的交互式工具调用示例。",1776616490416]