Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Seven llama_sampler_init_* bindings admit keyword arguments that the ctypes function object silently drops

オープン 初心者向け
#2,371 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
88/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
api

調査の方向性

llama_cpp/llama_cpp.py の 4553-4606 行付近にある 7 つの llama_sampler_init_* 定義から始め、次に llama_cpp/_ctypes_extensions.py:146-152 の ctypes_function を読んで、エクスポートされる関数がどのように作成されるかを確認します。周囲の定義に合わせて、7 つの binding パラメーターを positional-only にし、それらのシグネチャがキーワード呼び出しを促さなくなったことを確認します。

索引モデルが issue の本文から書いたものです。

説明

Summary

In llama_cpp/llama_cpp.py, seven bindings are declared as defs whose parameters are NOT
positional-only, while every other decorated binding in the file uses /:

line (main d736646) def
4553 def llama_sampler_init_dist(seed: int) -> llama_sampler_p
4560 def llama_sampler_init_top_k(k: int) -> llama_sampler_p
4570 def llama_sampler_init_top_p(p: float, min_keep: int) -> llama_sampler_p
4580 def llama_sampler_init_min_p(p: float, min_keep: int) -> llama_sampler_p
4590 def llama_sampler_init_typical(p: float, min_keep: int) -> llama_sampler_p
4596 def llama_sampler_init_temp(t: float) -> llama_sampler_p
4606 def llama_sampler_init_temp_ext(t: float, delta: float, exponent: float) -> llama_sampler_p

ctypes_function (llama_cpp/_ctypes_extensions.py:146-152) replaces the def with the
ctypes function object:

def decorator(f):
    if enabled:
        func = getattr(lib, name)
        func.argtypes = argtypes
        func.restype = restype
        functools.wraps(f)(func)
        return func

so the name the module exports IS getattr(lib, "llama_sampler_init_top_k"). A ctypes
function object without paramflags binds no argument by name, but functools.wraps and
the (f: F) -> F typing make inspect.signature, pyright and IDEs show the def's
signature — which invites keyword calls the object cannot honour.

What happens (CPython 3.12.10, ctypes)

>>> import ctypes; lib = ctypes.CDLL(None); f = lib.abs
>>> f.argtypes = [ctypes.c_int]; f.restype = ctypes.c_int
>>> f(-3, x=1)        # an extra keyword is DROPPED silently
3
>>> f(x=-3)           # all-keyword: refused
TypeError: this function takes at least 1 argument (0 given)

Applied to these bindings:

  • llama_sampler_init_top_k(k=40) — type-checks clean, raises TypeError at run time.
  • llama_sampler_init_top_p(0.9, min_keep=2) — type-checks clean, runs, and passes ONE
    positional to a two-parameter C function: min_keep is silently dropped and the C side
    reads whatever the register/stack held for it.

No caller inside the repository is affected today (_internals.py:705-732 and the server
pass positionals), so this is a latent API hazard rather than a current bug — but the
signature is public and the failure is invisible to every static check.

Fix

Make the seven defs positional-only, as the other bindings already are:

def llama_sampler_init_top_k(k: int, /) -> llama_sampler_p: ...

(Alternatively, build the functions through a CFUNCTYPE prototype with paramflags,
which does bind by name — but the one-character fix matches the file's convention.)

Found with SemLinker, a cross-language contract checker we are developing; happy to send a PR.

主要言語
Python
スター
10.6k
フォーク
1.5k
平均マージ
6時間 43分
マージ済み PR(30日)
2

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

abetlen/llama-cpp-python のほかの issue

abetlen/llama-cpp-python の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。