news 2026/11/3 3:25:05

Semantic Router Router API 完全指南:端口、OpenAI 兼容接口、ExtProc 链路与可观测性指标详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Semantic Router Router API 完全指南:端口、OpenAI 兼容接口、ExtProc 链路与可观测性指标详解
  • 后端
  • API网关
  • 模型推理服务
  • AI Agent

【免费下载链接】semantic-router

An open, programmable decision layer for models and compute.

项目地址:https://gitcode.com/gh_mirrors/sem/semantic-router
点击查看免费下载

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 之后,通过多个端口分工协作:

端口协议用途典型端点
8801HTTPEnvoy 对外公共入口POST /v1/chat/completions;可通过 Envoy 路由规则将GET /v1/models代理到 Router 的 8080 端口
8080HTTPClassification API(健康/信息/分类工具)GET /v1/models、GET /health、GET /info/models、GET /info/classifier、POST /api/v1/classify/intent\|pii\|security\|batch
50051gRPCEnvoy ExtProc,在/v1/chat/completions路径内做分类与路由非 HTTP 端口,不能直接用 curl 访问
9190HTTPPrometheus 指标抓取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"} 8

Reasoning 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.42

gRPC 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 状态码

StatusDescription
200成功
400Bad Request(输入格式错误)
403Forbidden(安全违规)
429Too Many Requests(被限流)
500Internal Server Error
503Service 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.

项目地址:https://gitcode.com/gh_mirrors/sem/semantic-router
点击查看免费下载
上一篇:沉浸式翻译新体验:打破语言壁垒的智能浏览器扩展终极指南
下一篇:AI图像修复革命:IOPaint让复杂水印和物体去除变得如此简单

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 16:32:38

OpenCV C++实现光度立体算法:从多光源图像到法线贴图

简介:这是一份基于C与OpenCV实现的光度立体算法可运行源码,面向计算机视觉初学者和三维重建研究者,用于通过多角度光照图像恢复物体表面法向量、计算广义反射率与梯度图,解决从算法原理到工程实现的落地问题。压缩包共12个文件、约…

作者头像 李华
网站建设 2026/10/23 13:32:12

Codex Skills精选:四个实用技能与完整配置避坑指南

Codex 的 skills 话题最近真的是肉眼可见地热起来了,社区仓库、个人博客、开发者群里到处都在转发各种技能包。我这个人的习惯是,先观望,等大家把坑踩得差不多了再动手。上个月我终于抽出整段时间,把 GitHub 上几个主流的 skills …

作者头像 李华
网站建设 2026/10/24 18:50:59

MapReduce Partitioner原理与生产级自定义实践指南

1. 为什么Partition不是“切蛋糕”,而是“分发路由表”?刚接触MapReduce的开发者,十有八九会在Partition环节栽第一个跟头。我见过太多人把Partitioner理解成“把Map输出按Key哈希后平均切成几块”,然后理所当然地认为&#xff1a…

作者头像 李华
网站建设 2026/10/24 9:34:14

PyTorch图像数据转换:NumPy、PIL.Image与Tensor互转实战指南

1. 为什么你绕不开 numpy、Image 和 Tensor 之间的互转先说个真实场景:你训练一个图像分类模型,数据要从硬盘读进来,经过预处理,喂给 GPU 计算,算完结果再画回一张图看看效果。这一条流水线里,数据形式会经…

作者头像 李华
网站建设 2026/10/24 21:48:05

PHP导入Excel到MySQL实战:从脏数据到大文件,如何保证结果可预期

简介:这份PHP程序面向需要将Excel表格数据批量迁移至MySQL数据库的开发者,尤其适合后台数据导入、系统初始化或日常数据同步等场景。程序通过读取xls文件内容,按指定数据库名、数据表及字段写入,支持中文处理,保存编码…

作者头像 李华
网站建设 2026/11/1 14:17:39

从抽象定义到具体存在:WSaiOS-SI中实例化机制的形式化研究

从抽象定义到具体存在:WSaiOS-SI中实例化机制的形式化研究摘要本文基于WSaiOS结构智能(WSaiOS-SI)理论框架,对实例化(Instantiation)机制进行系统性的形式化研究。实例化作为连接Class抽象定义与Object具体…

作者头像 李华