feat: LLMClient Protocol gains embed() method (T112.1)
Adds async def embed(self, text: str, *, model: str) -> list[float] to the LLMClient Protocol so Phase 4.5 can wire a real-embedding swap without changing call sites. Protocol is structural — existing implementations that don't use it remain compatible; downstream implementations (FeatherlessClient, MockLLMClient) ship in T112.2 and T112.3.
This commit is contained in:
@@ -12,3 +12,11 @@ class Message:
|
||||
class LLMClient(Protocol):
|
||||
async def generate(self, messages: Sequence[Message], *, model: str, **params) -> str: ...
|
||||
def stream(self, messages: Sequence[Message], *, model: str, **params) -> AsyncIterator[str]: ...
|
||||
# T112 (Phase 4.5): real-embedding seam. Implementations either call a
|
||||
# provider's ``/v1/embeddings`` endpoint or, when the provider doesn't
|
||||
# expose embeddings (e.g. Featherless today), raise ``NotImplementedError``
|
||||
# so ``generate_embedding`` can catch it and degrade to the zero-vector
|
||||
# fallback. The Protocol is structural, so this method only needs to
|
||||
# exist on implementations; existing callers that don't use it are
|
||||
# unaffected.
|
||||
async def embed(self, text: str, *, model: str) -> list[float]: ...
|
||||
|
||||
Reference in New Issue
Block a user