mirror of
https://github.com/kvcache-ai/ktransformers.git
synced 2026-04-28 11:49:51 +00:00
Some checks failed
Book-CI / test (push) Has been cancelled
Book-CI / test-1 (push) Has been cancelled
Book-CI / test-2 (push) Has been cancelled
Deploy / deploy (macos-latest) (push) Has been cancelled
Deploy / deploy (ubuntu-latest) (push) Has been cancelled
Deploy / deploy (windows-latest) (push) Has been cancelled
* [feat]: redesign kt run interactive configuration with i18n support - Redesign kt run with 8-step interactive flow (model selection, inference method, NUMA/CPU, GPU experts, KV cache, GPU/TP selection, parsers, host/port) - Add configuration save/load system (~/.ktransformers/run_configs.yaml) - Add i18n support for kt chat (en/zh translations) - Add universal input validators with auto-retry and Chinese comma support - Add port availability checker with auto-suggestion - Add parser configuration (--tool-call-parser, --reasoning-parser) - Remove tuna command and clean up redundant files - Fix: variable reference bug in run.py, filter to show only MoE models * [feat]: unify model selection UI and enable shared experts fusion by default - Unify kt run model selection table with kt model list display * Add Total size, MoE Size, Repo, and SHA256 status columns * Use consistent formatting and styling * Improve user decision-making with more information - Enable --disable-shared-experts-fusion by default * Change default value from False to True * Users can still override with --enable-shared-experts-fusion * [feat]: improve kt chat with performance metrics and better CJK support - Add performance metrics display after each response * Total time, TTFT (Time To First Token), TPOT (Time Per Output Token) * Accurate input/output token counts using model tokenizer * Fallback to estimation if tokenizer unavailable * Metrics shown in dim style (not prominent) - Fix Chinese character input issues * Replace Prompt.ask() with console.input() for better CJK support * Fixes backspace deletion showing half-characters - Suppress NumPy subnormal warnings * Filter "The value of the smallest subnormal" warnings * Cleaner CLI output on certain hardware environments * [fix]: correct TTFT measurement in kt chat - Move start_time initialization before API call - Previously start_time was set when receiving first chunk, causing TTFT ≈ 0ms - Now correctly measures time from request sent to first token received * [docs]: 添加 Clawdbot 集成指南 - KTransformers 企业级 AI 助手部署方案 * [docs]: 强调推荐使用 Kimi K2.5 作为核心模型,突出企业级推理能力 * [docs]: 添加 Clawdbot 飞书接入教程链接 * [feat]: improve CLI table display, model verification, and chat experience - Add sequence number (#) column to all model tables by default - Filter kt edit to show only MoE GPU models (exclude AMX) - Extend kt model verify to check *.json and *.py files in addition to weights - Fix re-verification bug where repaired files caused false failures - Suppress tokenizer debug output in kt chat token counting * [fix]: fix cpu cores. --------- Co-authored-by: skqliao <skqliao@gmail.com>
57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
"""
|
|
Port availability checking utilities.
|
|
"""
|
|
|
|
import socket
|
|
from typing import Tuple
|
|
|
|
|
|
def is_port_available(host: str, port: int) -> bool:
|
|
"""Check if a port is available on the given host.
|
|
|
|
Args:
|
|
host: Host address (e.g., "0.0.0.0", "127.0.0.1")
|
|
port: Port number to check
|
|
|
|
Returns:
|
|
True if port is available, False if occupied
|
|
"""
|
|
try:
|
|
# Try to bind to the port
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
sock.settimeout(1)
|
|
|
|
# Use SO_REUSEADDR to allow binding to recently closed ports
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
|
|
# Try to bind
|
|
result = sock.connect_ex((host if host != "0.0.0.0" else "127.0.0.1", port))
|
|
sock.close()
|
|
|
|
# If connect_ex returns 0, port is occupied
|
|
# If it returns error (non-zero), port is available
|
|
return result != 0
|
|
|
|
except Exception:
|
|
# If any error occurs, assume port is not available
|
|
return False
|
|
|
|
|
|
def find_available_port(host: str, start_port: int, max_attempts: int = 100) -> Tuple[bool, int]:
|
|
"""Find an available port starting from start_port.
|
|
|
|
Args:
|
|
host: Host address
|
|
start_port: Starting port number to check
|
|
max_attempts: Maximum number of ports to try
|
|
|
|
Returns:
|
|
Tuple of (found, port_number)
|
|
- found: True if an available port was found
|
|
- port_number: The available port number (or start_port if not found)
|
|
"""
|
|
for port in range(start_port, start_port + max_attempts):
|
|
if is_port_available(host, port):
|
|
return True, port
|
|
|
|
return False, start_port
|