lynkr
Version:
Self-hosted LLM gateway and tier-routing proxy for Claude Code, Cursor, and Codex. Routes across Ollama, AWS Bedrock, OpenRouter, Databricks, Azure OpenAI, llama.cpp, and LM Studio with prompt caching, MCP tools, and 60-80% cost savings.
72 lines (60 loc) • 1.73 kB
JavaScript
const { Agent, setGlobalDispatcher } = require("undici");
const logger = require("../logger");
/**
* Create an optimized HTTP agent for web search and fetch operations
* with connection pooling and keep-alive enabled
*/
function createWebAgent() {
const agent = new Agent({
// Connection pooling settings
connections: 50, // Max concurrent connections per origin
pipelining: 10, // Max pipelined requests per connection
// Keep-alive settings
keepAliveTimeout: 60000, // Keep connections alive for 60s
keepAliveMaxTimeout: 600000, // Maximum keep-alive time (10 minutes)
// Connection timeouts
connectTimeout: 10000, // 10s to establish connection
bodyTimeout: 30000, // 30s to receive response body
headersTimeout: 10000, // 10s to receive headers
// Connection reuse
maxRedirections: 5,
// Performance optimizations
strictContentLength: false, // Don't require Content-Length header
});
logger.info({
connections: 50,
keepAliveTimeout: 60000,
pipelining: 10,
}, "Web HTTP agent initialized with connection pooling");
return agent;
}
/**
* Global web agent instance - reused across all web search/fetch calls
*/
const webAgent = createWebAgent();
/**
* Fetch with the optimized agent
*/
async function fetchWithAgent(url, options = {}) {
return fetch(url, {
...options,
dispatcher: webAgent,
});
}
/**
* Get connection pool statistics
*/
function getAgentStats() {
// Undici doesn't expose detailed stats easily, but we can log connection info
return {
agent: "undici",
keepAlive: true,
maxConnections: 50,
pipelining: 10,
};
}
module.exports = {
webAgent,
fetchWithAgent,
getAgentStats,
};