配置 OpenAI、Anthropic、Gemini 与 Ollama
安装单一 Provider Feature,配置原生或兼容 Client,把凭证留在服务端,并验证准确模型能力。
只安装一个 Provider
Runifold 0.9 把具体 Adapter 放在 runifold-providers。添加运行时门面,并只打开
应用真正部署的 Adapter:
cargo add runifold@0.9.0
cargo add runifold-providers@0.9.0 --features openai
cargo add tokio --features macros,rt-multi-thread可以把 openai 替换为 anthropic、gemini、ollama 或 bedrock。DeepSeek、
Ark、Groq、OpenRouter 等具名兼容模块共用一个 openai 协议 Feature,不再拥有
独立的门面 Feature。
| Provider | Feature | 凭证或端点 |
|---|---|---|
| OpenAI | openai | OPENAI_API_KEY |
| Anthropic | anthropic | ANTHROPIC_API_KEY |
| Gemini | gemini | GEMINI_API_KEY |
| Ollama | ollama | 本地或托管 Base URL |
| Bedrock | bedrock | 应用提供的 AWS SDK 配置 |
创建原生 Provider Client
每个原生 Client 都实现同一套 Provider Model 契约:
use runifold::ProviderModelExt;
use runifold_providers::{
anthropic::AnthropicClient,
gemini::GeminiClient,
ollama::OllamaClient,
openai::OpenAiClient,
};
let openai = OpenAiClient::from_api_key(
std::env::var("OPENAI_API_KEY")?
)?.runtime("gpt-5")?;
let anthropic = AnthropicClient::from_api_key(
std::env::var("ANTHROPIC_API_KEY")?
)?.runtime("claude-sonnet-4-5")?;
let gemini = GeminiClient::from_api_key(
std::env::var("GEMINI_API_KEY")?
)?.runtime("gemini-2.5-flash")?;
let ollama = OllamaClient::local()?.runtime("llama3.2")?;模型名称由 Provider 控制。使用账号实际可访问的模型,并把准确模型 ID 写入部署配置和 测试证据。
配置兼容端点
如果使用应用自有网关或已经验证的兼容服务,显式声明 Provider 身份、端点和 Wire Protocol:
use runifold::ProviderModelExt;
use runifold_providers::{
openai::{OpenAiClient, OpenAiConfig, OpenAiWireProtocol},
};
let config = OpenAiConfig::compatible(
"private-gateway",
std::env::var("MODEL_GATEWAY_KEY")?,
"https://models.example.com/v1/",
OpenAiWireProtocol::ChatCompletions,
)?;
let runtime = OpenAiClient::new(config)
.runtime("organization/model-name")?;不要接受最终用户传入的任意 Base URL。必须使用 Allowlist,并把 “OpenAI-compatible”理解为协议声明,而不是 Tool、流式、Reasoning、Usage 和错误语义 完全一致的保证。
把凭证留在服务端边界
长期凭证应由部署 Secret Store 注入。不要把 Provider Key 放进源码、浏览器 Bundle、 移动应用或 WASM。浏览器和边缘客户端应调用应用自有网关,由网关验证用户身份并在服务端 添加上游凭证。
日志可以记录 Provider、模型、请求关联、Capability 证据与脱敏错误分类,但不能记录 Secret 或原始敏感内容。
验证准确组合
上线前依次证明:
- 所选 Feature 与示例可以编译;
- 离线协议和错误分类测试通过;
- 使用真实端点的 Live Smoke Test 通过;
- 准确的模型与 Feature 组合已经在生产环境观察。
结构化输出、Tool、图像、Reasoning 与 Usage 可能在同一 Provider 内也因模型而异。 请依据 Provider 测试和 可靠性证据,不要凭名称推断。