ommlds 0.0.0.dev426__py3-none-any.whl → 0.0.0.dev485__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. ommlds/.omlish-manifests.json +336 -39
  2. ommlds/__about__.py +16 -10
  3. ommlds/_hacks/__init__.py +4 -0
  4. ommlds/_hacks/funcs.py +110 -0
  5. ommlds/_hacks/names.py +158 -0
  6. ommlds/_hacks/params.py +73 -0
  7. ommlds/_hacks/patches.py +0 -3
  8. ommlds/backends/anthropic/protocol/__init__.py +13 -1
  9. ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
  10. ommlds/backends/anthropic/protocol/_marshal.py +2 -2
  11. ommlds/backends/anthropic/protocol/sse/_marshal.py +1 -1
  12. ommlds/backends/anthropic/protocol/sse/assemble.py +23 -7
  13. ommlds/backends/anthropic/protocol/sse/events.py +13 -0
  14. ommlds/backends/anthropic/protocol/types.py +40 -8
  15. ommlds/backends/google/protocol/__init__.py +16 -0
  16. ommlds/backends/google/protocol/_dataclasses.py +5997 -0
  17. ommlds/backends/google/protocol/_marshal.py +16 -0
  18. ommlds/backends/google/protocol/types.py +626 -0
  19. ommlds/backends/groq/__init__.py +7 -0
  20. ommlds/backends/groq/_dataclasses.py +3901 -0
  21. ommlds/backends/groq/_marshal.py +23 -0
  22. ommlds/backends/groq/protocol.py +249 -0
  23. ommlds/backends/llamacpp/logging.py +4 -1
  24. ommlds/backends/mlx/caching.py +7 -3
  25. ommlds/backends/mlx/cli.py +10 -7
  26. ommlds/backends/mlx/generation.py +19 -17
  27. ommlds/backends/mlx/limits.py +10 -6
  28. ommlds/backends/mlx/loading.py +65 -5
  29. ommlds/backends/ollama/__init__.py +7 -0
  30. ommlds/backends/ollama/_dataclasses.py +3458 -0
  31. ommlds/backends/ollama/protocol.py +170 -0
  32. ommlds/backends/openai/protocol/__init__.py +24 -29
  33. ommlds/backends/openai/protocol/_common.py +18 -0
  34. ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
  35. ommlds/backends/openai/protocol/_marshal.py +27 -0
  36. ommlds/backends/openai/protocol/chatcompletion/chunk.py +58 -31
  37. ommlds/backends/openai/protocol/chatcompletion/contentpart.py +49 -44
  38. ommlds/backends/openai/protocol/chatcompletion/message.py +55 -43
  39. ommlds/backends/openai/protocol/chatcompletion/request.py +114 -66
  40. ommlds/backends/openai/protocol/chatcompletion/response.py +71 -45
  41. ommlds/backends/openai/protocol/chatcompletion/responseformat.py +27 -20
  42. ommlds/backends/openai/protocol/chatcompletion/tokenlogprob.py +16 -7
  43. ommlds/backends/openai/protocol/completionusage.py +24 -15
  44. ommlds/backends/tavily/__init__.py +7 -0
  45. ommlds/backends/tavily/_dataclasses.py +1734 -0
  46. ommlds/backends/tavily/protocol.py +301 -0
  47. ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
  48. ommlds/backends/transformers/__init__.py +14 -0
  49. ommlds/backends/transformers/filecache.py +109 -0
  50. ommlds/backends/transformers/streamers.py +73 -0
  51. ommlds/cli/__init__.py +7 -0
  52. ommlds/cli/_dataclasses.py +2562 -0
  53. ommlds/cli/asyncs.py +30 -0
  54. ommlds/cli/backends/catalog.py +93 -0
  55. ommlds/cli/backends/configs.py +9 -0
  56. ommlds/cli/backends/inject.py +31 -36
  57. ommlds/cli/backends/injection.py +16 -0
  58. ommlds/cli/backends/types.py +46 -0
  59. ommlds/cli/content/messages.py +34 -0
  60. ommlds/cli/content/strings.py +42 -0
  61. ommlds/cli/inject.py +17 -32
  62. ommlds/cli/inputs/__init__.py +0 -0
  63. ommlds/cli/inputs/asyncs.py +32 -0
  64. ommlds/cli/inputs/sync.py +75 -0
  65. ommlds/cli/main.py +270 -110
  66. ommlds/cli/rendering/__init__.py +0 -0
  67. ommlds/cli/rendering/configs.py +9 -0
  68. ommlds/cli/rendering/inject.py +31 -0
  69. ommlds/cli/rendering/markdown.py +52 -0
  70. ommlds/cli/rendering/raw.py +73 -0
  71. ommlds/cli/rendering/types.py +21 -0
  72. ommlds/cli/secrets.py +21 -0
  73. ommlds/cli/sessions/base.py +1 -1
  74. ommlds/cli/sessions/chat/chat/__init__.py +0 -0
  75. ommlds/cli/sessions/chat/chat/ai/__init__.py +0 -0
  76. ommlds/cli/sessions/chat/chat/ai/configs.py +11 -0
  77. ommlds/cli/sessions/chat/chat/ai/inject.py +74 -0
  78. ommlds/cli/sessions/chat/chat/ai/injection.py +14 -0
  79. ommlds/cli/sessions/chat/chat/ai/rendering.py +70 -0
  80. ommlds/cli/sessions/chat/chat/ai/services.py +79 -0
  81. ommlds/cli/sessions/chat/chat/ai/tools.py +44 -0
  82. ommlds/cli/sessions/chat/chat/ai/types.py +28 -0
  83. ommlds/cli/sessions/chat/chat/state/__init__.py +0 -0
  84. ommlds/cli/sessions/chat/chat/state/configs.py +11 -0
  85. ommlds/cli/sessions/chat/chat/state/inject.py +36 -0
  86. ommlds/cli/sessions/chat/chat/state/inmemory.py +33 -0
  87. ommlds/cli/sessions/chat/chat/state/storage.py +52 -0
  88. ommlds/cli/sessions/chat/chat/state/types.py +38 -0
  89. ommlds/cli/sessions/chat/chat/user/__init__.py +0 -0
  90. ommlds/cli/sessions/chat/chat/user/configs.py +17 -0
  91. ommlds/cli/sessions/chat/chat/user/inject.py +62 -0
  92. ommlds/cli/sessions/chat/chat/user/interactive.py +31 -0
  93. ommlds/cli/sessions/chat/chat/user/oneshot.py +25 -0
  94. ommlds/cli/sessions/chat/chat/user/types.py +15 -0
  95. ommlds/cli/sessions/chat/configs.py +27 -0
  96. ommlds/cli/sessions/chat/driver.py +43 -0
  97. ommlds/cli/sessions/chat/inject.py +33 -65
  98. ommlds/cli/sessions/chat/phases/__init__.py +0 -0
  99. ommlds/cli/sessions/chat/phases/inject.py +27 -0
  100. ommlds/cli/sessions/chat/phases/injection.py +14 -0
  101. ommlds/cli/sessions/chat/phases/manager.py +29 -0
  102. ommlds/cli/sessions/chat/phases/types.py +29 -0
  103. ommlds/cli/sessions/chat/session.py +27 -0
  104. ommlds/cli/sessions/chat/tools/__init__.py +0 -0
  105. ommlds/cli/sessions/chat/tools/configs.py +22 -0
  106. ommlds/cli/sessions/chat/tools/confirmation.py +46 -0
  107. ommlds/cli/sessions/chat/tools/execution.py +66 -0
  108. ommlds/cli/sessions/chat/tools/fs/__init__.py +0 -0
  109. ommlds/cli/sessions/chat/tools/fs/configs.py +12 -0
  110. ommlds/cli/sessions/chat/tools/fs/inject.py +35 -0
  111. ommlds/cli/sessions/chat/tools/inject.py +88 -0
  112. ommlds/cli/sessions/chat/tools/injection.py +44 -0
  113. ommlds/cli/sessions/chat/tools/rendering.py +58 -0
  114. ommlds/cli/sessions/chat/tools/todo/__init__.py +0 -0
  115. ommlds/cli/sessions/chat/tools/todo/configs.py +12 -0
  116. ommlds/cli/sessions/chat/tools/todo/inject.py +31 -0
  117. ommlds/cli/sessions/chat/tools/weather/__init__.py +0 -0
  118. ommlds/cli/sessions/chat/tools/weather/configs.py +12 -0
  119. ommlds/cli/sessions/chat/tools/weather/inject.py +22 -0
  120. ommlds/cli/{tools/weather.py → sessions/chat/tools/weather/tools.py} +1 -1
  121. ommlds/cli/sessions/completion/configs.py +21 -0
  122. ommlds/cli/sessions/completion/inject.py +42 -0
  123. ommlds/cli/sessions/completion/session.py +35 -0
  124. ommlds/cli/sessions/embedding/configs.py +21 -0
  125. ommlds/cli/sessions/embedding/inject.py +42 -0
  126. ommlds/cli/sessions/embedding/session.py +33 -0
  127. ommlds/cli/sessions/inject.py +28 -11
  128. ommlds/cli/state/__init__.py +0 -0
  129. ommlds/cli/state/inject.py +28 -0
  130. ommlds/cli/{state.py → state/storage.py} +41 -24
  131. ommlds/minichain/__init__.py +84 -24
  132. ommlds/minichain/_dataclasses.py +15401 -0
  133. ommlds/minichain/_marshal.py +49 -9
  134. ommlds/minichain/_typedvalues.py +2 -4
  135. ommlds/minichain/backends/catalogs/base.py +20 -1
  136. ommlds/minichain/backends/catalogs/simple.py +2 -2
  137. ommlds/minichain/backends/catalogs/strings.py +10 -8
  138. ommlds/minichain/backends/impls/anthropic/chat.py +65 -27
  139. ommlds/minichain/backends/impls/anthropic/names.py +10 -8
  140. ommlds/minichain/backends/impls/anthropic/protocol.py +109 -0
  141. ommlds/minichain/backends/impls/anthropic/stream.py +111 -43
  142. ommlds/minichain/backends/impls/duckduckgo/search.py +6 -2
  143. ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
  144. ommlds/minichain/backends/impls/dummy/chat.py +69 -0
  145. ommlds/minichain/backends/impls/google/chat.py +114 -22
  146. ommlds/minichain/backends/impls/google/search.py +7 -2
  147. ommlds/minichain/backends/impls/google/stream.py +219 -0
  148. ommlds/minichain/backends/impls/google/tools.py +149 -0
  149. ommlds/minichain/backends/impls/groq/__init__.py +0 -0
  150. ommlds/minichain/backends/impls/groq/chat.py +75 -0
  151. ommlds/minichain/backends/impls/groq/names.py +48 -0
  152. ommlds/minichain/backends/impls/groq/protocol.py +143 -0
  153. ommlds/minichain/backends/impls/groq/stream.py +125 -0
  154. ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
  155. ommlds/minichain/backends/impls/llamacpp/chat.py +40 -22
  156. ommlds/minichain/backends/impls/llamacpp/completion.py +9 -5
  157. ommlds/minichain/backends/impls/llamacpp/format.py +4 -2
  158. ommlds/minichain/backends/impls/llamacpp/stream.py +43 -23
  159. ommlds/minichain/backends/impls/mistral.py +20 -5
  160. ommlds/minichain/backends/impls/mlx/chat.py +101 -24
  161. ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
  162. ommlds/minichain/backends/impls/ollama/chat.py +199 -0
  163. ommlds/minichain/backends/impls/openai/chat.py +18 -8
  164. ommlds/minichain/backends/impls/openai/completion.py +10 -3
  165. ommlds/minichain/backends/impls/openai/embedding.py +10 -3
  166. ommlds/minichain/backends/impls/openai/format.py +131 -106
  167. ommlds/minichain/backends/impls/openai/names.py +31 -5
  168. ommlds/minichain/backends/impls/openai/stream.py +43 -25
  169. ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
  170. ommlds/minichain/backends/impls/tavily.py +66 -0
  171. ommlds/minichain/backends/impls/tinygrad/chat.py +30 -20
  172. ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
  173. ommlds/minichain/backends/impls/transformers/sentence.py +6 -3
  174. ommlds/minichain/backends/impls/transformers/tokens.py +10 -7
  175. ommlds/minichain/backends/impls/transformers/transformers.py +160 -37
  176. ommlds/minichain/backends/strings/parsing.py +1 -1
  177. ommlds/minichain/backends/strings/resolving.py +4 -1
  178. ommlds/minichain/chat/_marshal.py +16 -9
  179. ommlds/minichain/chat/choices/adapters.py +4 -4
  180. ommlds/minichain/chat/choices/services.py +1 -1
  181. ommlds/minichain/chat/choices/stream/__init__.py +0 -0
  182. ommlds/minichain/chat/choices/stream/adapters.py +35 -0
  183. ommlds/minichain/chat/choices/stream/joining.py +31 -0
  184. ommlds/minichain/chat/choices/stream/services.py +45 -0
  185. ommlds/minichain/chat/choices/stream/types.py +43 -0
  186. ommlds/minichain/chat/choices/types.py +2 -2
  187. ommlds/minichain/chat/history.py +3 -3
  188. ommlds/minichain/chat/messages.py +55 -19
  189. ommlds/minichain/chat/services.py +3 -3
  190. ommlds/minichain/chat/stream/_marshal.py +16 -0
  191. ommlds/minichain/chat/stream/joining.py +85 -0
  192. ommlds/minichain/chat/stream/services.py +15 -21
  193. ommlds/minichain/chat/stream/types.py +32 -19
  194. ommlds/minichain/chat/tools/execution.py +8 -7
  195. ommlds/minichain/chat/tools/ids.py +9 -15
  196. ommlds/minichain/chat/tools/parsing.py +17 -26
  197. ommlds/minichain/chat/transforms/base.py +29 -38
  198. ommlds/minichain/chat/transforms/metadata.py +30 -4
  199. ommlds/minichain/chat/transforms/services.py +9 -11
  200. ommlds/minichain/content/_marshal.py +44 -20
  201. ommlds/minichain/content/json.py +13 -0
  202. ommlds/minichain/content/materialize.py +14 -21
  203. ommlds/minichain/content/prepare.py +4 -0
  204. ommlds/minichain/content/transforms/interleave.py +1 -1
  205. ommlds/minichain/content/transforms/squeeze.py +1 -1
  206. ommlds/minichain/content/transforms/stringify.py +1 -1
  207. ommlds/minichain/json.py +20 -0
  208. ommlds/minichain/lib/code/__init__.py +0 -0
  209. ommlds/minichain/lib/code/prompts.py +6 -0
  210. ommlds/minichain/lib/fs/binfiles.py +108 -0
  211. ommlds/minichain/lib/fs/context.py +126 -0
  212. ommlds/minichain/lib/fs/errors.py +101 -0
  213. ommlds/minichain/lib/fs/suggestions.py +36 -0
  214. ommlds/minichain/lib/fs/tools/__init__.py +0 -0
  215. ommlds/minichain/lib/fs/tools/edit.py +104 -0
  216. ommlds/minichain/lib/fs/tools/ls.py +38 -0
  217. ommlds/minichain/lib/fs/tools/read.py +115 -0
  218. ommlds/minichain/lib/fs/tools/recursivels/__init__.py +0 -0
  219. ommlds/minichain/lib/fs/tools/recursivels/execution.py +40 -0
  220. ommlds/minichain/lib/todo/__init__.py +0 -0
  221. ommlds/minichain/lib/todo/context.py +54 -0
  222. ommlds/minichain/lib/todo/tools/__init__.py +0 -0
  223. ommlds/minichain/lib/todo/tools/read.py +44 -0
  224. ommlds/minichain/lib/todo/tools/write.py +335 -0
  225. ommlds/minichain/lib/todo/types.py +60 -0
  226. ommlds/minichain/llms/_marshal.py +25 -17
  227. ommlds/minichain/llms/types.py +4 -0
  228. ommlds/minichain/registries/globals.py +18 -4
  229. ommlds/minichain/resources.py +68 -45
  230. ommlds/minichain/search.py +1 -1
  231. ommlds/minichain/services/_marshal.py +46 -39
  232. ommlds/minichain/services/facades.py +3 -3
  233. ommlds/minichain/services/services.py +1 -1
  234. ommlds/minichain/standard.py +8 -0
  235. ommlds/minichain/stream/services.py +152 -38
  236. ommlds/minichain/stream/wrap.py +22 -24
  237. ommlds/minichain/text/toolparsing/llamacpp/hermes2.py +3 -2
  238. ommlds/minichain/text/toolparsing/llamacpp/llama31.py +3 -2
  239. ommlds/minichain/text/toolparsing/llamacpp/utils.py +3 -2
  240. ommlds/minichain/tools/_marshal.py +1 -1
  241. ommlds/minichain/tools/execution/catalog.py +2 -1
  242. ommlds/minichain/tools/execution/context.py +34 -14
  243. ommlds/minichain/tools/execution/errors.py +15 -0
  244. ommlds/minichain/tools/execution/executors.py +8 -3
  245. ommlds/minichain/tools/execution/reflect.py +40 -5
  246. ommlds/minichain/tools/fns.py +46 -9
  247. ommlds/minichain/tools/jsonschema.py +14 -5
  248. ommlds/minichain/tools/reflect.py +54 -18
  249. ommlds/minichain/tools/types.py +33 -1
  250. ommlds/minichain/utils.py +27 -0
  251. ommlds/minichain/vectors/_marshal.py +11 -10
  252. ommlds/minichain/vectors/types.py +1 -1
  253. ommlds/nanochat/LICENSE +21 -0
  254. ommlds/nanochat/__init__.py +0 -0
  255. ommlds/nanochat/rustbpe/LICENSE +21 -0
  256. ommlds/nanochat/tokenizers.py +406 -0
  257. ommlds/server/cli.py +1 -2
  258. ommlds/server/server.py +5 -5
  259. ommlds/server/service.py +1 -1
  260. ommlds/specs/__init__.py +0 -0
  261. ommlds/specs/mcp/__init__.py +0 -0
  262. ommlds/specs/mcp/_marshal.py +23 -0
  263. ommlds/specs/mcp/clients.py +146 -0
  264. ommlds/specs/mcp/protocol.py +371 -0
  265. ommlds/tools/git.py +35 -12
  266. ommlds/tools/ocr.py +8 -9
  267. ommlds/wiki/analyze.py +6 -7
  268. ommlds/wiki/text/mfh.py +1 -5
  269. ommlds/wiki/text/wtp.py +1 -3
  270. ommlds/wiki/utils/xml.py +5 -5
  271. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/METADATA +24 -21
  272. ommlds-0.0.0.dev485.dist-info/RECORD +436 -0
  273. ommlds/cli/backends/standard.py +0 -20
  274. ommlds/cli/sessions/chat/base.py +0 -42
  275. ommlds/cli/sessions/chat/interactive.py +0 -73
  276. ommlds/cli/sessions/chat/printing.py +0 -96
  277. ommlds/cli/sessions/chat/prompt.py +0 -143
  278. ommlds/cli/sessions/chat/state.py +0 -109
  279. ommlds/cli/sessions/chat/tools.py +0 -91
  280. ommlds/cli/sessions/completion/completion.py +0 -44
  281. ommlds/cli/sessions/embedding/embedding.py +0 -42
  282. ommlds/cli/tools/config.py +0 -13
  283. ommlds/cli/tools/inject.py +0 -64
  284. ommlds/minichain/chat/stream/adapters.py +0 -69
  285. ommlds/minichain/lib/fs/ls/execution.py +0 -32
  286. ommlds-0.0.0.dev426.dist-info/RECORD +0 -303
  287. /ommlds/{cli/tools → backends/google}/__init__.py +0 -0
  288. /ommlds/{huggingface.py → backends/huggingface.py} +0 -0
  289. /ommlds/{minichain/lib/fs/ls → cli/content}/__init__.py +0 -0
  290. /ommlds/minichain/lib/fs/{ls → tools/recursivels}/rendering.py +0 -0
  291. /ommlds/minichain/lib/fs/{ls → tools/recursivels}/running.py +0 -0
  292. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/WHEEL +0 -0
  293. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/entry_points.txt +0 -0
  294. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/licenses/LICENSE +0 -0
  295. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,27 @@
1
+ from omlish import lang
2
+ from omlish import marshal as msh
3
+
4
+ from .chatcompletion.contentpart import ChatCompletionContentPart
5
+ from .chatcompletion.message import ChatCompletionMessage
6
+ from .chatcompletion.responseformat import ChatCompletionResponseFormat
7
+
8
+
9
+ ##
10
+
11
+
12
+ @lang.static_init
13
+ def _install_standard_marshaling() -> None:
14
+ for root_cls, tag_field in [
15
+ (ChatCompletionContentPart, 'type'),
16
+ (ChatCompletionMessage, 'role'),
17
+ (ChatCompletionResponseFormat, 'type'),
18
+ ]:
19
+ msh.install_standard_factories(*msh.standard_polymorphism_factories(
20
+ msh.polymorphism_from_subclasses(
21
+ root_cls,
22
+ naming=msh.Naming.SNAKE,
23
+ strip_suffix=msh.AutoStripSuffix,
24
+ ),
25
+ msh.FieldTypeTagging(tag_field),
26
+ unions='partial',
27
+ ))
@@ -1,71 +1,98 @@
1
1
  import typing as ta
2
2
 
3
+ from omlish import dataclasses as dc
4
+ from omlish import lang
5
+
6
+ from .._common import _set_class_marshal_options
7
+ from ..completionusage import CompletionUsage
3
8
  from .tokenlogprob import ChatCompletionTokenLogprob
4
9
 
5
10
 
6
11
  ##
7
12
 
8
13
 
9
- class ChatCompletionChunkChoiceDeltaToolCallFunction(ta.TypedDict, total=False):
10
- arguments: str
11
- name: str
12
-
13
-
14
- class ChatCompletionChunkChoiceDeltaToolCall(ta.TypedDict):
15
- index: int
16
- id: ta.NotRequired[str]
17
- function: ta.NotRequired[ChatCompletionChunkChoiceDeltaToolCallFunction]
18
- type: ta.Literal['function']
19
-
20
-
21
- #
14
+ @dc.dataclass(frozen=True, kw_only=True)
15
+ @_set_class_marshal_options
16
+ class ChatCompletionChunkChoiceDelta(lang.Final):
17
+ content: str | None = None
22
18
 
19
+ refusal: str | None = None
23
20
 
24
- class ChatCompletionChunkChoiceDelta(ta.TypedDict, total=False):
25
- content: str
26
- refusal: str
27
21
  role: ta.Literal[
28
22
  'developer',
29
23
  'system',
30
24
  'user',
31
25
  'assistant',
32
26
  'tool',
33
- ]
34
- tool_calls: ta.Sequence[ChatCompletionChunkChoiceDeltaToolCall]
27
+ ] | None = None
35
28
 
29
+ @dc.dataclass(frozen=True, kw_only=True)
30
+ class ToolCall(lang.Final):
31
+ index: int
36
32
 
37
- #
33
+ id: str | None = None
34
+
35
+ @dc.dataclass(frozen=True, kw_only=True)
36
+ class Function(lang.Final):
37
+ arguments: str | None = None
38
+ name: str | None = None
39
+
40
+ function: Function | None = None
38
41
 
42
+ type: ta.Literal['function'] = dc.xfield('function', repr=False)
39
43
 
40
- class ChatCompletionChunkChoiceLogprobs(ta.TypedDict, total=False):
41
- content: ta.Sequence[ChatCompletionTokenLogprob]
42
- refusal: ta.Sequence[ChatCompletionTokenLogprob]
44
+ tool_calls: ta.Sequence[ToolCall] | None = None
45
+
46
+
47
+ #
43
48
 
44
49
 
45
- class ChatCompletionChunkChoice(ta.TypedDict):
50
+ @dc.dataclass(frozen=True, kw_only=True)
51
+ @_set_class_marshal_options
52
+ class ChatCompletionChunkChoice(lang.Final):
46
53
  delta: ChatCompletionChunkChoiceDelta
47
- finish_reason: ta.NotRequired[ta.Literal[
54
+
55
+ finish_reason: ta.Literal[
48
56
  'stop',
49
57
  'length',
50
58
  'tool_calls',
51
59
  'content_filter',
52
- ]]
60
+ ] | None = None
61
+
53
62
  index: int
54
- logprobs: ta.NotRequired[ChatCompletionChunkChoiceLogprobs]
63
+
64
+ @dc.dataclass(frozen=True, kw_only=True)
65
+ class Logprobs(lang.Final):
66
+ content: ta.Sequence[ChatCompletionTokenLogprob] | None = None
67
+ refusal: ta.Sequence[ChatCompletionTokenLogprob] | None = None
68
+
69
+ logprobs: Logprobs | None = None
55
70
 
56
71
 
57
72
  #
58
73
 
59
74
 
60
- class ChatCompletionChunk(ta.TypedDict):
75
+ @dc.dataclass(frozen=True, kw_only=True)
76
+ @_set_class_marshal_options
77
+ class ChatCompletionChunk(lang.Final):
61
78
  id: str
79
+
62
80
  choices: ta.Sequence[ChatCompletionChunkChoice]
81
+
63
82
  created: int
83
+
64
84
  model: str
65
- object: ta.Literal['chat.completion.chunk']
66
- service_tier: ta.NotRequired[ta.Literal[
85
+
86
+ object: ta.Literal['chat.completion.chunk'] = dc.xfield('chat.completion.chunk', repr=False)
87
+
88
+ service_tier: ta.Literal[
67
89
  'auto',
68
90
  'default',
69
91
  'flex',
70
- ]]
71
- system_fingerprint: ta.NotRequired[str]
92
+ ] | None = None
93
+
94
+ system_fingerprint: str | None = None
95
+
96
+ usage: CompletionUsage | None = None
97
+
98
+ obfuscation: str | None = None
@@ -1,77 +1,82 @@
1
- # ruff: noqa: UP007 UP045
2
1
  import typing as ta
3
2
 
3
+ from omlish import dataclasses as dc
4
+ from omlish import lang
4
5
 
5
- ##
6
+ from .._common import _set_class_marshal_options
6
7
 
7
8
 
8
- class TextChatCompletionContentPart(ta.TypedDict):
9
- text: str
10
- type: ta.Literal['text']
9
+ ##
11
10
 
12
11
 
13
- #
12
+ class ChatCompletionContentPart(lang.Abstract):
13
+ pass
14
14
 
15
15
 
16
- class ImageChatCompletionContentPartImageUrl(ta.TypedDict):
17
- url: ta.Required[str]
18
- detail: ta.NotRequired[ta.Literal[
19
- 'auto',
20
- 'low',
21
- 'high',
22
- ]]
16
+ #
23
17
 
24
18
 
25
- class ImageChatCompletionContentPart(ta.TypedDict):
26
- image_url: ImageChatCompletionContentPartImageUrl
27
- type: ta.Literal['image_url']
19
+ @dc.dataclass(frozen=True)
20
+ @_set_class_marshal_options
21
+ class TextChatCompletionContentPart(ChatCompletionContentPart, lang.Final):
22
+ text: str
28
23
 
29
24
 
30
25
  #
31
26
 
32
27
 
33
- class FileChatCompletionContentPartFileInfo(ta.TypedDict, total=False):
34
- file_data: str
35
- file_id: str
36
- filename: str
28
+ @dc.dataclass(frozen=True)
29
+ @_set_class_marshal_options
30
+ class ImageUrlChatCompletionContentPart(ChatCompletionContentPart, lang.Final):
31
+ @dc.dataclass(frozen=True)
32
+ class ImageUrl(lang.Final):
33
+ url: str
34
+ detail: ta.Literal[
35
+ 'auto',
36
+ 'low',
37
+ 'high',
38
+ ]
37
39
 
38
-
39
- class FileChatCompletionContentPart(ta.TypedDict):
40
- file: FileChatCompletionContentPartFileInfo
41
- type: ta.Literal['file']
40
+ image_url: ImageUrl
42
41
 
43
42
 
44
43
  #
45
44
 
46
45
 
47
- class InputAudioChatCompletionContentPartInputAudio(ta.TypedDict):
48
- data: str
49
- format: ta.Literal[
50
- 'wav',
51
- 'mp3',
52
- ]
53
-
46
+ @dc.dataclass(frozen=True)
47
+ @_set_class_marshal_options
48
+ class FileChatCompletionContentPart(ChatCompletionContentPart, lang.Final):
49
+ @dc.dataclass(frozen=True, kw_only=True)
50
+ class File(lang.Final):
51
+ file_data: str | None = None
52
+ file_id: str | None = None
53
+ filename: str | None = None
54
54
 
55
- class InputAudioChatCompletionContentPart(ta.TypedDict):
56
- input_audio: InputAudioChatCompletionContentPartInputAudio
57
- type: ta.Literal['input_audio']
55
+ file: File
58
56
 
59
57
 
60
58
  #
61
59
 
62
60
 
63
- class RefusalChatCompletionContentPart(ta.TypedDict):
64
- refusal: str
65
- type: ta.Literal['refusal']
61
+ @dc.dataclass(frozen=True)
62
+ @_set_class_marshal_options
63
+ class InputAudioChatCompletionContentPart(ChatCompletionContentPart, lang.Final):
64
+ @dc.dataclass(frozen=True)
65
+ @_set_class_marshal_options
66
+ class InputAudio(lang.Final):
67
+ data: str
68
+ format: ta.Literal[
69
+ 'wav',
70
+ 'mp3',
71
+ ]
72
+
73
+ input_audio: InputAudio
66
74
 
67
75
 
68
76
  #
69
77
 
70
78
 
71
- ChatCompletionContentPart: ta.TypeAlias = ta.Union[
72
- TextChatCompletionContentPart,
73
- ImageChatCompletionContentPart,
74
- FileChatCompletionContentPart,
75
- InputAudioChatCompletionContentPart,
76
- RefusalChatCompletionContentPart,
77
- ]
79
+ @dc.dataclass(frozen=True)
80
+ @_set_class_marshal_options
81
+ class RefusalChatCompletionContentPart(ChatCompletionContentPart, lang.Final):
82
+ refusal: str
@@ -1,6 +1,9 @@
1
- # ruff: noqa: UP007 UP045
2
1
  import typing as ta
3
2
 
3
+ from omlish import dataclasses as dc
4
+ from omlish import lang
5
+
6
+ from .._common import _set_class_marshal_options
4
7
  from .contentpart import ChatCompletionContentPart
5
8
  from .contentpart import RefusalChatCompletionContentPart
6
9
  from .contentpart import TextChatCompletionContentPart
@@ -9,83 +12,92 @@ from .contentpart import TextChatCompletionContentPart
9
12
  ##
10
13
 
11
14
 
12
- class DeveloperChatCompletionMessage(ta.TypedDict):
15
+ class ChatCompletionMessage(lang.Abstract, lang.Sealed):
16
+ pass
17
+
18
+
19
+ #
20
+
21
+
22
+ @dc.dataclass(frozen=True, kw_only=True)
23
+ @_set_class_marshal_options
24
+ class DeveloperChatCompletionMessage(ChatCompletionMessage, lang.Final):
13
25
  content: str | ta.Iterable[TextChatCompletionContentPart]
14
- role: ta.Literal['developer']
15
- name: ta.NotRequired[str]
26
+ name: str | None = None
16
27
 
17
28
 
18
29
  #
19
30
 
20
31
 
21
- class SystemChatCompletionMessage(ta.TypedDict):
32
+ @dc.dataclass(frozen=True, kw_only=True)
33
+ @_set_class_marshal_options
34
+ class SystemChatCompletionMessage(ChatCompletionMessage, lang.Final):
22
35
  content: str | ta.Iterable[TextChatCompletionContentPart]
23
- role: ta.Literal['system']
24
- name: ta.NotRequired[str]
36
+ name: str | None = None
25
37
 
26
38
 
27
39
  #
28
40
 
29
41
 
30
- class UserChatCompletionMessage(ta.TypedDict):
42
+ @dc.dataclass(frozen=True, kw_only=True)
43
+ @_set_class_marshal_options
44
+ class UserChatCompletionMessage(ChatCompletionMessage, lang.Final):
31
45
  content: str | ta.Iterable[ChatCompletionContentPart]
32
- role: ta.Literal['user']
33
- name: ta.NotRequired[str]
46
+ name: str | None = None
34
47
 
35
48
 
36
49
  #
37
50
 
38
51
 
39
- class AssistantChatCompletionMessageAudio(ta.TypedDict):
40
- id: str
52
+ @dc.dataclass(frozen=True, kw_only=True)
53
+ @_set_class_marshal_options
54
+ class AssistantChatCompletionMessage(ChatCompletionMessage, lang.Final):
55
+ @dc.dataclass(frozen=True, kw_only=True)
56
+ @_set_class_marshal_options
57
+ class Audio(lang.Final):
58
+ id: str
41
59
 
60
+ audio: Audio | None = None
42
61
 
43
- class AssistantChatCompletionMessageToolCallFunction(ta.TypedDict):
44
- arguments: str
45
- name: str
62
+ content: str | ta.Iterable[TextChatCompletionContentPart | RefusalChatCompletionContentPart] | None = None
46
63
 
64
+ name: str | None = None
47
65
 
48
- class AssistantChatCompletionMessageToolCall(ta.TypedDict):
49
- id: str
50
- function: AssistantChatCompletionMessageToolCallFunction
51
- type: ta.Literal['function']
66
+ refusal: str | None = None
52
67
 
68
+ @dc.dataclass(frozen=True, kw_only=True)
69
+ @_set_class_marshal_options
70
+ class ToolCall(lang.Final):
71
+ id: str
53
72
 
54
- class AssistantChatCompletionMessage(ta.TypedDict, total=False):
55
- role: ta.Required[ta.Literal['assistant']]
56
- audio: AssistantChatCompletionMessageAudio
57
- content: str | ta.Iterable[TextChatCompletionContentPart | RefusalChatCompletionContentPart]
58
- name: str
59
- refusal: str
60
- tool_calls: ta.Iterable[AssistantChatCompletionMessageToolCall]
73
+ @dc.dataclass(frozen=True, kw_only=True)
74
+ @_set_class_marshal_options
75
+ class Function(lang.Final):
76
+ arguments: str
77
+ name: str
78
+
79
+ function: Function
80
+
81
+ type: ta.Literal['function'] = dc.xfield('function', repr=False)
82
+
83
+ tool_calls: ta.Iterable[ToolCall] | None = None
61
84
 
62
85
 
63
86
  #
64
87
 
65
88
 
66
- class ToolChatCompletionMessage(ta.TypedDict):
89
+ @dc.dataclass(frozen=True, kw_only=True)
90
+ @_set_class_marshal_options
91
+ class ToolChatCompletionMessage(ChatCompletionMessage, lang.Final):
67
92
  content: str | ta.Iterable[TextChatCompletionContentPart]
68
- role: ta.Literal['tool']
69
93
  tool_call_id: str
70
94
 
71
95
 
72
96
  #
73
97
 
74
98
 
75
- class FunctionChatCompletionMessage(ta.TypedDict):
99
+ @dc.dataclass(frozen=True, kw_only=True)
100
+ @_set_class_marshal_options
101
+ class FunctionChatCompletionMessage(ChatCompletionMessage, lang.Final):
76
102
  content: str | None
77
103
  name: str
78
- role: ta.Literal['function']
79
-
80
-
81
- #
82
-
83
-
84
- ChatCompletionMessage: ta.TypeAlias = ta.Union[
85
- DeveloperChatCompletionMessage,
86
- SystemChatCompletionMessage,
87
- UserChatCompletionMessage,
88
- AssistantChatCompletionMessage,
89
- ToolChatCompletionMessage,
90
- FunctionChatCompletionMessage,
91
- ]
@@ -1,6 +1,10 @@
1
- # ruff: noqa: UP007 UP045
1
+ # ruff: noqa: UP007
2
2
  import typing as ta
3
3
 
4
+ from omlish import dataclasses as dc
5
+ from omlish import lang
6
+
7
+ from .._common import _set_class_marshal_options
4
8
  from .contentpart import TextChatCompletionContentPart
5
9
  from .message import ChatCompletionMessage
6
10
  from .responseformat import ChatCompletionResponseFormat
@@ -9,73 +13,85 @@ from .responseformat import ChatCompletionResponseFormat
9
13
  ##
10
14
 
11
15
 
12
- class ChatCompletionRequestWebSearchOptionsUserLocationApproximate(ta.TypedDict, total=False):
13
- city: str
14
- country: str
15
- region: str
16
- timezone: str
17
-
18
-
19
- class ChatCompletionRequestWebSearchOptionsUserLocation(ta.TypedDict):
20
- approximate: ChatCompletionRequestWebSearchOptionsUserLocationApproximate
21
- type: ta.Literal['approximate']
22
-
23
-
24
- class ChatCompletionRequestWebSearchOptions(ta.TypedDict, total=False):
16
+ @dc.dataclass(frozen=True, kw_only=True)
17
+ @_set_class_marshal_options
18
+ class ChatCompletionRequestWebSearchOptions(lang.Final):
25
19
  search_context_size: ta.Literal[
26
20
  'low',
27
21
  'medium',
28
22
  'high',
29
- ]
30
- user_location: ChatCompletionRequestWebSearchOptionsUserLocation
23
+ ] | None = None
31
24
 
25
+ @dc.dataclass(frozen=True, kw_only=True)
26
+ @_set_class_marshal_options
27
+ class UserLocation(lang.Final):
28
+ @dc.dataclass(frozen=True, kw_only=True)
29
+ @_set_class_marshal_options
30
+ class Approximate(lang.Final):
31
+ city: str | None = None
32
+ country: str | None = None
33
+ region: str | None = None
34
+ timezone: str | None = None
32
35
 
33
- #
36
+ approximate: Approximate
34
37
 
38
+ type: ta.Literal['approximate'] = dc.xfield('approximate', repr=False, kw_only=True)
35
39
 
36
- class ChatCompletionRequestPrediction(ta.TypedDict):
37
- content: str | ta.Iterable[TextChatCompletionContentPart]
38
- type: ta.Literal['content']
40
+ user_location: UserLocation | None = None
39
41
 
40
42
 
41
43
  #
42
44
 
43
45
 
44
- class ChatCompletionRequestToolFunction(ta.TypedDict, total=False):
45
- name: ta.Required[str]
46
- description: str
47
- parameters: ta.Mapping[str, ta.Any]
48
- strict: bool
49
-
46
+ @dc.dataclass(frozen=True, kw_only=True)
47
+ @_set_class_marshal_options
48
+ class ChatCompletionRequestPrediction(lang.Final):
49
+ content: str | ta.Iterable[TextChatCompletionContentPart]
50
50
 
51
- class ChatCompletionRequestTool(ta.TypedDict):
52
- function: ChatCompletionRequestToolFunction
53
- type: ta.Literal['function']
51
+ type: ta.Literal['content'] = dc.xfield('content', repr=False, kw_only=True)
54
52
 
55
53
 
56
54
  #
57
55
 
58
56
 
59
- class ChatCompletionRequestStreamOptions(ta.TypedDict, total=False):
60
- include_usage: bool
57
+ @dc.dataclass(frozen=True)
58
+ @_set_class_marshal_options
59
+ class ChatCompletionRequestTool(lang.Final):
60
+ @dc.dataclass(frozen=True, kw_only=True)
61
+ @_set_class_marshal_options
62
+ class Function(lang.Final):
63
+ name: str
64
+ description: str | None = None
65
+ parameters: ta.Mapping[str, ta.Any] | None = None
66
+ strict: bool | None = None
67
+
68
+ function: Function
69
+
70
+ type: ta.Literal['function'] = dc.xfield('function', repr=False, kw_only=True)
61
71
 
62
72
 
63
73
  #
64
74
 
65
75
 
66
- class ChatCompletionRequestNamedToolChoiceFunction(ta.TypedDict):
67
- name: str
76
+ @dc.dataclass(frozen=True)
77
+ @_set_class_marshal_options
78
+ class ChatCompletionRequestNamedToolChoice(lang.Final):
79
+ @dc.dataclass(frozen=True)
80
+ @_set_class_marshal_options
81
+ class Function(lang.Final):
82
+ name: str
68
83
 
84
+ function: Function
69
85
 
70
- class ChatCompletionRequestNamedToolChoice(ta.TypedDict):
71
- function: ChatCompletionRequestNamedToolChoiceFunction
72
- type: ta.Literal['function']
86
+ type: ta.Literal['function'] = dc.xfield('function', repr=False, kw_only=True)
73
87
 
74
88
 
75
89
  #
76
90
 
77
91
 
78
- class ChatCompletionRequestAudio(ta.TypedDict):
92
+ @dc.dataclass(frozen=True, kw_only=True)
93
+ @_set_class_marshal_options
94
+ class ChatCompletionRequestAudio(lang.Final):
79
95
  format: ta.Literal[
80
96
  'wav',
81
97
  'aac',
@@ -91,40 +107,68 @@ class ChatCompletionRequestAudio(ta.TypedDict):
91
107
  #
92
108
 
93
109
 
94
- class ChatCompletionRequest(ta.TypedDict, total=False):
95
- messages: ta.Required[ta.Iterable[ChatCompletionMessage]]
96
- model: ta.Required[str]
97
- audio: ChatCompletionRequestAudio
98
- frequency_penalty: float
99
- logit_bias: ta.Mapping[str, int]
100
- logprobs: bool
101
- max_completion_tokens: int
102
- max_tokens: int
103
- metadata: ta.Mapping[str, str]
110
+ @dc.dataclass(frozen=True, kw_only=True)
111
+ @_set_class_marshal_options
112
+ class ChatCompletionRequest(lang.Final):
113
+ messages: ta.Iterable[ChatCompletionMessage]
114
+
115
+ model: str
116
+
117
+ audio: ChatCompletionRequestAudio | None = None
118
+
119
+ frequency_penalty: float | None = None
120
+ logit_bias: ta.Mapping[str, int] | None = None
121
+ logprobs: bool | None = None
122
+
123
+ max_completion_tokens: int | None = None
124
+ max_tokens: int | None = None
125
+
126
+ metadata: ta.Mapping[str, str] | None = None
127
+
104
128
  modalities: ta.Sequence[ta.Literal[
105
129
  'text',
106
130
  'audio',
107
- ]]
108
- n: int
109
- parallel_tool_calls: bool
110
- prediction: ChatCompletionRequestPrediction
111
- presence_penalty: float
131
+ ]] | None = None
132
+
133
+ n: int | None = None
134
+
135
+ parallel_tool_calls: bool | None = None
136
+
137
+ prediction: ChatCompletionRequestPrediction | None = None
138
+
139
+ presence_penalty: float | None = None
140
+
112
141
  reasoning_effort: ta.Literal[
113
142
  'low',
114
143
  'medium',
115
144
  'high',
116
- ]
117
- response_format: ChatCompletionResponseFormat
118
- seed: int
145
+ ] | None = None
146
+
147
+ response_format: ChatCompletionResponseFormat | None = None
148
+
149
+ seed: int | None = None
150
+
119
151
  service_tier: ta.Literal[
120
152
  'auto',
121
153
  'default',
122
154
  'flex',
123
- ]
124
- stop: ta.Union[str, ta.Sequence[str], None]
125
- store: bool
126
- stream_options: ChatCompletionRequestStreamOptions
127
- temperature: float
155
+ ] | None = None
156
+
157
+ stop: ta.Union[str, ta.Sequence[str], None] = None
158
+
159
+ store: bool | None = None
160
+
161
+ stream: bool | None = None
162
+
163
+ @dc.dataclass(frozen=True, kw_only=True)
164
+ @_set_class_marshal_options
165
+ class StreamOptions(lang.Final):
166
+ include_usage: bool | None = None
167
+
168
+ stream_options: StreamOptions | None = None
169
+
170
+ temperature: float | None = None
171
+
128
172
  tool_choice: ta.Union[
129
173
  ta.Literal[
130
174
  'none',
@@ -132,9 +176,13 @@ class ChatCompletionRequest(ta.TypedDict, total=False):
132
176
  'required',
133
177
  ],
134
178
  ChatCompletionRequestNamedToolChoice,
135
- ]
136
- tools: ta.Iterable[ChatCompletionRequestTool]
137
- top_logprobs: int
138
- top_p: float
139
- user: str
140
- web_search_options: ChatCompletionRequestWebSearchOptions
179
+ ] | None = None
180
+
181
+ tools: ta.Iterable[ChatCompletionRequestTool] | None = None
182
+
183
+ top_logprobs: int | None = None
184
+ top_p: float | None = None
185
+
186
+ user: str | None = None
187
+
188
+ web_search_options: ChatCompletionRequestWebSearchOptions | None = None