Files
wehub-resource-sync 770d92cb1f
Lint / lint (push) Has been cancelled
Build Docs / Deploy Docs (push) Has been cancelled
Windows CI / Windows (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:23:58 +08:00

74 lines
2.7 KiB
Python

"""MicroServing server entrypoints in MLC LLM"""
import fastapi
from mlc_llm.protocol.debug_protocol import DisaggConfig
from mlc_llm.protocol.microserving_protocol import (
PrepRecvRequest,
PrepRecvResponse,
RemoteSendRequest,
StartGenerateRequest,
)
from mlc_llm.protocol.openai_api_protocol import StreamOptions
from .openai_entrypoints import request_completion
app = fastapi.APIRouter()
################ MicroServing Endpoints ################
@app.post("/microserving/prep_recv")
async def prep_recv(request: PrepRecvRequest, raw_request: fastapi.Request) -> PrepRecvResponse:
"""Handle the microserving request for receive preparation.
Match the prompt in the prefix cache (when enabled),
allocate entries in the KV cache to prepare receiving the KV data of the prompt.
Return the matched prefix length and the allocated KV entry metadata.
"""
request.debug_config.disagg_config = DisaggConfig(
kind="prepare_receive",
kv_window_begin=0, # always zero for prepare_receive
kv_window_end=request.end,
)
request.stream_options = StreamOptions(include_usage=True)
request.stream = False
response = await request_completion(request=request, raw_request=raw_request)
assert response.usage is not None
assert response.usage.extra is not None
assert "prefix_matched_length" in response.usage.extra
assert "kv_append_metadata" in response.usage.extra
return PrepRecvResponse(
prefix_matched_length=response.usage.extra["prefix_matched_length"],
kv_append_metadata=response.usage.extra["kv_append_metadata"],
)
@app.post("/microserving/remote_send")
async def remote_send(request: RemoteSendRequest, raw_request: fastapi.Request):
"""Compute and generate the KV data of the prompt in the specified KV window.
Send the KV data to the destination server."""
request.debug_config.disagg_config = DisaggConfig(
kind="remote_send",
kv_window_begin=request.begin,
kv_window_end=request.end,
kv_append_metadata=request.kv_addr_info,
dst_group_offset=request.recv_rank,
)
request.stream_options = StreamOptions(include_usage=True)
request.stream = False
await request_completion(request=request, raw_request=raw_request)
return {}
@app.post("/microserving/start_generate")
async def start_generate(request: StartGenerateRequest, raw_request: fastapi.Request):
"""Prefill the prompt in the specified KV window, and start decode."""
request.debug_config.disagg_config = DisaggConfig(
kind="start_generation",
kv_window_begin=request.begin,
)
return await request_completion(request=request, raw_request=raw_request)