test(llm): add live e2e test for OpenRouter

Add openrouter_complete in fabro-llm integration tests, gated by
OPENROUTER_API_KEY. Verifies the OpenAI-compatible adapter
configured with OpenRouter's base URL and provider name "openrouter"
can complete a request against the live API and return usable
token counts.

Uses deepseek/deepseek-v4-flash as the live model since it's the
cheapest entry in the catalog.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Scott Werner 2026-05-27 13:11:03 -04:00
parent f326b9421a
commit 7709cbefcb

View file

@ -7,7 +7,9 @@ use std::sync::Arc;
use fabro_llm::error::ProviderErrorKind;
use fabro_llm::provider::ProviderAdapter;
use fabro_llm::providers::{AnthropicAdapter, GeminiAdapter, OpenAiAdapter};
use fabro_llm::providers::{
AnthropicAdapter, GeminiAdapter, OpenAiAdapter, OpenAiCompatibleAdapter,
};
use fabro_llm::types::{FinishReason, Message, Request};
use fabro_model::Catalog;
use fabro_static::EnvVars;
@ -174,6 +176,24 @@ async fn gemini_complete() {
assert_eq!(response.provider, "gemini");
}
#[fabro_macros::e2e_test(live("OPENROUTER_API_KEY"))]
async fn openrouter_complete() {
let api_key =
std::env::var(EnvVars::OPENROUTER_API_KEY).expect("OPENROUTER_API_KEY must be set");
let adapter = OpenAiCompatibleAdapter::new(api_key, "https://openrouter.ai/api/v1")
.with_name("openrouter");
let request = make_request("deepseek/deepseek-v4-flash");
let response = adapter.complete(&request).await.unwrap();
assert!(
!response.text().is_empty(),
"response text should not be empty"
);
assert!(response.usage.input_tokens > 0);
assert!(response.usage.output_tokens > 0);
assert_eq!(response.provider, "openrouter");
}
async fn run_multi_turn_cache_test(
adapter: &dyn ProviderAdapter,
model: &str,