LLMCaller参考
本节是参考性质的速查手册,不是教程,大家只需有所了解即可。
LLMCaller是一个通用的OpenAI兼容API接口调用类,支持所有主流大语言模型,零依赖外部SDK,完全基于原生 HTTP 请求,极其轻量易用。
本节列出了LLMCaller的全部属性/方法供参考。
构造函数
使用LLMCaller之前,首先要构造LLMCaller。
LLMCaller提供了四种构造函数,分别是:
New()
New(BaseUrl)
New(BaseUrl,model)
New(BaseUrl,model,ApiKey) '最常用
| 参数 | 说明 |
|---|---|
BaseUrl |
大模型接入地址,如: https://api.deepseek.com/chat/completions |
| model | 大模型名称,如:deepseek-flash |
ApiKey |
API密钥,LLMCaller 内部实际使用的授权格式是 "Bearer 你的ApiKey",类内部会自动判断 ApiKey 是否以 "Bearer " 为前缀,如果不是,会自动拼上 "Bearer "。 |
连接与对话管理属性
下表是LLMCaller类的自身属性,用于连接与对话管理,不会写入请求体:
| 属性名 | 类型 | 说明 |
|---|---|---|
BaseUrl |
String | 大模型接入地址,必填,一般通过构造函数设置。如: https://api.deepseek.com/chat/completions |
ApiKey |
String |
API密钥,必填,一般通过构造函数设置。LLMCaller
内部实际使用的授权格式是 "Bearer 你的ApiKey",类内部会自动判断 ApiKey 是否以 "Bearer "
为前缀,如果不是,会自动拼上 "Bearer "。 所以下面两行代码其实是等效的: caller.ApiKey = "sk-a734b83536da45e9aedc3e42605bfb3a" '无前缀,类内部会自动补上 "Bearer "前缀 caller.ApiKey = "Bearer sk-a734b83536da45e9aedc3e42605bfb3a" '有前缀 |
Messages |
JArray | 对话历史(上下文),引用传递。 设置后则进入多轮对话模式,不设置则进入单轮对话模式 |
UserMessage |
String/JArray | 本轮用户问题,必填 |
SystemPrompt |
String |
系统提示词,仅当Messages为空时生效(首轮或单轮) |
Tools |
JArray | 工具定义集合 |
ToolExecutor |
Func(Of String, JObject, String) |
执行工具调用的回调函数。参数:(工具名,
参数对象) → 返回:执行结果字符串 |
SSEStreamHandler |
Action(Of String, String) |
接收流式分片数据的回调方法。参数:(类型,
内容),类型为 "think"/"answer"/"error",think
为推理过程,answer 为正式回答,error 为错误信息 |
MaxToolSteps |
Integer | 工具调用最大轮数,默认 10,防止死循环 |
Headers |
JObject |
自定义 HTTP 请求头。用于添加 LLM 特有的请求头(如 Azure OpenAI 的 api-key 头) |
访问请求方法与结果属性
| 方法/属性名 | 类型 | 说明 |
|---|---|---|
| GetResult | Boolean | 方法,同步获取API请求结果,成功返回True,失败返回False |
| GetResultAsync | Task(Of Boolean) | 方法,异步获取API请求结果,成功返回True,失败返回False,需要结合Await使用 |
| Cancel | 无 | 方法,在使用SSE流式输出的情景时,可以通过执行此方法中断API接口调用 |
| Result | String | 属性,调用成功后,返回 AI 响应的纯文本 |
| Think | String | 属性,调用成功后,返回AI的推理过程 |
| ResultJObject | JObject | 属性,调用成功后,返回完整的 API 响应对象 |
| Error | String | 属性,调用失败时,返回错误描述 |
| GetRequestBody | String | 方法,返回请求体的JSON字符串,一般用于专业开发人员的调试分析。 |
| KeepReasoningInHistory | Boolean | 属性,在多轮对话情景中,是否将推理过程传递给下一轮 |
| KeepToolCallsInHistory | Boolean | 属性,在多轮对话情景中,是否将自定义工具的调用细节和调用结果传递给下一轮 |
OpenAI标准参数属性
下表是LLMCaller的OpenAI标准参数属性,名称和大小写与OpenAI保持一致,会写入请求体。
需要注意的是,大多数模型实际支持的参数远少于
OpenAI 标准定义的参数,所以开发的时候,需要查阅官方API文档,得到该模型所支持的参数,否则意外使用了该大模型不支持的参数,可能会导致请求失败。
下表中前三个参数model、stream、response_format是比较常用的,后面的章节会专门介绍;对于大多数用户来说,作为非专业AI开发人员,其他参数是基本用不着的,所以本文档不做介绍。
| 属性名 | 类型 | 说明 |
|---|---|---|
model |
String | 模型名称,必填,一般通过构造函数设置 |
stream |
Boolean |
是否开启 SSE 流,常用。需配合SSEStreamHandler使用 |
response_format |
JObject | 输出格式:{"type": "json_object"} 或 {"type": "json_schema", "json_schema": {...}},常用 |
temperature |
Double? | 随机性,0~2。部分推理模型不支持 |
top_p |
Double? | 核采样,0~1。部分推理模型不支持 |
max_completion_tokens |
Integer? | 生成 token 上限(OpenAI 推荐,o 系模型必用) |
max_tokens |
Integer? | 生成 token 上限(OpenAI 已弃用,国内平台普遍使用;o 系模型静默忽略) |
n |
Integer? | 一次生成几个候选回答(多数国内模型不支持) |
seed |
Integer? | 随机种子,尽力复现 |
stop |
JArray | 停止序列,最多 4 个 |
presence_penalty |
Double? | 存在惩罚(鼓励新话题),-2.0~2.0 |
frequency_penalty |
Double? | 频率惩罚(减少逐字重复) |
logprobs |
Boolean? | 是否返回 token 对数概率 |
top_logprobs |
Integer? |
每个位置返回的候选数,0~20,需 logprobs=True |
logit_bias |
JObject | 按 token ID 压制 |
user |
String | 终端用户标识,用于平台风控;部分国内平台(如 DeepSeek、智谱、Qwen)使用 user_id 作为终端用户标识,具体以各平台文档为准,可通过 extra_body 设置 |
tool_choice |
String |
工具行为:"auto"/"none"/"required" |
parallel_tool_calls |
Boolean? | 是否允许一轮并发多个工具调用 |
stream_options |
JObject |
流式选项,如 {"include_usage":
true} |
service_tier |
String | 服务层级 |
store |
Boolean? | 是否存储输出用于蒸馏 |
metadata |
JObject | 附加元数据,最多 16 对键值 |
verbosity |
String | 回答详细程度,仅 GPT-5 系 |
reasoning_effort |
String | 推理强度:OpenAI 为 none~xhigh;DeepSeek 为 low/high/max |
方言参数属性
OpenAI 标准以外的模型专有参数统一通过 extra_body 属性设置。
| 属性名 | 类型 | 说明 |
|---|---|---|
| extra_body | ExpandoObject |
方言参数,OpenAI标准以外的模型专有参数统一通过"extra_body"属性设置。 extra_body为ExpandoObject类型,可以随心扩展属性: Dim clr As New LLMCaller() clr.extra_body.thinking = New JObject() From {{"type", "disabled"}} ' DeepSeek/GLM 专有,用于关闭思维模式 clr.extra_body.top_k = 50 '部分模型专有,如 DeepSeek、Anthropic 等 clr.extra_body.user_id = "foxtable" '部分国内平台(如 DeepSeek、智谱、Qwen)使用 user_id 作为终端用户标识 extra_body 中的属性在最终发送 HTTP 请求时,会平级合并到 JSON 请求体的顶层,而不是嵌套在 extra_body 字段下。例如,设置 clr.extra_body.thinking = ... 后,实际请求体为:
{ |
token预估与上下文清理
| 方法 | 类型 | 说明 |
|---|---|---|
| EstimateTokenCount | Integer |
方法,用于粗略预估指定字符串的token数,语法: EstimateTokenCount(content,cnWeight, enWeight) content: 要计算token的字符串 cnWeight:可选参数,用于指定一个中文字符对应的token数,默认为0.6 enWeight:可选参数,用于指定一个英文文字符对应的token数,默认为0.3 提示:EstimateTokenCount只是粗略估算,且偏保守,也就是计算出来的token数通常比实际的token数高。 |
| TrimMessages | 无 |
用于按轮次清理上下文,只保留最近的若干轮对话。其语法为: TrimMessages(n) n:整数型,要保留的最近轮数,在此之前的对话内容会被删除。 |