- 后端
- API网关
- 模型推理服务
- AI Agent
【免费下载链接】semantic-router
An open, programmable decision layer for models and compute.
Semantic Router 以 gRPC-based ExtProc(External Processing)服务的形式与 Envoy Proxy 深度集成,不直接暴露 REST 路由端点,而是拦截并处理经由 Envoy 转发的 OpenAI 兼容请求。本文基于 Router API Reference 展开,结合仓库源码逐一讲解端口与端点映射、/v1/chat/completions与/v1/models的请求/响应格式、路由注入的元数据头、健康检查、Prometheus 指标体系、gRPC ExtProc 处理流程以及错误与限流约定,并给出 Python/JavaScript 客户端接入与最佳实践。读完本文,你将能独立部署、调用、监控并排查 Semantic Router 的 API 层。
API 总览:一张端口表看懂整个 Router
Semantic Router 作为 ExtProc 服务器运行在 Envoy 之后,通过多个端口分工协作:
| 端口 | 协议 | 用途 | 典型端点 |
|---|---|---|---|
| 8801 | HTTP | Envoy 对外公共入口 | POST /v1/chat/completions;可通过 Envoy 路由规则将GET /v1/models代理到 Router 的 8080 端口 |
| 8080 | HTTP | Classification API(健康/信息/分类工具) | GET /v1/models、GET /health、GET /info/models、GET /info/classifier、POST /api/v1/classify/intent\|pii\|security\|batch |
| 50051 | gRPC | Envoy ExtProc,在/v1/chat/completions路径内做分类与路由 | 非 HTTP 端口,不能直接用 curl 访问 |
| 9190 | HTTP | Prometheus 指标抓取 | GET /metrics(全局进程指标) |
需要特别说明的是 8801 与 8080 的关系:路由路径走 ExtProc(50051),而/v1/models模型列表由 8080 端口的 HTTP API 提供。若在 Envoy 中显式添加路由规则,GET /v1/models才能经 8801 代理到 Router 8080;否则在 8801 请求/v1/models可能返回 "no healthy upstream"。
从源码看,8080 端口的 API 由ClassificationAPIServer实现,路由注册集中在 src/semantic-router/pkg/apiserver/routes.go(apiRoutes()、apiClassifyRoutes()等),而路径常量定义在 src/semantic-router/pkg/apiserver/api_paths.go,例如apiRootPath = "/api/v1"、/api/v1/status、/api/v1/config、/api/v1/observability等管理端点;gRPC 服务端则通过ext_proc.RegisterExternalProcessorServer(grpcServer, s.service)注册在 src/semantic-router/pkg/extproc/server.go。
请求链路(Request Flow)
这条链路的本质是:请求先落在 Envoy,经 ExtProc 过滤器转发到 Router 做分类与安全检测,Router 返回路由头(如目标 endpoint、选中模型、置信度),Envoy 再据此把请求转发给后端模型;响应返回时 Router 还会做响应阶段处理(缓存、安全检测、流式改写等),最终由 Envoy 回给客户端。对应地,ExtProc 处理器分四个阶段处理:RequestHeaders、RequestBody、ResponseHeaders、ResponseBody,分别实现于processor_req_header.go、processor_req_body.go、processor_res_header.go、processor_res_body.go等文件(见 src/semantic-router/pkg/extproc/ 目录)。
OpenAI 兼容 API
/v1/models:模型列表端点
GET /v1/models返回可用模型列表,并始终包含一个合成的"MoM"(Mixture of Models)模型——它使用 Router 的意图分类为每个请求自动选择最合适的底层模型;出于向后兼容,auto作为别名同样被接受。
响应示例:
{ "object": "list", "data": [ { "id": "MoM", "object": "model", "created": 1726890000, "owned_by": "semantic-router" }, { "id": "gpt-4o-mini", "object": "model", "created": 1726890000, "owned_by": "upstream-endpoint" }, { "id": "llama-3.1-8b-instruct", "object": "model", "created": 1726890000, "owned_by": "upstream-endpoint" } ] }要点:
- 具体模型列表来自
config.yaml中配置的 vLLM 端点(见vllm_endpoints[].models)。 - 特殊模型
MoM永远存在;模型名auto是它的别名。 - 源码层面,该端点由 handleOpenAIModels 处理,调用
publicmodels.NewOpenAIModelList()构建响应;owned_by的取值在 src/semantic-router/pkg/publicmodels/models.go 中定义:路由虚拟模型归属vllm-semantic-router,后端具体模型归属upstream-endpoint。是否把配置中的后端模型列入列表由配置项ListBackendModels控制(默认false),对应appendBackendModels()逻辑(models.go)。
/v1/chat/completions:对话补全端点
端点:POST /v1/chat/completions
请求格式:
{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "What is the derivative of x^2?" } ], "max_tokens": 150, "temperature": 0.7, "tools": [ { "type": "function", "function": { "name": "calculator", "description": "Perform mathematical calculations" } } ] }响应格式(关键在routing_metadata字段):
{ "id": "chatcmpl-abc123", "object": "chat.completion", "created": 1677858242, "model": "gpt-3.5-turbo", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "The derivative of x^2 is 2x." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20 }, "routing_metadata": { "selected_model": "mathematics", "confidence": 0.96, "processing_time_ms": 15, "cache_hit": false, "security_checks": { "pii_detected": false, "jailbreak_detected": false } } }请求体在 ExtProc 的 RequestBody 阶段被解析:Router 会对查询做意图分类、运行安全检测(PII/Jailbreak)、选定最优模型,并返回路由头供 Envoy 转发。从源码结构看,RequestBody 阶段的处理入口在 processor_req_body.go,而请求协议解析(OpenAI 兼容载荷 → 内部请求上下文)位于 pkg/llmprotocol 与 pkg/protocolcodec;当前版本还支持 Anthropic 等协议,可通过api_format配置切换。
路由头(Routing Headers)
Router 会向请求和响应两侧添加元数据头,供排障、审计与客户端消费。全部自定义头统一遵循x-前缀约定,常量集中定义在 src/semantic-router/pkg/headers/headers.go。
请求头(由 Router 添加)
| Header | 说明 | 示例 |
|---|---|---|
x-vsr-destination-endpoint | 选中的后端端点 | endpoint1 |
x-selected-model | 确定的模型类别 | mathematics |
x-routing-confidence | 分类置信度 | 0.956 |
x-request-id | 唯一请求标识 | req-abc123 |
x-cache-status | 缓存命中/未命中状态 | miss |
响应头(由 Router 添加)
| Header | 说明 | 示例 |
|---|---|---|
x-processing-time | 总处理时间(ms) | 45 |
x-classification-time | 分类耗时(ms) | 12 |
x-security-checks | 安全检查结果 | pii:false,jailbreak:false |
x-tools-selected | 选中的工具数量 | 2 |
在 v0.2 之上,当前仓库的头面更为丰富(源码 headers.go 可见一斑):
- 决策追踪头(仅成功且未命中缓存时输出):
x-vsr-selected-category(域分类结果,如math、business)、x-vsr-selected-decision(命中的决策名)、x-vsr-selected-confidence(决策置信度 0~1)、x-vsr-selected-reasoning(on/off)、x-vsr-selected-modality(AR/DIFFUSION/BOTH)、x-vsr-selected-algorithm(如static、elo、knn、router_dc、fusion)、x-vsr-routing-latency-ms、x-vsr-cost与x-vsr-cost-currency(按模型定价计算的费用)。 - 信号追踪头:
x-vsr-matched-keywords、x-vsr-matched-embeddings、x-vsr-matched-domains、x-vsr-matched-complexity、x-vsr-matched-jailbreak、x-vsr-matched-pii、x-vsr-matched-language等,逐一记录命中的信号规则名,方便核对"为什么路由到该模型"。 - 响应契约头(v0.4 起):
x-vsr-schema-version(当前值为2)与x-vsr-response-path(取值包括upstream、cache、fast_response、looper、blocked、rate_limited、error、fallback等),客户端可据此判断响应来源;另有x-vsr-cache-hit、x-vsr-replay-id、x-vsr-response-warnings(hallucination/unverified_factual/response_jailbreak)等。
健康检查 API
端点:GET http://localhost:8080/health
{ "status": "healthy", "version": "1.0.0", "uptime": 3600, "models": { "category_classifier": "loaded", "pii_detector": "loaded", "jailbreak_guard": "loaded" }, "cache": { "status": "healthy", "entries": 1247, "hit_rate": 0.73 }, "endpoints": { "endpoint1": "healthy", "endpoint2": "healthy", "endpoint3": "degraded" } }健康检查覆盖三个层面:进程状态(status/version/uptime)、模型加载状态(分类器、PII 检测器、Jailbreak 防护)、缓存与后端端点健康度。gRPC 侧同样注册了标准 health 服务(healthpb.RegisterHealthServer(grpcServer, s.healthServer),见 server.go),便于 Envoy 与 K8s 探针联动。信息类端点还包括GET /info/models(已加载分类器模型与系统信息)与GET /info/classifier(分类器配置细节),对应 apiserver 中的route_model_info*.go系列实现。
Metrics API:Prometheus 指标全解析
端点:GET http://localhost:9190/metrics(v0.2 文档中示例写为 9090,请以实际配置端口为准,参考上文端口表)
核心指标
# Request metrics semantic_router_requests_total{endpoint="endpoint1",category="mathematics",status="success"} 1247 semantic_router_request_duration_seconds{endpoint="endpoint1"} 0.045 # Classification metrics semantic_router_classification_accuracy{category="mathematics"} 0.94 semantic_router_classification_duration_seconds 0.012 # Cache metrics semantic_router_cache_hit_ratio 0.73 semantic_router_cache_size 1247 # Security metrics semantic_router_pii_detections_total{action="block"} 23 semantic_router_jailbreak_attempts_total{action="block"} 5 # Error metrics llm_request_errors_total{model="gpt-4",reason="timeout"} 12 llm_request_errors_total{model="claude-3",reason="upstream_5xx"} 3 llm_request_errors_total{model="phi4",reason="upstream_4xx"} 5 llm_request_errors_total{model="phi4",reason="pii_policy_denied"} 8Reasoning Mode 指标(推理模式监控)
Router 为跨模型家族的推理模式决策与模板使用暴露了专门的 Prometheus 计数器:
llm_reasoning_decisions_total{category, model, enabled, effort}- 按类别与选中模型统计推理决策次数,含是否启用推理及应用的 effort 级别。
- Labels:
category(路由时确定的类别)、model(最终选中的模型)、enabled(true/false)、effort(如low|medium|high)。
llm_reasoning_template_usage_total{family, param}- 统计模型家族专属模板参数被应用的次数。
- Labels:
family(归一化模型家族,如qwen3、deepseek、gpt-oss、gpt)、param(应用的模板旋钮名,如enable_thinking、thinking、reasoning_effort)。
llm_reasoning_effort_usage_total{family, effort}- 统计各模型家族设置推理 effort 级别的次数。
- Labels:
family、effort(low|medium|high)。
示例 PromQL:
# Reasoning decisions by category and model (last 5m) sum by (category, model, enabled, effort) ( rate(llm_reasoning_decisions_total[5m]) ) # Template usage by model family and parameter (last 5m) sum by (family, param) ( rate(llm_reasoning_template_usage_total[5m]) ) # Effort distribution by model family (last 5m) sum by (family, effort) ( rate(llm_reasoning_effort_usage_total[5m]) )源码证据:这三个计数器定义在 src/semantic-router/pkg/observability/metrics/reasoning_metrics.go,并配套RecordReasoningDecision(category, model, enabled, effort)、RecordReasoningTemplateUsage(family, param)、RecordReasoningEffortUsage(family, effort)三个记录函数;空 family 会被归一化为consts.UnknownLabel,空 effort 记为unspecified,空 param 记为none。
成本与路由决策指标
llm_model_cost_total{model, currency}- 每个模型累计的总成本(由 token 用量与每 1M pricing 计算),按币种标注。
- Labels:
model、currency(如"USD")。
llm_routing_reason_codes_total{reason_code, model}- 按 reason code 与选中模型统计路由决策次数。
- Labels:
reason_code(如auto_routing、model_specified、pii_policy_alternative_selected)、model。
示例 PromQL:
# Cost by model and currency over the last hour sum by (model, currency) (increase(llm_model_cost_total[1h])) # Or, if you only use USD, a common query is: sum by (model) (increase(llm_model_cost_total{currency="USD"}[1h])) # Routing decisions by reason code over the last 15 minutes sum by (reason_code) (increase(llm_routing_reason_codes_total[15m]))源码证据:llm_model_cost_total、llm_routing_reason_codes_total与llm_model_requests_total、llm_request_errors_total等定义在 src/semantic-router/pkg/observability/metrics/metrics.go;同文件还提供llm_model_tokens_total、llm_model_prompt_tokens_total、llm_model_completion_tokens_total、llm_model_routing_modifications_total(源模型→目标模型重路由计数)等指标。成本计算的核心算法在 src/semantic-router/pkg/modelpricing/modelpricing.go:Rates结构体除PromptPer1M/CompletionPer1M外,还支持CachedInputPer1M与可选的CacheWritePer1M(未配置时按EffectiveCacheWritePer1M()回退到普通 prompt 费率),Cost()对 token 明细做Normalize归一化后按tokensPerMillion = 1_000_000折算费用。
请求错误指标
llm_request_errors_total{model, reason}按模型与失败原因统计请求级错误:
- Labels:
model(失败请求的目标模型)、reason(错误类别:timeout、upstream_4xx、upstream_5xx、pii_policy_denied、jailbreak_block、parse_error、serialization_error、cancellation、classification_failed、unknown)。
示例 PromQL:
# Total errors by reason over the last hour sum by (reason) (increase(llm_request_errors_total[1h])) # Error throughput (errors/sec) by model over the last 15 minutes. # Helpful for incident response because it shows how many failing requests are impacting users. sum by (model) (rate(llm_request_errors_total[15m])) # Error ratio (% of requests failing) by model over the last 15 minutes. # Use increase() to align numerator and denominator with the same lookback window. 100 * sum by (model) (increase(llm_request_errors_total[15m])) / sum by (model) (increase(llm_model_requests_total[15m])) # PII policy blocks over the last 24 hours sum(increase(llm_request_errors_total{reason="pii_policy_denied"}[24h]))错误比率查询用increase()对齐分子分母的 lookback 窗口,是排障时最常用的写法。
TTFT 与 TPOT 指标
Time-to-first-token(TTFT)与 time-per-output-token(TPOT)以 Prometheus histogram 导出,可用histogram_quantile在 p95 处可视化:
llm_model_ttft_seconds{model}— 自 Router 开始处理请求到首 token 的时间;histogram 暴露_bucket、_sum、_count。histogram_quantile(0.95, sum(rate(llm_model_ttft_seconds_bucket[5m])) by (le, model))llm_model_tpot_seconds{model}— 每个输出 token 的秒数(completion latency / completion tokens)。histogram_quantile(0.95, sum(rate(llm_model_tpot_seconds_bucket[5m])) by (le, model))
这两项指标已包含在仓库提供的 Grafana 仪表盘中,面板名为 "TTFT (p95) by Model" 与 "TPOT (p95) by Model (sec/token)"。
Streaming(SSE)注意事项
- 对 Server-Sent Events(SSE)响应,Router 以**第一个流式 body 块(即首个 token)**而不是响应头来度量 TTFT。
- 无需手工修改 Envoy 配置:ExtProc 处理器会自动设置
ModeOverride,对 SSE 响应将response_body_mode置为STREAMED,使第一个 chunk 立即到达 ExtProc。 - 前提:Envoy 的 ext_proc 过滤器必须开启
allow_mode_override: true。仓库默认配置 deploy/local/envoy.yaml 已包含该设置;静态处理模式中保留response_body_mode: BUFFERED没有问题,Router 会在运行时为 SSE 动态切换为STREAMED。
源码证据:ModeOverride的ResponseBodyMode: STREAMED设置在 src/semantic-router/pkg/extproc/processor_res_header_runtime.go,并由 processor_res_header_test.go 验证。
定价配置(Pricing Configuration)
为模型提供每 1M token 定价,Router 即可计算请求成本并输出指标/日志:
model_config: phi4: pricing: currency: USD prompt_per_1m: 0.07 completion_per_1m: 0.35 "mistral-small3.1": pricing: currency: USD prompt_per_1m: 0.1 completion_per_1m: 0.3 gemma3:27b: pricing: currency: USD prompt_per_1m: 0.067 completion_per_1m: 0.267说明:
- 定价可选;未配置时成本按 0 处理,仅输出 token 指标。
- 成本计算公式:
(prompt_tokens * prompt_per_1m + completion_tokens * completion_per_1m) / 1_000_000(单位:配置的币种)。
在当前仓库(v0.3 配置)中,pricing 字段位于providers.models[].pricing之下,并额外支持cached_input_per_1m与cache_write_per_1m,见 config/config.yaml 中 qwen3-8b 的示例:
providers: models: - name: qwen3-8b pricing: currency: USD prompt_per_1m: 0.18 cached_input_per_1m: 0.04 cache_write_per_1m: 0.225 completion_per_1m: 0.42gRPC ExtProc API
面向直接对接 ExtProc 协议的场景:
服务定义
syntax = "proto3"; package envoy.service.ext_proc.v3; service ExternalProcessor { rpc Process(stream ProcessingRequest) returns (stream ProcessingResponse); } message ProcessingRequest { oneof request { RequestHeaders request_headers = 1; RequestBody request_body = 2; ResponseHeaders response_headers = 3; ResponseBody response_body = 4; } } message ProcessingResponse { oneof response { RequestHeadersResponse request_headers = 1; RequestBodyResponse request_body = 2; ResponseHeadersResponse response_headers = 3; ResponseBodyResponse response_body = 4; } }该双向流式 RPC 与 Envoy ExtProc 过滤器定义一致。Go 服务端通过ext_proc.RegisterExternalProcessorServer(grpcServer, s.service)注册实现(server.go),处理器类型OpenAIRouter满足ext_proc.ExternalProcessorServer接口(router.go)。
处理阶段
Request Headers 处理
func (r *Router) handleRequestHeaders(headers *ProcessingRequest_RequestHeaders) *ProcessingResponse { // Extract request metadata // Set up request context // Return continue response }请求头阶段负责提取元数据、建立请求上下文并返回 continue 响应;对应实现是 processor_req_header.go,该阶段会解析x-request-id、x-session-id等入站头并完成端点预绑定。
Request Body 处理
func (r *Router) handleRequestBody(body *ProcessingRequest_RequestBody) *ProcessingResponse { // Parse OpenAI request // Classify query intent // Run security checks // Select optimal model // Return routing headers }请求体阶段是路由主流程:解析 OpenAI 请求 → 意图分类 → 安全检测(PII/Jailbreak)→ 选定最优模型 → 返回路由头。对应实现分布在 processor_req_body.go 与同目录的req_filter_*.go过滤器链(如req_filter_classification.go、req_filter_reason.go、req_filter_tools.go、req_filter_memory.go等),分类/路由结果通过 processor_req_header_endpoints.go 等模块写回 ExtProc 响应头。
错误处理
错误响应格式
{ "error": { "message": "PII detected in request", "type": "security_violation", "code": "pii_detected", "details": { "entities_found": ["EMAIL", "PERSON"], "action_taken": "block" } } }HTTP 状态码
| Status | Description |
|---|---|
| 200 | 成功 |
| 400 | Bad Request(输入格式错误) |
| 403 | Forbidden(安全违规) |
| 429 | Too Many Requests(被限流) |
| 500 | Internal Server Error |
| 503 | Service Unavailable(后端不可用) |
从源码看,错误响应由createJSONResponseWithBody(statusCode, jsonBody, responsePath)与createJSONResponse(statusCode, data)、createErrorResponse(statusCode, message)生成(router.go),ImmediateResponse可直接由 Envoy 返回给客户端;同时会带上x-vsr-response-path: error等响应契约头便于识别错误来源。
配置 API(运行时配置更新)
端点:POST /admin/config/update
{ "classification": { "confidence_threshold": 0.8 }, "security": { "enable_pii_detection": true }, "cache": { "ttl_seconds": 7200 } }该端点支持运行时热更新分类阈值、安全开关与缓存 TTL。在当前仓库中,运行时配置管理能力已演进为更完整的 API 家族(路径定义见 api_paths.go):/api/v1/config(含/schema、/validate、/plan、/versions、/rollback、/hash、/recipes)、/api/v1/routing/preview、/api/v1/inventory/models等,实现分布在 pkg/apiserver 下的route_config_*.go、runtime_config.go、config_activation.go等文件。
WebSocket API(可选流式通道)
端点:ws://localhost:8801/v1/chat/stream
const ws = new WebSocket('ws://localhost:8801/v1/chat/stream'); ws.send(JSON.stringify({ "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Tell me a story"}], "stream": true })); ws.onmessage = function(event) { const chunk = JSON.parse(event.data); console.log(chunk.choices[0].delta.content); };WebSocket 通道面向实时流式响应场景;与之并行的还有 SSE 流式路径(见上文 TTFT 的 Streaming 说明),生产环境更常见的是通过 Envoy 转发 OpenAI 兼容的 SSE 流。
客户端接入示例
Python 客户端
import requests class SemanticRouterClient: def __init__(self, base_url="http://localhost:8801"): self.base_url = base_url def chat_completion(self, messages, model="gpt-3.5-turbo", **kwargs): response = requests.post( f"{self.base_url}/v1/chat/completions", json={ "model": model, "messages": messages, **kwargs } ) return response.json() def get_health(self): response = requests.get(f"{self.base_url}/health") return response.json() # Usage client = SemanticRouterClient() result = client.chat_completion([ {"role": "user", "content": "What is 2 + 2?"} ])JavaScript 客户端
class SemanticRouterClient { constructor(baseUrl = 'http://localhost:8801') { this.baseUrl = baseUrl; } async chatCompletion(messages, model = 'gpt-3.5-turbo', options = {}) { const response = await fetch(`${this.baseUrl}/v1/chat/completions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model, messages, ...options }) }); return response.json(); } async getHealth() { const response = await fetch(`${this.baseUrl}/health`); return response.json(); } } // Usage const client = new SemanticRouterClient(); const result = await client.chatCompletion([ { role: 'user', content: 'Solve x^2 + 5x + 6 = 0' } ]);两个客户端都基于 8801 的 Envoy 公共入口,直接复用标准 OpenAI SDK 的交互模式;get_health()在示例中经由 8801 访问,实际健康检查端点位于 8080(生产环境建议由内部监控直接访问 8080,避免经过公共入口)。
限流(Rate Limiting)
Router 实现限流并通过标准头暴露配额状态:
X-RateLimit-Limit: 1000 X-RateLimit-Remaining: 999 X-RateLimit-Reset: 1640995200 X-RateLimit-Retry-After: 60限流拒绝时的响应:
{ "error": { "message": "Rate limit exceeded", "type": "rate_limit_error", "code": "too_many_requests", "details": { "limit": 1000, "window": "1h", "retry_after": 60 } } }限流实现位于 src/semantic-router/pkg/ratelimit,请求阶段过滤器 processor_req_body_rate_limit.go 负责在请求体阶段判定配额并拦截。被限流的响应会携带x-vsr-response-path: rate_limited契约头。
最佳实践
1. 请求优化
# Include relevant context messages = [ { "role": "system", "content": "You are a mathematics tutor." }, { "role": "user", "content": "Explain derivatives in simple terms" } ] # Use appropriate tools tools = [ { "type": "function", "function": { "name": "calculator", "description": "For mathematical calculations" } } ]携带清晰的 system 指令与结构化工具声明,可显著提升意图分类的准确性与工具选择(x-tools-selected)的有效性。
2. 错误处理
try: response = client.chat_completion(messages) if 'error' in response: handle_router_error(response['error']) else: process_response(response) except requests.exceptions.Timeout: handle_timeout_error() except requests.exceptions.ConnectionError: handle_connection_error()注意区分两类错误:Router 返回的业务错误(error字段,如安全违规 403、限流 429)与网络层异常(超时、连接错误)。对 403 安全违规通常不建议重试;对 429 应依据retry_after退避;对 5xx/超时可考虑重试。
3. 监控集成
import time start_time = time.time() response = client.chat_completion(messages) duration = time.time() - start_time # Log routing metadata routing_info = response.get('routing_metadata', {}) logger.info(f"Request routed to {routing_info.get('selected_model')} " f"with confidence {routing_info.get('confidence')} " f"in {duration:.2f}s")结合响应体的routing_metadata、响应头(x-vsr-selected-decision、x-vsr-selected-confidence等)与 Prometheus 指标(llm_routing_reason_codes_total、llm_model_ttft_seconds等)可以形成"单请求明细 + 全局聚合"的完整可观测闭环。
延伸阅读
- Classification API(分类端点详解):
/api/v1/classify/intent|pii|security|batch等直接分类工具。 - Quick Start Guide(快速开始):真实环境集成示例。
- Configuration Guide(生产配置):完整配置项说明。
- 源码级参考:路由头常量、模型列表构建、指标定义、推理指标、成本计算、ExtProc 服务注册、Envoy 默认配置、路由配置示例。
- 后端
- API网关
- 模型推理服务
- AI Agent
【免费下载链接】semantic-router
An open, programmable decision layer for models and compute.
相关推荐
semantic-router Router API 参考:ExtProc 协议、OpenAI 兼容端点与 Prometheus 指标体系全解
semantic router Router API 参考:ExtProc 协议、OpenAI 兼容端点与 Prometheus 指标体系全解 本文基于 sem
后端API网关模型推理服务AI AgentSemantic Router 的 Router API 参考:基于 Envoy ExtProc 的 gRPC 路由接口、指标与集成实战
Semantic Router 的 Router API 参考:基于 Envoy ExtProc 的 gRPC 路由接口、指标与集成实战 Semantic Ro
后端API网关模型推理服务AI AgentSemantic Router 指标与监控实战:Prometheus + Grafana 可观测性全指南
Semantic Router 指标与监控实战:Prometheus + Grafana 可观测性全指南 Semantic Router(vLLM Projec
后端API网关模型推理服务AI Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考