Skip to content

Commit

Permalink
Sync lmstudio.js schema (2025-03-03) (#23)
Browse files Browse the repository at this point in the history
* Add model token counting RPC endpoint
* Fix type declaration for info on unloaded JIT models
* Note pending support for disabling GPUs in model load config
  • Loading branch information
ncoghlan authored Mar 3, 2025
1 parent 4d88ea2 commit 184acc1
Show file tree
Hide file tree
Showing 5 changed files with 198 additions and 11 deletions.
58 changes: 56 additions & 2 deletions sdk-schema/lms-with-inferred-unions.json
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,12 @@
},
"splitStrategy": {
"$ref": "#/definitions/llmSplitStrategy"
},
"disabledGpus": {
"type": "array",
"items": {
"type": "integer"
}
}
},
"additionalProperties": false
Expand Down Expand Up @@ -3210,6 +3216,50 @@
],
"additionalProperties": false
},
"embedding/rpc/countTokens/parameter": {
"type": "object",
"properties": {
"specifier": {
"$ref": "#/definitions/modelSpecifier"
},
"inputString": {
"type": "string"
}
},
"required": [
"specifier",
"inputString"
],
"additionalProperties": false
},
"embedding/rpc/countTokens/returns": {
"type": "object",
"properties": {
"tokenCount": {
"type": "integer"
}
},
"required": [
"tokenCount"
],
"additionalProperties": false
},
"pseudo/embedding/rpc/countTokens": {
"type": "object",
"properties": {
"parameter": {
"$ref": "#/definitions/embedding/rpc/countTokens/parameter"
},
"returns": {
"$ref": "#/definitions/embedding/rpc/countTokens/returns"
}
},
"required": [
"parameter",
"returns"
],
"additionalProperties": false
},
"embedding/channel/loadModel/creationParameter": {
"type": "object",
"properties": {
Expand Down Expand Up @@ -3390,6 +3440,9 @@
"rpcTokenize": {
"$ref": "#/definitions/pseudo/embedding/rpc/tokenize"
},
"rpcCountTokens": {
"$ref": "#/definitions/pseudo/embedding/rpc/countTokens"
},
"channelLoadModel": {
"$ref": "#/definitions/pseudo/embedding/channel/loadModel"
},
Expand All @@ -3404,6 +3457,7 @@
"rpcGetLoadConfig",
"rpcEmbedString",
"rpcTokenize",
"rpcCountTokens",
"channelLoadModel",
"channelGetOrLoad"
],
Expand Down Expand Up @@ -6216,7 +6270,7 @@
"title": "Type"
},
"info": {
"$ref": "#/definitions/embeddingModelInstanceInfo"
"$ref": "#/definitions/modelInstanceInfo"
}
},
"required": [
Expand Down Expand Up @@ -6608,7 +6662,7 @@
"title": "Type"
},
"info": {
"$ref": "#/definitions/llmInstanceInfo"
"$ref": "#/definitions/modelInstanceInfo"
}
},
"required": [
Expand Down
58 changes: 56 additions & 2 deletions sdk-schema/lms.json
Original file line number Diff line number Diff line change
Expand Up @@ -1174,6 +1174,12 @@
},
"splitStrategy": {
"$ref": "#/definitions/llmSplitStrategy"
},
"disabledGpus": {
"type": "array",
"items": {
"type": "integer"
}
}
},
"additionalProperties": false
Expand Down Expand Up @@ -3689,6 +3695,50 @@
],
"additionalProperties": false
},
"embedding/rpc/countTokens/parameter": {
"type": "object",
"properties": {
"specifier": {
"$ref": "#/definitions/modelSpecifier"
},
"inputString": {
"type": "string"
}
},
"required": [
"specifier",
"inputString"
],
"additionalProperties": false
},
"embedding/rpc/countTokens/returns": {
"type": "object",
"properties": {
"tokenCount": {
"type": "integer"
}
},
"required": [
"tokenCount"
],
"additionalProperties": false
},
"pseudo/embedding/rpc/countTokens": {
"type": "object",
"properties": {
"parameter": {
"$ref": "#/definitions/embedding/rpc/countTokens/parameter"
},
"returns": {
"$ref": "#/definitions/embedding/rpc/countTokens/returns"
}
},
"required": [
"parameter",
"returns"
],
"additionalProperties": false
},
"embedding/channel/loadModel/creationParameter": {
"type": "object",
"properties": {
Expand Down Expand Up @@ -3878,7 +3928,7 @@
"const": "unloadingOtherJITModel"
},
"info": {
"$ref": "#/definitions/embeddingModelInstanceInfo"
"$ref": "#/definitions/modelInstanceInfo"
}
},
"required": [
Expand Down Expand Up @@ -3981,6 +4031,9 @@
"rpcTokenize": {
"$ref": "#/definitions/pseudo/embedding/rpc/tokenize"
},
"rpcCountTokens": {
"$ref": "#/definitions/pseudo/embedding/rpc/countTokens"
},
"channelLoadModel": {
"$ref": "#/definitions/pseudo/embedding/channel/loadModel"
},
Expand All @@ -3995,6 +4048,7 @@
"rpcGetLoadConfig",
"rpcEmbedString",
"rpcTokenize",
"rpcCountTokens",
"channelLoadModel",
"channelGetOrLoad"
],
Expand Down Expand Up @@ -4831,7 +4885,7 @@
"const": "unloadingOtherJITModel"
},
"info": {
"$ref": "#/definitions/llmInstanceInfo"
"$ref": "#/definitions/modelInstanceInfo"
}
},
"required": [
Expand Down
2 changes: 1 addition & 1 deletion sdk-schema/lmstudio-js
Submodule lmstudio-js updated 63 files
+69 −69 package-lock.json
+1 −1 packages/lms-cli
+7 −7 packages/lms-client/package.json
+56 −0 packages/lms-client/src/embedding/.test-snapshots/EmbeddingModel.heavy.test.ts.snap
+22 −0 packages/lms-client/src/embedding/EmbeddingDynamicHandle.ts
+67 −0 packages/lms-client/src/embedding/EmbeddingModel.heavy.test.ts
+3 −2 packages/lms-client/src/embedding/EmbeddingNamespace.ts
+4 −4 packages/lms-client/src/index.ts
+63 −0 packages/lms-client/src/llm/.test-snapshots/LLM.act.heavy.test.ts.snap
+26 −8 packages/lms-client/src/llm/.test-snapshots/LLM.complete.heavy.test.ts.snap
+24 −95 packages/lms-client/src/llm/.test-snapshots/LLM.heavy.test.ts.snap
+39 −15 packages/lms-client/src/llm/.test-snapshots/LLM.respond.heavy.test.ts.snap
+75 −0 packages/lms-client/src/llm/.test-snapshots/LLM.speculativeDecoding.heavy.test.ts.snap
+67 −0 packages/lms-client/src/llm/.test-snapshots/LLM.vision.heavy.test.ts.snap
+4 −4 packages/lms-client/src/llm/ActResult.ts
+111 −0 packages/lms-client/src/llm/LLM.act.heavy.test.ts
+128 −93 packages/lms-client/src/llm/LLM.complete.heavy.test.ts
+25 −101 packages/lms-client/src/llm/LLM.heavy.test.ts
+188 −149 packages/lms-client/src/llm/LLM.respond.heavy.test.ts
+77 −0 packages/lms-client/src/llm/LLM.speculativeDecoding.heavy.test.ts
+83 −0 packages/lms-client/src/llm/LLM.vision.heavy.test.ts
+3 −3 packages/lms-client/src/llm/LLMDynamicHandle.ts
+3 −2 packages/lms-client/src/llm/LLMNamespace.ts
+22 −5 packages/lms-client/src/llm/tool.ts
+8 −6 packages/lms-client/src/modelShared/ModelNamespace.ts
+3 −4 packages/lms-client/src/modelShared/SpecificModel.ts
+33 −3 packages/lms-client/src/shared.heavy.test.ts
+21 −2 packages/lms-client/src/system/SystemNamespace.ts
+3 −3 packages/lms-common-server/package.json
+4 −4 packages/lms-common/package.json
+55 −0 packages/lms-common/src/.test-snapshots/SlicedSignal.test.ts.snap
+138 −0 packages/lms-common/src/SlicedSignal.test.ts
+46 −1 packages/lms-common/src/SlicedSignal.ts
+5 −5 packages/lms-communication-client/package.json
+5 −5 packages/lms-communication-mock/package.json
+4 −4 packages/lms-communication-server/package.json
+3 −3 packages/lms-communication/package.json
+4 −4 packages/lms-es-plugin-runner/package.json
+6 −6 packages/lms-external-backend-interfaces/package.json
+40 −25 packages/lms-external-backend-interfaces/src/baseModelBackendInterface.ts
+20 −2 packages/lms-external-backend-interfaces/src/embeddingBackendInterface.ts
+11 −2 packages/lms-external-backend-interfaces/src/llmBackendInterface.ts
+2 −2 packages/lms-isomorphic/package.json
+5 −5 packages/lms-json-schema/package.json
+3 −3 packages/lms-kv-config/package.json
+10 −7 packages/lms-kv-config/src/schema.ts
+31 −8 packages/lms-kv-config/src/valueTypes.ts
+4 −4 packages/lms-lmstudio/package.json
+2 −2 packages/lms-shared-types/package.json
+5 −0 packages/lms-shared-types/src/llm/LLMLoadModelConfig.ts
+23 −2 packages/lms-shared-types/src/llm/LLMPredictionConfig.ts
+3 −3 publish/cli/package.json
+3 −3 publish/lms/package.json
+3 −3 publish/lmstudio/package.json
+4 −4 publish/sdk/package.json
+1 −1 publish/sdk/src/exportedTypes.ts
+3 −3 scaffolds/node-javascript-empty/package.json
+3 −3 scaffolds/node-javascript/package.json
+1 −1 scaffolds/node-javascript/src/index.js
+3 −3 scaffolds/node-typescript-empty/package.json
+3 −3 scaffolds/node-typescript-preprocessor/package.json
+3 −3 scaffolds/node-typescript/package.json
+1 −1 scaffolds/node-typescript/src/index.ts
87 changes: 82 additions & 5 deletions src/lmstudio/_sdk_models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: lms-with-inferred-unions.json
# timestamp: 2025-02-27T03:57:00+00:00
# timestamp: 2025-03-03T03:25:41+00:00

from __future__ import annotations

Expand Down Expand Up @@ -119,6 +119,10 @@
"EmbeddingModelInstanceAdditionalInfoDict",
"EmbeddingModelInstanceInfo",
"EmbeddingModelInstanceInfoDict",
"EmbeddingRpcCountTokensParameter",
"EmbeddingRpcCountTokensParameterDict",
"EmbeddingRpcCountTokensReturns",
"EmbeddingRpcCountTokensReturnsDict",
"EmbeddingRpcEmbedStringParameter",
"EmbeddingRpcEmbedStringParameterDict",
"EmbeddingRpcEmbedStringReturns",
Expand Down Expand Up @@ -443,6 +447,8 @@
"PseudoEmbeddingChannelLoadModel",
"PseudoEmbeddingChannelLoadModelDict",
"PseudoEmbeddingDict",
"PseudoEmbeddingRpcCountTokens",
"PseudoEmbeddingRpcCountTokensDict",
"PseudoEmbeddingRpcEmbedString",
"PseudoEmbeddingRpcEmbedStringDict",
"PseudoEmbeddingRpcGetLoadConfig",
Expand Down Expand Up @@ -1766,6 +1772,27 @@ class EmbeddingRpcTokenizeReturnsDict(TypedDict):
tokens: Sequence[float]


###############################################################################
# EmbeddingRpcCountTokensReturns
###############################################################################


class EmbeddingRpcCountTokensReturns(
LMStudioStruct["EmbeddingRpcCountTokensReturnsDict"], kw_only=True
):
token_count: int = field(name="tokenCount")


class EmbeddingRpcCountTokensReturnsDict(TypedDict):
"""Corresponding typed dictionary definition for EmbeddingRpcCountTokensReturns.
NOTE: Multi-word keys are defined using their camelCase form,
as that is what `to_dict()` emits, and what `_from_api_dict()` accepts.
"""

tokenCount: int


###############################################################################
# EmbeddingChannelLoadModelCreationParameter
###############################################################################
Expand Down Expand Up @@ -4852,6 +4879,7 @@ class GpuSetting(LMStudioStruct["GpuSettingDict"], kw_only=True):
ratio: LlmLlamaAccelerationOffloadRatio | None = None
main_gpu: int | None = field(name="mainGpu", default=None)
split_strategy: LlmSplitStrategy | None = field(name="splitStrategy", default=None)
disabled_gpus: Sequence[int] | None = field(name="disabledGpus", default=None)


class GpuSettingDict(TypedDict):
Expand All @@ -4864,6 +4892,7 @@ class GpuSettingDict(TypedDict):
ratio: NotRequired[LlmLlamaAccelerationOffloadRatio | None]
mainGpu: NotRequired[int | None]
splitStrategy: NotRequired[LlmSplitStrategy | None]
disabledGpus: NotRequired[Sequence[int] | None]


###############################################################################
Expand Down Expand Up @@ -6479,7 +6508,7 @@ class EmbeddingChannelGetOrLoadToClientPacketUnloadingOtherJITModel(
type: ClassVar[Annotated[Literal["unloadingOtherJITModel"], Meta(title="Type")]] = (
"unloadingOtherJITModel"
)
info: EmbeddingModelInstanceInfo
info: ModelInstanceInfo


class EmbeddingChannelGetOrLoadToClientPacketUnloadingOtherJITModelDict(TypedDict):
Expand All @@ -6490,7 +6519,7 @@ class EmbeddingChannelGetOrLoadToClientPacketUnloadingOtherJITModelDict(TypedDic
"""

type: Literal["unloadingOtherJITModel"]
info: EmbeddingModelInstanceInfoDict
info: ModelInstanceInfo


###############################################################################
Expand Down Expand Up @@ -6650,7 +6679,7 @@ class LlmChannelGetOrLoadToClientPacketUnloadingOtherJITModel(
type: ClassVar[Annotated[Literal["unloadingOtherJITModel"], Meta(title="Type")]] = (
"unloadingOtherJITModel"
)
info: LlmInstanceInfo
info: ModelInstanceInfo


class LlmChannelGetOrLoadToClientPacketUnloadingOtherJITModelDict(TypedDict):
Expand All @@ -6661,7 +6690,7 @@ class LlmChannelGetOrLoadToClientPacketUnloadingOtherJITModelDict(TypedDict):
"""

type: Literal["unloadingOtherJITModel"]
info: LlmInstanceInfoDict
info: ModelInstanceInfo


###############################################################################
Expand Down Expand Up @@ -7247,6 +7276,52 @@ class PseudoEmbeddingRpcTokenizeDict(TypedDict):
returns: EmbeddingRpcTokenizeReturnsDict


###############################################################################
# EmbeddingRpcCountTokensParameter
###############################################################################


class EmbeddingRpcCountTokensParameter(
LMStudioStruct["EmbeddingRpcCountTokensParameterDict"], kw_only=True
):
specifier: ModelSpecifier
input_string: str = field(name="inputString")


class EmbeddingRpcCountTokensParameterDict(TypedDict):
"""Corresponding typed dictionary definition for EmbeddingRpcCountTokensParameter.
NOTE: Multi-word keys are defined using their camelCase form,
as that is what `to_dict()` emits, and what `_from_api_dict()` accepts.
"""

specifier: ModelSpecifierDict
inputString: str


###############################################################################
# PseudoEmbeddingRpcCountTokens
###############################################################################


class PseudoEmbeddingRpcCountTokens(
LMStudioStruct["PseudoEmbeddingRpcCountTokensDict"], kw_only=True
):
parameter: EmbeddingRpcCountTokensParameter
returns: EmbeddingRpcCountTokensReturns


class PseudoEmbeddingRpcCountTokensDict(TypedDict):
"""Corresponding typed dictionary definition for PseudoEmbeddingRpcCountTokens.
NOTE: Multi-word keys are defined using their camelCase form,
as that is what `to_dict()` emits, and what `_from_api_dict()` accepts.
"""

parameter: EmbeddingRpcCountTokensParameterDict
returns: EmbeddingRpcCountTokensReturnsDict


EmbeddingChannelLoadModelToClientPacket = (
EmbeddingChannelLoadModelToClientPacketResolved
| EmbeddingChannelLoadModelToClientPacketProgress
Expand Down Expand Up @@ -7339,6 +7414,7 @@ class PseudoEmbedding(LMStudioStruct["PseudoEmbeddingDict"], kw_only=True):
)
rpc_embed_string: PseudoEmbeddingRpcEmbedString = field(name="rpcEmbedString")
rpc_tokenize: PseudoEmbeddingRpcTokenize = field(name="rpcTokenize")
rpc_count_tokens: PseudoEmbeddingRpcCountTokens = field(name="rpcCountTokens")
channel_load_model: PseudoEmbeddingChannelLoadModel = field(name="channelLoadModel")
channel_get_or_load: PseudoEmbeddingChannelGetOrLoad = field(
name="channelGetOrLoad"
Expand All @@ -7358,6 +7434,7 @@ class PseudoEmbeddingDict(TypedDict):
rpcGetLoadConfig: PseudoEmbeddingRpcGetLoadConfigDict
rpcEmbedString: PseudoEmbeddingRpcEmbedStringDict
rpcTokenize: PseudoEmbeddingRpcTokenizeDict
rpcCountTokens: PseudoEmbeddingRpcCountTokensDict
channelLoadModel: PseudoEmbeddingChannelLoadModelDict
channelGetOrLoad: PseudoEmbeddingChannelGetOrLoadDict

Expand Down
4 changes: 3 additions & 1 deletion tests/test_kv_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@
"mainGpu": 0,
"ratio": 0.5,
"splitStrategy": "evenly",
"disabledGpus": [1, 2]
}
SC_GPU_CONFIG = {"main_gpu": 0, "ratio": 0.5, "split_strategy": "evenly"}
SC_GPU_CONFIG = {"main_gpu": 0, "ratio": 0.5, "split_strategy": "evenly", "disabled_gpus": [1, 2]}

LOAD_CONFIG_EMBEDDING: EmbeddingLoadModelConfigDict = {
"contextLength": 1978,
Expand Down Expand Up @@ -242,6 +243,7 @@ def test_snake_case_conversion(


_NOT_YET_SUPPORTED_KEYS = {
"disabledGpus",
"reasoningParsing",
# "speculativeDecoding" scope
"draftModel",
Expand Down

0 comments on commit 184acc1

Please sign in to comment.