Unified Model Pipeline with Decoupled Tool Calling
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
调研方向
Read the Phase 1 audit linked in the issue comment and the pending W2 stack (#296 → #297 → #299) to establish what remains; Phase 1 is reported done, while Phases 2–4 are open. For a scoped starting point, inspect llm-core/.../OptimizedLLMRuntime.kt, llm-core/.../dsl/TransformerDsl.kt, and llm-core/.../weights/LLMWeightNameResolvers.kt; the issue calls for DSL networks across model families and a unified runner, but does not define a single completion criterion for those phases.
由索引模型根据 Issue 内容生成。
描述
Context
Currently SKaiNET-transformers has:
- 5+ hand-coded runtimes (LlamaRuntime, Qwen35Runtime, Gemma3nRuntime, ApertusRuntime, VoxtralRuntimes) — each reimplements the forward pass, weight loading, and layer execution
- Tool calling tightly coupled to kllama — the AgentLoop, ToolCallingDemo, and chat modes only exist in the kllama runner. Other models (Gemma, Apertus) cannot use tool calling without duplicating code
- Two execution paths — legacy hand-coded runtimes AND the newer
OptimizedLLMRuntimewith DSL/compute-graph/AOT. LlamaRuntime and ApertusRuntime are already marked deprecated
The goal: converge on one unified pipeline where model definition, weight loading, tokenization, and tool calling are cleanly separated pipeline stages.
Architecture Overview
GGUF/SafeTensors File
|
WeightLoader (parse metadata + tensors)
|
DSL Network Definition (model-specific, declarative)
|
ComputeGraph (DAG)
|
Optimization Pipeline (TransposeElim -> WeightDedup -> LLMFusion -> DCE)
|
ComputeGraphExecutor (fused kernels)
|
InferenceRuntime (unified: forward + generate)
|
TokenizationPipeline (encode/decode, special tokens, byte-level BPE)
|
ChatPipeline (template formatting, tool calling, agent loop)
Status
- Phase 1: DONE (pending merge of the W2 stack #296 → #297 → #299) —
generateUntilStop/GenerateResultpromoted tollm-core(#296),ChatSessionshipped earlier (f42617a), demo/agent CLI + tools extracted from kllama intollm-agent(#296); kllamaMain.ktdispatch is now ~25 thin lines over shared classes. Audit details: https://github.com/SKaiNET-developers/SKaiNET-transformers/issues/49#issuecomment-5255175760 - Phases 2-4: open (out of W2 scope). Note the unified
skainet-cliseed exists but thellm-appsmodules currently fail dependency resolution on develop (empty engine version) — needs a small separate fix.
Phase 1: Decouple Tool Calling from kllama (immediate value)
Problem: Tool calling lives in llm-agent (good) but is wired only through kllama CLI. Other runners can't use it.
Changes:
-
Move AgentLoop's generation into
InferenceRuntimeinterface (llm-core)generateUntilStop()is currently an extension function inllm-agent— promote it or add agenerate()method with stop-token support to the interface- File:
llm-core/.../InferenceRuntime.kt
-
Create
ChatSessionabstraction (llm-agent)- Bundles:
InferenceRuntime+Tokenizer+ChatTemplate+ToolRegistry - Any runner creates a
ChatSessionto get chat/agent/demo modes for free - File: new
llm-agent/.../ChatSession.kt
- Bundles:
-
Extract CLI chat/agent/demo dispatch from kllama Main.kt into shared module
- Currently lines 532-551 of
Main.ktdispatch toToolCallingDemo/AgentCli - This logic should work for any runner that provides
InferenceRuntime+Tokenizer
- Currently lines 532-551 of
Critical files:
llm-core/.../InferenceRuntime.kt— extend interfacellm-agent/.../AgentLoop.kt— already well-abstracted, keep as-isllm-runtime/kllama/.../Main.kt— extract dispatch logicllm-runtime/kllama/.../ToolCallingDemo.kt— move tollm-agentorllm-appsshared module
Phase 2: Unified DSL-Based Model Definition (converge on OptimizedLLMRuntime)
Problem: Each model has a hand-coded runtime. OptimizedLLMRuntime already supports DSL -> graph -> optimized execution, but only some models use it.
Changes:
-
Define DSL networks for all model families:
llamaNetwork(config)— LLaMA/Mistral/Qwen2/3 (standard transformer)qwen35Network(config)— Qwen3.5 (hybrid DeltaNet + full attention)gemmaNetwork(config)— Gemma (GELU, MatFormer FFN, sliding window)apertusNetwork(config)— Apertus (xIELU, ungated MLP, QK-norm)- Each is a pure function returning a
Network<T>from the DSL
-
Unified model loading flow:
detectArchitecture(ggufMetadata) -> ModelFamily ModelFamily.createNetwork(config) -> Network<T> WeightLoader.loadAndMap(file, network) -> weights OptimizedLLMRuntime(network, weights, mode=HYBRID) -> InferenceRuntime -
Remove deprecated hand-coded runtimes once DSL equivalents are validated:
LlamaRuntime->llamaNetwork()+OptimizedLLMRuntimeApertusRuntime->apertusNetwork()+OptimizedLLMRuntime
Critical files:
llm-core/.../OptimizedLLMRuntime.kt— already exists, extendllm-core/.../dsl/TransformerDsl.kt— already has embedding, MHA, SwiGLU, RMSNormllm-core/.../weights/LLMWeightNameResolvers.kt— already maps DSL paths -> GGUF names- New: per-model DSL network definitions
Phase 3: Tokenization as Pipeline Stage
Problem: Tokenization is split between GGUFTokenizer (kllama module), QwenByteLevelBPETokenizer (llm-core), and model-specific code. The byte-level BPE fix we just made shows the fragility.
Changes:
-
Enhance
Tokenizerinterface (llm-core):interface Tokenizer { fun encode(text: String): IntArray fun decode(token: Int): String fun decode(tokens: IntArray): String val eosTokenId: Int val bosTokenId: Int val vocabSize: Int val specialTokens: Set<String> } -
Unified tokenizer factory:
TokenizerFactory.fromGGUF(source)— auto-detects BPE/SentencePiece/WordPieceTokenizerFactory.fromTokenizerJson(json)— HuggingFace format- Returns the correct implementation (byte-level BPE for GPT-2/Qwen, SentencePiece for LLaMA, etc.)
-
Move
GGUFTokenizertollm-coreso all runners can use it without depending on kllama
Phase 4: Unified Runner (single CLI entry point)
Problem: 6 separate CLI apps with duplicated argument parsing, model loading, and dispatch logic.
Changes:
-
Single
skainetCLI that auto-detects model architecture from GGUF metadata:skainet -m model.gguf "prompt" # auto-detect, generate skainet -m model.gguf --chat # auto-detect, chat mode skainet -m model.gguf --demo "What is 2+2?" # auto-detect, tool calling -
Architecture registry:
ModelRegistry.register("llama", ::llamaNetwork) ModelRegistry.register("qwen3", ::qwenNetwork) ModelRegistry.register("gemma", ::gemmaNetwork) -
Auto-detection from GGUF metadata (already exists in
peekGgufMetadata())
Verification
- All existing unit tests pass (
llm-agent,llm-runtime:kllama,llm-core) - Smoke test suite passes (generation + tool calling)
- Basic generation produces identical output for all model families
- Tool calling works for any model that supports ChatML/Qwen/Llama3 templates
OptimizedLLMRuntimein HYBRID mode matches hand-coded runtime output
- 主要语言
- Kotlin
- 星标
- 8
- 派生
- 3
- 平均合并
- 1 天 16 小时
- 30 天内合并 PR
- 48
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
SKaiNET-developers/SKaiNET-transformers 的其他 Issue
-
documentation good first issue size:xs skill:docs sub-issue
难度 2/5 1-3 小时 新手友好度 78/100
SKaiNET-developers/SKaiNET-transformers#478 · 1 条评论 ·
维护者通常 1 天内回复
-
enhancement skill:kotlin-core
难度 4/5 3-5 天 新手友好度 48/100
SKaiNET-developers/SKaiNET-transformers#502 ·
维护者通常 1 天内回复
-
bug
难度 4/5 3-5 天 新手友好度 48/100
SKaiNET-developers/SKaiNET-transformers#483 ·
维护者通常 1 天内回复
-
coding good first issue size:s skill:kotlin-core sub-issue
难度 4/5 1-2 天 新手友好度 64/100
SKaiNET-developers/SKaiNET-transformers#477 · 1 条评论 ·
维护者通常 1 天内回复
-
coding good first issue size:s skill:numerics sub-issue
难度 4/5 3-5 天 新手友好度 55/100
SKaiNET-developers/SKaiNET-transformers#476 · 1 条评论 ·
维护者通常 1 天内回复
查看 SKaiNET-developers/SKaiNET-transformers 的全部 Issue
相似的 Issue
-
[Bug] Lock owned by another client (e.g. Text app) cannot be unlocked from the app可能已有人在做 @falkloewert 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
submit-adaption submit-adaption-pre
难度 1/5 1 小时以内 新手友好度 75/100
BetterAndroid/android-notification-icon-project#763 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
simplex-chat/simplex-chat#7755 ·
维护者通常 1 天内回复
-
afk-ok area:data-quality importer size:S
难度 2/5 1-3 小时 新手友好度 82/100
enorm-labs/event-junkie#3586 ·
维护者通常 1 天内回复
-
bug good first issue
难度 2/5 1-3 小时 新手友好度 68/100
scarif-labs/horus#61 ·
维护者通常 1 天内回复