Documentation
¶
Overview ¶
Package client 提供 Hexagon 框架的 Fluent API
本包实现类似 Spring AI ChatClient 的流畅 API 风格。
设计借鉴:
- Spring AI: ChatClient Fluent API
- LangChain: 链式调用
使用示例:
result, err := hexagon.Chat().
Model("gpt-4").
System("你是一个助手").
User("你好").
Tools(weatherTool).
Temperature(0.7).
MaxTokens(1000).
Call(ctx)
// 流式调用
stream, err := hexagon.Chat().
Model("gpt-4").
User("写一首诗").
Stream().
Call(ctx)
Index ¶
- Variables
- func SetDefaultProvider(provider llm.Provider)
- type ChatChunk
- type ChatClient
- func (c *ChatClient) AddMessage(role llm.Role, content string) *ChatClient
- func (c *ChatClient) Assistant(content string) *ChatClient
- func (c *ChatClient) Call(ctx context.Context) (*ChatResponse, error)
- func (c *ChatClient) CallStream(ctx context.Context) (*StreamResponse, error)
- func (c *ChatClient) MaxTokens(max int) *ChatClient
- func (c *ChatClient) Messages(messages []llm.Message) *ChatClient
- func (c *ChatClient) Metadata(key string, value any) *ChatClient
- func (c *ChatClient) Model(model string) *ChatClient
- func (c *ChatClient) Stop(sequences ...string) *ChatClient
- func (c *ChatClient) Stream() *ChatClient
- func (c *ChatClient) System(prompt string) *ChatClient
- func (c *ChatClient) Temperature(temp float64) *ChatClient
- func (c *ChatClient) Tools(tools ...tool.Tool) *ChatClient
- func (c *ChatClient) TopP(p float64) *ChatClient
- func (c *ChatClient) User(content string) *ChatClient
- type ChatResponse
- type PromptClient
- type StreamResponse
Constants ¶
This section is empty.
Variables ¶
var ErrNoProvider = fmt.Errorf("client: 未配置 LLM Provider")
ErrNoProvider 表示 ChatClient 没有可用的 LLM Provider。
当通过 Chat() 便捷入口创建客户端但未事先调用 SetDefaultProvider 设置默认 Provider 时,Call/CallStream 会返回包装了本错误的结果,而非直接 nil 解引用 panic。
Functions ¶
func SetDefaultProvider ¶
SetDefaultProvider 设置默认 Provider
Types ¶
type ChatClient ¶
type ChatClient struct {
// contains filtered or unexported fields
}
ChatClient Fluent 风格的聊天客户端
线程安全:ChatClient 内部使用 mu 保护共享可变的 *chatConfig,因此在同一实例上 并发调用 Fluent 方法(如 User/Assistant/Metadata)不会触发 "concurrent map writes" 之类的 fatal error。但 Fluent builder 语义本身是"在单实例上累积状态",并发写入的 最终状态顺序仍不确定,建议典型用法是每个 goroutine 使用独立的 ChatClient 实例。
func (*ChatClient) AddMessage ¶
func (c *ChatClient) AddMessage(role llm.Role, content string) *ChatClient
AddMessage 添加消息
func (*ChatClient) Assistant ¶
func (c *ChatClient) Assistant(content string) *ChatClient
Assistant 添加助手消息
func (*ChatClient) Call ¶
func (c *ChatClient) Call(ctx context.Context) (*ChatResponse, error)
Call 执行调用
func (*ChatClient) CallStream ¶
func (c *ChatClient) CallStream(ctx context.Context) (*StreamResponse, error)
CallStream 流式调用
func (*ChatClient) MaxTokens ¶
func (c *ChatClient) MaxTokens(max int) *ChatClient
MaxTokens 设置最大 token 数
func (*ChatClient) Messages ¶
func (c *ChatClient) Messages(messages []llm.Message) *ChatClient
Messages 设置消息列表
注意:此处对传入切片做防御性拷贝(defensive copy),避免 ChatClient 与调用方共享 同一底层数组,从而杜绝后续 User()/Assistant() 的 append 写穿调用方原始切片的别名副作用。
func (*ChatClient) Metadata ¶
func (c *ChatClient) Metadata(key string, value any) *ChatClient
Metadata 设置元数据
func (*ChatClient) Temperature ¶
func (c *ChatClient) Temperature(temp float64) *ChatClient
Temperature 设置温度
type ChatResponse ¶
type ChatResponse struct {
Content string
ToolCalls []llm.ToolCall
Usage llm.Usage
FinishReason string
Metadata map[string]any
}
ChatResponse 聊天响应
type PromptClient ¶
type PromptClient struct {
// contains filtered or unexported fields
}
PromptClient Prompt 模板客户端
func NewPromptClient ¶
func NewPromptClient(template string) *PromptClient
NewPromptClient 创建 Prompt 客户端
func (*PromptClient) Render ¶
func (p *PromptClient) Render() (string, error)
Render 渲染模板
使用 {key} 形式的占位符:将模板中所有 {key} 替换为对应变量的字符串值。 变量值通过 toolkit conv.String 统一转换为字符串,支持任意类型。 未在 vars 中出现的占位符保持原样不替换。
func (*PromptClient) ToChat ¶
func (p *PromptClient) ToChat(provider llm.Provider) *ChatClient
ToChat 转换为聊天客户端
func (*PromptClient) Vars ¶
func (p *PromptClient) Vars(vars map[string]any) *PromptClient
Vars 批量设置变量
type StreamResponse ¶
type StreamResponse struct {
Stream *stream.StreamReader[*ChatChunk]
Metadata map[string]any
}
StreamResponse 流式响应