| from __future__ import annotations |
|
|
| import json |
| from typing import Any |
|
|
| from src.errors import ApiError |
| from src.models import default_model_id |
|
|
|
|
| def extract_openai_payload(body: dict[str, Any]) -> dict[str, Any]: |
| if not isinstance(body, dict): |
| raise ApiError("invalid_request", "request body must be a JSON object", 400) |
|
|
| messages = body.get("messages") |
| if not messages: |
| raise ApiError("invalid_request", "messages is required", 400) |
|
|
| extra = body.get("extra_body") or {} |
| if not isinstance(extra, dict): |
| extra = {} |
|
|
| payload: dict[str, Any] = { |
| "model": body.get("model") or default_model_id(), |
| "messages": messages, |
| "max_tokens": body.get("max_tokens") or body.get("max_completion_tokens"), |
| "thinking": extra.get("thinking", body.get("thinking")), |
| "diffusion_visual": extra.get("diffusion_visual", False), |
| "max_denoising_steps": extra.get("max_denoising_steps"), |
| "diffusion_kv_cache": extra.get("diffusion_kv_cache"), |
| } |
|
|
| |
| for key in [ |
| "diffusion_eb_t_max", |
| "diffusion_eb_t_min", |
| "diffusion_eb_entropy_bound", |
| "diffusion_eb_confidence", |
| "n_gpu_layers", |
| "extra_cli_args", |
| "prompt_mode", |
| ]: |
| if key in extra: |
| payload[key] = extra[key] |
|
|
| return payload |
|
|
|
|
| def make_chat_completion(request_id: str, created: int, model: str, content: str) -> dict[str, Any]: |
| return { |
| "id": request_id, |
| "object": "chat.completion", |
| "created": created, |
| "model": model, |
| "choices": [ |
| { |
| "index": 0, |
| "message": {"role": "assistant", "content": content}, |
| "finish_reason": "stop", |
| } |
| ], |
| "usage": {"prompt_tokens": None, "completion_tokens": None, "total_tokens": None}, |
| } |
|
|
|
|
| def make_sse_chunk( |
| *, |
| request_id: str, |
| created: int, |
| model: str, |
| delta: dict[str, Any], |
| finish_reason: str | None, |
| ) -> str: |
| payload = { |
| "id": request_id, |
| "object": "chat.completion.chunk", |
| "created": created, |
| "model": model, |
| "choices": [ |
| { |
| "index": 0, |
| "delta": delta, |
| "finish_reason": finish_reason, |
| } |
| ], |
| } |
| return "data: " + json.dumps(payload, ensure_ascii=False) + "\n\n" |
|
|
|
|
| def make_sse_done() -> str: |
| return "data: [DONE]\n\n" |
|
|