章节 01
导读 / 主楼:Chuks AI:为 Chuks 语言打造的统一 LLM 客户端
Chuks 语言的官方 AI/LLM 客户端,提供统一的 API 接口支持六大主流提供商,原生支持 Channel 流式传输、spawn 并行推理、强类型结构化输出和函数调用。
正文
Chuks 语言的官方 AI/LLM 客户端,提供统一的 API 接口支持六大主流提供商,原生支持 Channel 流式传输、spawn 并行推理、强类型结构化输出和函数调用。
章节 01
Chuks 语言的官方 AI/LLM 客户端,提供统一的 API 接口支持六大主流提供商,原生支持 Channel 流式传输、spawn 并行推理、强类型结构化输出和函数调用。
章节 02
章节 03
原作者与来源
ai.openai(...) 改为 ai.anthropic(...),其余代码完全兼容。\n\n原生 Channel 流式传输: 通过 Channel<string> 实现流式响应,无需处理复杂的异步迭代器或回调函数,代码更加直观。\n\n真正的并行推理: 使用 spawn 在真实 CPU 核心上运行并行推理,而非单线程模拟,显著提升多任务处理性能。\n\n强类型结构化输出: 通过 dataType 定义返回数据结构,调用点不再充斥着 any 类型,编译时即可捕获类型错误。\n\n内置工具调用: 支持函数/工具调用,并提供自动执行能力,大幅减少样板代码。\n\n技术设计:类型安全与工程优雅\n\n统一的客户端工厂\n\n所有提供商客户端都通过 ai 单例上的工厂方法创建:\n\nchuks\nai.openai(model: string, config: any?): OpenAIClient\nai.anthropic(model: string, config: any?): AnthropicClient\nai.google(model: string, config: any?): GoogleClient\nai.mistral(model: string, config: any?): MistralClient\nai.ollama(model: string, config: any?): OllamaClient\nai.groq(model: string, config: any?): GroqClient\n\n\n共享配置模式\n\n所有提供商支持统一的配置字段:\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| apiKey | string | 环境变量 | 省略时从环境加载 |\n| baseUrl | string | 提供商默认 | 用于代理/Azure/自建网关 |\n| temperature | float | 提供商默认 | 采样温度 |\n| maxTokens | int | 提供商默认 | 回复最大 token 数 |\n| systemPrompt | string | "" | 默认系统提示 |\n\n环境变量自动映射\n\n| 提供商 | 环境变量 |\n|--------|----------|\n| OpenAI | OPENAI_API_KEY |\n| Anthropic | ANTHROPIC_API_KEY |\n| Google | GOOGLE_API_KEY |\n| Mistral | MISTRAL_API_KEY |\n| Groq | GROQ_API_KEY |\n| Ollama | 无需密钥(本地) |\n\n核心数据类型\n\nchuks_ai 定义了完整的数据类型系统,确保类型安全:\n\nCompletionResult\n\nchuks\ndataType CompletionResult {\n content: string // 响应文本\n model: string // 生成响应的模型\n usage: any // Token 使用量\n finishReason: string // 结束原因\n toolCalls: []ToolCall // 工具调用请求\n}\n\n\nEmbeddingResult\n\nchuks\ndataType EmbeddingResult {\n embedding: []float // 向量\n model: string // 使用的嵌入模型\n dimensions: int // 向量维度\n usage: any // Token 使用量\n}\n\n\nChatMessage\n\nchuks\ndataType ChatMessage {\n role: string // \"system\" | \"user\" | \"assistant\" | \"tool\"\n content: string // 消息内容\n name: string? // 工具名称(role:\"tool\" 时)\n tool_call_id: string? // 工具调用 ID\n tool_calls: []ToolCall? // 助手回合的工具调用\n}\n\n\nToolDefinition 与 ToolCall\n\nchuks\ndataType ToolDefinition {\n name: string // 工具名称\n description: string // 工具描述(LLM 读取)\n parameters: any // JSON Schema 参数描述\n handler: any // 执行函数\n}\n\ndataType ToolCall {\n id: string // 提供商分配的调用 ID\n name: string // 模型想要调用的工具名\n arguments: any // 已解析的 JSON 参数对象\n}\n\n\n客户端 API 完整参考\n\n每个提供商客户端都暴露相同的方法集:\n\n| 方法 | 签名 | 描述 |\n|------|------|------|\n| complete | complete(prompt: string, options: any?): Task<CompletionResult> | 单次补全 |\n| stream | stream(prompt: string, ch: Channel<string>, options: any?): Task<any> | 流式传输到 Channel |\n| structured | structured(prompt: string, schema: any, options: any?): Task<any> | 返回符合 schema 的解析 JSON |\n| embed | embed(input: string, model: string?): Task<EmbeddingResult> | 单次嵌入 |\n| embedBatch | embedBatch(inputs: []string, model: string?): Task<[]EmbeddingResult> | 批量嵌入 |\n| registerTool | registerTool(name, desc, params, handler): void | 注册可调用的工具 |\n| completeWithTools | completeWithTools(prompt: string, options: any?): Task<CompletionResult> | 自动执行工具调用 |\n| system | system(prompt: string): self | 链式设置系统提示 |\n| temperature | temperature(t: float): self | 链式设置采样温度 |\n| maxTokens | maxTokens(n: int): self | 链式设置最大 token 数 |\n| enableHistory | enableHistory(maxPairs: int?): self | 启用对话历史追踪 |\n| clearHistory | clearHistory(): self | 清空历史 |\n\n链式 API 示例\n\nchuks\nvar client = ai.openai(\"gpt-4o\")\n .system(\"你是一个有帮助的 Chuks 编程助手。\")\n .temperature(0.3)\n .maxTokens(2048)\n\n\n使用示例\n\n基础补全\n\nchuks\nimport { ai } from \"pkg/@chuks/ai\"\n\nasync function main(): Task<any> {\n var client = ai.openai(\"gpt-4o\")\n var result = await client.complete(\"解释 Chuks 中的 async/await\")\n println(result.content)\n}\n\n\n流式响应\n\nchuks\nvar ch = Channel<string>()\nawait client.stream(\"讲一个故事\", ch)\nwhile (var token = await ch.receive()) {\n print(token)\n}\n\n\n结构化输出\n\nchuks\nvar schema = {\n type: \"object\",\n properties: {\n summary: { type: \"string\" },\n keywords: { type: \"array\", items: { type: \"string\" } }\n }\n}\nvar result = await client.structured(\"总结这篇文章\", schema)\n// result 已被类型化为 { summary: string, keywords: string[] }\n\n\n工具调用\n\nchuks\nclient.registerTool(\n \"getWeather\",\n \"获取指定城市的天气\",\n { city: { type: \"string\" } },\n (args) => { return { temp: 25, condition: \"sunny\" } }\n)\n\nvar result = await client.completeWithTools(\"北京今天天气如何?\")\n// 工具会被自动调用,结果集成到最终回复\n\n\nOllama 专属功能\n\n作为本地模型解决方案,Ollama 客户端提供额外方法:\n\nchuks\nollama.list(): Task<[]string> // 列出已安装的模型\nollama.pull(name: string): Task<any> // 下载模型\n\n\n工程价值与设计哲学\n\n类型安全优先\n\nchuks_ai 的设计充分体现了 Chuks 语言的类型系统优势。通过 dataType 定义的强契约,开发者可以在编译时捕获 API 误用,而不是在运行时遭遇难以调试的错误。\n\n零样板代码\n\n内置的工具注册和自动执行机制消除了传统 LLM 集成中的大量样板代码。开发者只需关注业务逻辑,框架处理底层的工具调用编排。\n\n流式抽象\n\nChannel-based 的流式处理比回调或异步迭代器更直观,符合 Chuks 的并发编程范式。开发者可以用熟悉的同步风格编写代码,同时获得异步性能。\n\n真正的并行\n\nspawn 关键字确保并行推理在真实 CPU 核心上执行,而非事件循环的并发模拟,这对计算密集型 AI 工作负载至关重要。\n\n生态意义\n\nchuks_ai 不仅是一个客户端库,更是 Chuks 语言 AI 生态的基石。它降低了 LLM 集成的门槛,让 Chuks 开发者可以专注于应用创新,而非基础设施。\n\n随着多提供商 LLM 策略成为行业常态,这种统一抽象层的重要性将日益凸显。chuks_ai 为 Chuks 社区提供了一个坚实的基础,支持未来可能出现的新提供商和新功能。\n\n结语:语言原生 AI 集成的典范\n\nchuks_ai 展示了如何为编程语言设计原生、优雅、类型安全的 LLM 客户端。它不是简单包装 REST API,而是深度整合到 Chuks 的类型系统和并发模型中,提供真正符合语言惯用的开发体验。\n\n对于正在评估新语言的开发者,chuks_ai 是 Chuks 语言现代性和工程成熟度的一个有力证明。对于已经使用 Chuks 的开发者,它让 AI 功能集成变得前所未有的简单。