OpenAI Respostas API
ADK-Rust fornece um cliente dedicado para as Respostas API da OpenAI (endpoint /v1/responses) â a sucessora das API de Chat Completions. A API de Respostas Ă© a maneira recomendada de usar os modelos atuais GPT-5.6, incluindo todo o seu intervalo de esforço de raciocĂnio.
VisĂŁo geral
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â OpenAI Responses API Client â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â Endpoint: POST /v1/responses â
â Client: OpenAIResponsesClient â
â Config: OpenAIResponsesConfig â
â Feature: openai â
â â
â Capabilities: â
â âą Streaming and non-streaming â
â âą Reasoning summaries â
â âą Tool / function calling â
â âą Multi-turn via previous_response_id â
â âą Built-in tools (web search, file search, code interpreter) â
â âą System instructions â
â âą Model-aware sampling controls and max_output_tokens â
â âą Automatic retry with exponential backoff â
â â
â vs Chat Completions (OpenAIClient): â
â âą Stateful conversations (server-side context) â
â âą Native reasoning summaries â
â âą Built-in tool hosting â
â âą Simpler multi-turn (no manual message history) â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Quando usar cada cliente
| Recurso | OpenAIClient (Chat Completions) | OpenAIResponsesClient (Responses) |
|---|---|---|
| Endpoint | /v1/chat/completions | /v1/responses |
| Modelos | Modelos compatĂveis com chat | GPT atuais e modelos de raciocĂnio |
| Resumos de raciocĂnio | NĂŁo disponĂvel | Suporte nativo |
| Ferramentas integradas | NĂŁo disponĂvel | Pesquisa na web, pesquisa de arquivos, interpretador de cĂłdigo |
| Estado no lado do servidor | HistĂłrico manual de mensagens | previous_response_id |
| SaĂda estruturada | response_format | text.format (planejado) |
| Maturidade | EstĂĄvel, amplamente adotado | Mais recente, recomendado por OpenAI |
Use OpenAIResponsesClient quando precisar de modelos de raciocĂnio com resumos, ferramentas integradas ou quiser usar o API mais recente de OpenAI. Use OpenAIClient para compatibilidade retroativa com fluxos de trabalho existentes do Chat Completions.
Instalação
[dependencies]
adk-rust = { version = "2.1.0", features = ["openai"] }
adk-tool = "2.1.0"
Ou diretamente com adk-model:
[dependencies]
adk-model = { version = "2.1.0", features = ["openai"] }
Defina sua chave API:
export OPENAI_API_KEY="sk-..."
InĂcio rĂĄpido
use adk_rust::prelude::*;
use adk_rust::session::{CreateRequest, SessionService};
use adk_rust::futures::StreamExt;
use adk_model::openai::{OpenAIResponsesClient, OpenAIResponsesConfig};
use std::collections::HashMap;
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
dotenvy::dotenv().ok();
let api_key = std::env::var("OPENAI_API_KEY")?;
// 1. Create the Responses API client
let config = OpenAIResponsesConfig::new(&api_key, "gpt-5.6-terra");
let model = Arc::new(OpenAIResponsesClient::new(config)?);
// 2. Build an agent
let agent = Arc::new(
LlmAgentBuilder::new("assistant")
.instruction("You are a helpful assistant. Be concise.")
.model(model)
.build()?,
);
// 3. Create a session
let sessions: Arc<dyn SessionService> = Arc::new(InMemorySessionService::new());
sessions.create(CreateRequest {
app_name: "my_app".into(),
user_id: "user".into(),
session_id: Some("s1".into()),
state: HashMap::new(),
}).await?;
// 4. Run through the Runner
let runner = Runner::builder()
.app_name("my_app")
.agent(agent)
.session_service(sessions)
.build()?;
let message = Content::new("user").with_text("What is the capital of France?");
let mut stream = runner.run(
adk_rust::UserId::new("user")?,
adk_rust::SessionId::new("s1")?,
message,
).await?;
while let Some(event) = stream.next().await {
let event = event?;
if let Some(content) = &event.llm_response.content {
for part in &content.parts {
if let Some(text) = part.text() {
print!("{text}");
}
}
}
}
println!();
Ok(())
}
Configuração
Configuração båsica
use adk_model::openai::OpenAIResponsesConfig;
// Minimal â just API key and model
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-luna");
// With organization and project
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-terra")
.with_organization("org-...")
.with_project("proj-...");
// Custom base URL (for proxies or compatible APIs)
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-terra")
.with_base_url("https://my-proxy.example.com/v1");
Modelos de raciocĂnio
Para modelos de raciocĂnio GPT-5.6, configure o esforço de raciocĂnio e o resumo:
use adk_model::openai::{
OpenAIReasoningEffort, OpenAIResponsesClient,
OpenAIResponsesConfig, ReasoningSummary,
};
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-terra")
.with_reasoning_summary(ReasoningSummary::Detailed);
let model = OpenAIResponsesClient::new_with_reasoning_effort(
config,
OpenAIReasoningEffort::Max,
)?;
| Esforço de raciocĂnio | Descrição |
|---|---|
None | Desativar o raciocĂnio para obter a menor latĂȘncia |
Minimal | RaciocĂnio mĂnimo legado em modelos compatĂveis |
Low | Baixo esforço de raciocĂnio |
Medium | RaciocĂnio equilibrado |
High | Alto esforço de raciocĂnio |
XHigh | Esforço de raciocĂnio extra alto |
Max | RaciocĂnio mĂĄximo nos modelos compatĂveis |
GPT-5.6 oferece suporte a None, Low, Medium, High, XHigh e Max por meio da Responses API. Chat Completions oferece suporte a até XHigh.
| Resumo do raciocĂnio | Descrição |
|---|---|
Auto | O modelo decide se deve incluir um resumo |
Concise | Breve resumo do raciocĂnio |
Detailed | Resumo detalhado do raciocĂnio |
Resumos do raciocĂnio aparecem como Part::Thinking no fluxo de resposta, permitindo que vocĂȘ mostre o processo de pensamento do modelo aos usuĂĄrios.
Configuração de novas tentativas
use adk_model::retry::RetryConfig;
let client = OpenAIResponsesClient::new(config)?
.with_retry_config(RetryConfig {
max_retries: 3,
..Default::default()
});
As novas tentativas sĂŁo automĂĄticas para limites de taxa (429), erros do servidor (500/502/503/504) e falhas de rede.
Modelos disponĂveis
| Modelo | Tipo | Descrição |
|---|---|---|
gpt-5.6-terra | RaciocĂnio | Opção padrĂŁo equilibrada para agentes em produção |
gpt-5.6-sol | RaciocĂnio | RaciocĂnio e programação de alto nĂvel |
gpt-5.6-luna | RaciocĂnio | Cargas de trabalho de alto volume e baixo custo |
gpt-5.6 | RaciocĂnio | Alias principal |
gpt-5 | RaciocĂnio | Compatibilidade com a geração anterior |
gpt-4.1 famĂlia | Conversa | Compatibilidade e controles explĂcitos de amostragem |
o3 / o4-mini | RaciocĂnio | Compatibilidade com raciocĂnio de geração anterior |
Recursos
Chamada de ferramentas
As ferramentas de função funcionam da mesma forma que com OpenAIClient â defina as ferramentas no agente e o executor gerencia o ciclo de chamada da ferramenta:
use adk_rust::prelude::*;
use adk_model::openai::{OpenAIResponsesClient, OpenAIResponsesConfig};
use adk_tool::FunctionTool;
use std::sync::Arc;
async fn get_weather(
_ctx: Arc<dyn ToolContext>,
args: serde_json::Value,
) -> Result<serde_json::Value> {
let city = args["city"].as_str().unwrap_or("unknown");
Ok(serde_json::json!({
"city": city,
"temperature_f": 72,
"conditions": "Sunny"
}))
}
let weather_tool = FunctionTool::new(
"get_weather",
"Get current weather for a city. Requires a 'city' string parameter.",
get_weather,
);
let config = OpenAIResponsesConfig::new(&api_key, "gpt-5.6-terra");
let model = Arc::new(OpenAIResponsesClient::new(config)?);
let agent = LlmAgentBuilder::new("weather_agent")
.instruction("Use the get_weather tool to answer weather questions.")
.model(model)
.tool(Arc::new(weather_tool))
.build()?;
Conversas com vĂĄrias rodadas
O executor gerencia automaticamente o histórico da conversa por meio das sessÔes. O contexto de cada rodada é preservado:
// Turn 1
let msg1 = Content::new("user").with_text("My name is Alice.");
let mut stream = runner.run(uid.clone(), sid.clone(), msg1).await?;
// ... consume stream ...
// Turn 2 â the model remembers the previous turn
let msg2 = Content::new("user").with_text("What is my name?");
let mut stream = runner.run(uid.clone(), sid.clone(), msg2).await?;
// Response: "Your name is Alice."
Substituição do raciocĂnio por solicitação
Substitua as configuraçÔes de raciocĂnio por solicitação usando extensĂ”es LlmRequest:
use adk_rust::prelude::*;
let agent = LlmAgentBuilder::new("flexible_reasoner")
.model(model)
.generate_content_config(GenerateContentConfig {
extensions: {
let mut ext = std::collections::HashMap::new();
ext.insert("openai".to_string(), serde_json::json!({
"reasoning": {
"effort": "high",
"summary": "detailed"
}
}));
ext
},
..Default::default()
})
.build()?;
Ferramentas integradas
O cliente API de Responses Ă© compatĂvel com ferramentas hospedadas em OpenAI. Prefira os wrappers tipados de adk-tool:
use adk_tool::OpenAIWebSearchTool;
use std::sync::Arc;
let agent = LlmAgentBuilder::new("researcher")
.model(model)
.tool(Arc::new(OpenAIWebSearchTool::new().preview()))
.build()?;
Os wrappers disponĂveis incluem OpenAIWebSearchTool, OpenAIFileSearchTool, OpenAICodeInterpreterTool, OpenAIImageGenerationTool, OpenAIComputerUseTool, OpenAIMcpTool, OpenAILocalShellTool, OpenAIShellTool e OpenAIApplyPatchTool.
ID da resposta anterior
Para obter o estado da conversa no servidor (ignorando o histĂłrico da sessĂŁo local), passe previous_response_id:
let agent = LlmAgentBuilder::new("stateful")
.model(model)
.generate_content_config(GenerateContentConfig {
extensions: {
let mut ext = std::collections::HashMap::new();
ext.insert("openai".to_string(), serde_json::json!({
"previous_response_id": "resp_abc123"
}));
ext
},
..Default::default()
})
.build()?;
Comportamento de streaming
O cliente API de Responses transmite deltas de texto e raciocĂnio em tempo real:
- Os deltas de texto chegam como
Part::Textcompartial: true - Os deltas do resumo do raciocĂnio chegam como
Part::Thinkingcompartial: true - As chamadas de função são emitidas a partir do evento
ResponseCompletedfinal, com nomes e argumentos corretos - O evento final contém
turn_complete: truecom metadados de uso e o motivo de finalização
Isso significa que vocĂȘ vĂȘ o texto aparecer token por token enquanto o modelo o gera, e as chamadas de função chegam como objetos completos prontos para execução.
Metadados do provedor
Cada resposta inclui metadados do provedor com o response_id:
if let Some(meta) = &response.provider_metadata {
let response_id = meta["openai"]["response_id"].as_str();
// Use for previous_response_id, logging, debugging
}
Metadados adicionais podem incluir:
encrypted_contentâ de modelos de raciocĂnio (para preservação do contexto)built_in_tool_outputsâ resultados de pesquisa na web, pesquisa de arquivos e interpretador de cĂłdigo
Tratamento de erros
Os erros sĂŁo mapeados para AdkError estruturados com categorias apropriadas:
| HTTP Status | Categoria do erro | RepetĂvel |
|---|---|---|
| 401 | Unauthorized | NĂŁo |
| 429 | RateLimited | Sim |
| 500, 502, 503, 504 | Unavailable | Sim |
| Outros | Internal | NĂŁo |
match runner.run(uid, sid, message).await {
Ok(stream) => { /* process stream */ }
Err(e) if e.is_retryable() => { /* retry logic */ }
Err(e) if e.is_unauthorized() => { /* check API key */ }
Err(e) => { /* handle other errors */ }
}
Modo em segundo plano e cancelamento
Para solicitaçÔes de longa duração, envie com background: true e consulte o status até a conclusão:
use adk_model::openai::{OpenAIResponsesClient, OpenAIResponsesConfig};
let client = OpenAIResponsesClient::new(config)?;
// Submit with background: true via extensions
let mut gen_config = GenerateContentConfig::default();
gen_config.extensions.insert("openai".into(), serde_json::json!({ "background": true }));
// ... send request, extract response_id from provider_metadata ...
// Poll until terminal status
let response = client.poll_response("resp_abc123").await?;
// Check provider_metadata["openai"]["status"]: "completed", "in_progress", "failed", "cancelled"
// Cancel a running background response
let cancelled = client.cancel_response("resp_abc123").await?;
Os modelos de pesquisa aprofundada (o3-deep-research, o4-mini-deep-research) ativam automaticamente o modo em segundo plano sem background: true explĂcito.
Exemplo
Um exemplo completo com 7 cenĂĄrios estĂĄ disponĂvel em examples/openai_responses/:
export OPENAI_API_KEY=sk-...
cargo run --manifest-path examples/openai_responses/Cargo.toml
CenĂĄrios abordados:
- Chat bĂĄsico sem streaming
- Chat bĂĄsico com streaming
- Modelo de raciocĂnio com resumo (caminho de compatibilidade com
o4-mini) - Chamada de ferramentas com ferramentas de função
- Conversa com vårias interaçÔes
- InstruçÔes do sistema
- Temperatura e configuração de geração (caminho de compatibilidade com
gpt-4.1-nano)
Exemplos adicionais
Seis crates de exemplo independentes demonstram recursos especĂficos de API:
| Exemplo | Comando de execução | Recurso |
|---|---|---|
| WebSocket transport | cargo run --manifest-path examples/openai_ws_minimal/Cargo.toml | ConexĂŁo persistente de baixa latĂȘncia |
| Modo em segundo plano | cargo run --manifest-path examples/openai_background/Cargo.toml | Fluxo de trabalho de envio e consulta |
| Conversas API | cargo run --manifest-path examples/openai_conversations/Cargo.toml | Vårias interaçÔes gerenciadas pelo servidor |
| Ferramentas integradas | cargo run --manifest-path examples/openai_builtin_tools/Cargo.toml | Geração de imagens, pesquisa na web |
| Pesquisa aprofundada | cargo run --manifest-path examples/openai_deep_research/Cargo.toml | Pesquisa automĂĄtica em segundo plano |
| Respostas abertas | cargo run --manifest-path examples/openai_open_responses/Cargo.toml | Endpoints independentes de provedor |
Relacionados
- Provedores de modelos na nuvem â Todos os provedores LLM compatĂveis
- Ollama (local) â Execute modelos localmente
- LlmAgent â Usando modelos com agentes
- Ferramentas de função â Adicionando ferramentas aos agentes
Anterior: â Provedores de nuvem | PrĂłximo: Ollama (local) â