Audio-to-Audio
Moshi
English
speech-to-speech
full-duplex
function-calling
tool-use
voice-agent
realtime
personaplex
low-latency
Instructions to use abhinavpgagi/personaplex-tool-calling with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Moshi
How to use abhinavpgagi/personaplex-tool-calling with Moshi:
# pip install moshi # Run the interactive web server python -m moshi.server --hf-repo "abhinavpgagi/personaplex-tool-calling" # Then open https://localhost:8998 in your browser
# pip install moshi import torch from moshi.models import loaders # Load checkpoint info from HuggingFace checkpoint = loaders.CheckpointInfo.from_hf_repo("abhinavpgagi/personaplex-tool-calling") # Load the Mimi audio codec mimi = checkpoint.get_mimi(device="cuda") mimi.set_num_codebooks(8) # Encode audio (24kHz, mono) wav = torch.randn(1, 1, 24000 * 10) # [batch, channels, samples] with torch.no_grad(): codes = mimi.encode(wav.cuda()) decoded = mimi.decode(codes) - Notebooks
- Google Colab
- Kaggle
| # SPDX-FileCopyrightText: Copyright (c) 2026 Abhinav Kalvacherla | |
| # SPDX-License-Identifier: Apache-2.0 | |
| """ | |
| Per-session config slot for MoshiRAG dynamic function-calling. | |
| A client supplies, at WebSocket connect time, a prompt + a list of declarative | |
| function/API definitions (see http_executor.py for the per-function schema). | |
| The launcher (model.py) captures that config from the connect header in a | |
| monkey-patched `ServerState.handle_chat` and stores it here; the singleton | |
| `APIToolReferenceGenerator` reads it on each RAG trigger. | |
| Concurrency note: the deployment runs `predict_concurrency: 1` (one Moshi | |
| conversation per replica), so a single global slot is safe — there is never | |
| more than one active connection. To support concurrency > 1, replace the slot | |
| with a dict keyed by a session id and thread that id through the per-channel | |
| `RAGManager._active_profile_id` (set via `set_retrieval_profile_id`), which is | |
| already plumbed into `generate_reference_text(..., active_profile_id=...)`. | |
| """ | |
| from __future__ import annotations | |
| import logging | |
| import threading | |
| from dataclasses import dataclass, field | |
| logger = logging.getLogger(__name__) | |
| _VALID_METHODS = {"GET", "POST", "PUT", "PATCH", "DELETE"} | |
| class SessionConfig: | |
| prompt: str | |
| functions: list[dict] = field(default_factory=list) | |
| llm_base_url: str | None = None | |
| llm_model_name: str | None = None | |
| allowed_hosts: list[str] | None = None | |
| filler: str | None = None # spoken while an API call is in flight | |
| _lock = threading.Lock() | |
| _current: SessionConfig | None = None | |
| def set_session_config(raw: dict | None) -> None: | |
| """Validate and store the config for the current connection (or clear it).""" | |
| global _current | |
| cfg = _validate(raw) if raw else None | |
| with _lock: | |
| _current = cfg | |
| if cfg is not None: | |
| logger.info( | |
| "[session] config set: prompt_len=%d functions=%s", | |
| len(cfg.prompt), [f["name"] for f in cfg.functions], | |
| ) | |
| def clear_session_config() -> None: | |
| global _current | |
| with _lock: | |
| _current = None | |
| logger.info("[session] config cleared") | |
| def get_session_config() -> SessionConfig | None: | |
| with _lock: | |
| return _current | |
| def _valid_func(f: object) -> bool: | |
| return ( | |
| isinstance(f, dict) | |
| and isinstance(f.get("name"), str) | |
| and f["name"].strip() != "" | |
| and isinstance(f.get("endpoint"), str) | |
| and str(f.get("method", "GET")).upper() in _VALID_METHODS | |
| ) | |
| def _validate(raw: dict) -> SessionConfig: | |
| prompt = str(raw.get("prompt", "")).strip() | |
| funcs_in = raw.get("functions") or [] | |
| clean: list[dict] = [] | |
| for f in funcs_in: | |
| if _valid_func(f): | |
| clean.append(f) | |
| else: | |
| logger.warning("[session] dropping malformed function def: %r", f) | |
| return SessionConfig( | |
| prompt=prompt, | |
| functions=clean, | |
| llm_base_url=raw.get("llm_base_url"), | |
| llm_model_name=raw.get("llm_model_name"), | |
| allowed_hosts=raw.get("allowed_hosts"), | |
| filler=raw.get("filler"), | |
| ) | |