ommlds 0.0.0.dev487__py3-none-any.whl → 0.0.0.dev489__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 (38) hide show
  1. ommlds/.omlish-manifests.json +54 -0
  2. ommlds/__about__.py +1 -1
  3. ommlds/backends/cerebras/__init__.py +7 -0
  4. ommlds/backends/cerebras/_dataclasses.py +4254 -0
  5. ommlds/backends/cerebras/_marshal.py +24 -0
  6. ommlds/backends/cerebras/protocol.py +312 -0
  7. ommlds/cli/_dataclasses.py +272 -88
  8. ommlds/cli/main.py +29 -9
  9. ommlds/cli/secrets.py +1 -0
  10. ommlds/cli/sessions/chat/chat/user/configs.py +0 -1
  11. ommlds/cli/sessions/chat/chat/user/inject.py +0 -10
  12. ommlds/cli/sessions/chat/configs.py +2 -0
  13. ommlds/cli/sessions/chat/inject.py +3 -0
  14. ommlds/cli/sessions/chat/interface/__init__.py +0 -0
  15. ommlds/cli/sessions/chat/interface/bare/__init__.py +0 -0
  16. ommlds/cli/sessions/chat/interface/bare/inject.py +32 -0
  17. ommlds/cli/sessions/chat/interface/bare/interface.py +19 -0
  18. ommlds/cli/sessions/chat/{chat/user/interactive.py → interface/bare/user.py} +1 -1
  19. ommlds/cli/sessions/chat/interface/base.py +13 -0
  20. ommlds/cli/sessions/chat/interface/configs.py +15 -0
  21. ommlds/cli/sessions/chat/interface/inject.py +24 -0
  22. ommlds/cli/sessions/chat/interface/textual/__init__.py +0 -0
  23. ommlds/cli/sessions/chat/interface/textual/app.py +191 -0
  24. ommlds/cli/sessions/chat/interface/textual/inject.py +27 -0
  25. ommlds/cli/sessions/chat/interface/textual/interface.py +22 -0
  26. ommlds/cli/sessions/chat/interface/textual/user.py +20 -0
  27. ommlds/cli/sessions/chat/session.py +12 -4
  28. ommlds/minichain/backends/impls/cerebras/__init__.py +0 -0
  29. ommlds/minichain/backends/impls/cerebras/chat.py +80 -0
  30. ommlds/minichain/backends/impls/cerebras/names.py +30 -0
  31. ommlds/minichain/backends/impls/cerebras/protocol.py +143 -0
  32. ommlds/minichain/backends/impls/cerebras/stream.py +125 -0
  33. {ommlds-0.0.0.dev487.dist-info → ommlds-0.0.0.dev489.dist-info}/METADATA +6 -6
  34. {ommlds-0.0.0.dev487.dist-info → ommlds-0.0.0.dev489.dist-info}/RECORD +38 -17
  35. {ommlds-0.0.0.dev487.dist-info → ommlds-0.0.0.dev489.dist-info}/WHEEL +0 -0
  36. {ommlds-0.0.0.dev487.dist-info → ommlds-0.0.0.dev489.dist-info}/entry_points.txt +0 -0
  37. {ommlds-0.0.0.dev487.dist-info → ommlds-0.0.0.dev489.dist-info}/licenses/LICENSE +0 -0
  38. {ommlds-0.0.0.dev487.dist-info → ommlds-0.0.0.dev489.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,30 @@
1
+ """
2
+ https://inference-docs.cerebras.ai/models/overview
3
+ """
4
+ from ....models.names import ModelNameCollection
5
+ from ...strings.manifests import BackendStringsManifest
6
+
7
+
8
+ ##
9
+
10
+
11
+ MODEL_NAMES = ModelNameCollection(
12
+ default='gpt-oss-120b',
13
+ aliases={
14
+ 'llama3.1-8b': None,
15
+ 'llama-3.3-70b': None,
16
+ 'gpt-oss-120b': None,
17
+ 'qwen-3-32b': None,
18
+ },
19
+ )
20
+
21
+
22
+ # @omlish-manifest
23
+ _BACKEND_STRINGS_MANIFEST = BackendStringsManifest(
24
+ [
25
+ 'ChatChoicesService',
26
+ 'ChatChoicesStreamService',
27
+ ],
28
+ 'cerebras',
29
+ model_names=MODEL_NAMES,
30
+ )
@@ -0,0 +1,143 @@
1
+ import itertools
2
+
3
+ from omlish import check
4
+ from omlish.formats import json
5
+
6
+ from .....backends.cerebras import protocol as pt
7
+ from ....chat.choices.services import ChatChoicesResponse
8
+ from ....chat.choices.stream.types import AiChoiceDeltas
9
+ from ....chat.choices.types import AiChoice
10
+ from ....chat.messages import AiMessage
11
+ from ....chat.messages import AnyAiMessage
12
+ from ....chat.messages import Chat
13
+ from ....chat.messages import SystemMessage
14
+ from ....chat.messages import ToolUseMessage
15
+ from ....chat.messages import ToolUseResultMessage
16
+ from ....chat.messages import UserMessage
17
+ from ....chat.stream.types import AiDelta
18
+ from ....chat.stream.types import ContentAiDelta
19
+ from ....chat.stream.types import ToolUseAiDelta
20
+ from ....chat.tools.types import Tool
21
+ from ....content.prepare import prepare_content_str
22
+ from ....tools.jsonschema import build_tool_spec_params_json_schema
23
+ from ....tools.types import ToolUse
24
+
25
+
26
+ ##
27
+
28
+
29
+ def build_cer_request_messages(chat: Chat) -> list[pt.ChatCompletionRequest.Message]:
30
+ cer_msgs: list[pt.ChatCompletionRequest.Message] = []
31
+
32
+ for _, g in itertools.groupby(chat, lambda mc_m: isinstance(mc_m, AnyAiMessage)):
33
+ mc_msgs = list(g)
34
+
35
+ if isinstance(mc_msgs[0], AnyAiMessage):
36
+ tups: list[tuple[AiMessage | None, list[ToolUseMessage]]] = []
37
+ for mc_msg in mc_msgs:
38
+ if isinstance(mc_msg, AiMessage):
39
+ tups.append((mc_msg, []))
40
+
41
+ elif isinstance(mc_msg, ToolUseMessage):
42
+ if not tups:
43
+ tups.append((None, []))
44
+ tups[-1][1].append(mc_msg)
45
+
46
+ else:
47
+ raise TypeError(mc_msg)
48
+
49
+ for mc_ai_msg, mc_tu_msgs in tups:
50
+ cer_msgs.append(pt.ChatCompletionRequest.AssistantMessage(
51
+ content=check.isinstance(mc_ai_msg.c, str) if mc_ai_msg is not None else None,
52
+ tool_calls=[
53
+ pt.ChatCompletionRequest.AssistantMessage.ToolCall(
54
+ function=pt.ChatCompletionRequest.AssistantMessage.ToolCall.Function(
55
+ name=mc_tu_msg.tu.name,
56
+ arguments=check.not_none(mc_tu_msg.tu.raw_args),
57
+ ),
58
+ id=check.not_none(mc_tu_msg.tu.id),
59
+ )
60
+ for mc_tu_msg in mc_tu_msgs
61
+ ] if mc_tu_msgs else None,
62
+ ))
63
+
64
+ else:
65
+ for mc_msg in mc_msgs:
66
+ if isinstance(mc_msg, SystemMessage):
67
+ cer_msgs.append(pt.ChatCompletionRequest.SystemMessage(
68
+ content=check.isinstance(mc_msg.c, str),
69
+ ))
70
+
71
+ elif isinstance(mc_msg, UserMessage):
72
+ cer_msgs.append(pt.ChatCompletionRequest.UserMessage(
73
+ content=check.isinstance(mc_msg.c, str),
74
+ ))
75
+
76
+ elif isinstance(mc_msg, ToolUseResultMessage):
77
+ cer_msgs.append(pt.ChatCompletionRequest.ToolMessage(
78
+ tool_call_id=check.not_none(mc_msg.tur.id),
79
+ content=check.isinstance(mc_msg.tur.c, str),
80
+ ))
81
+
82
+ else:
83
+ raise TypeError(mc_msg)
84
+
85
+ return cer_msgs
86
+
87
+
88
+ def build_cer_request_tool(t: Tool) -> pt.ChatCompletionRequest.Tool:
89
+ return pt.ChatCompletionRequest.Tool(
90
+ function=pt.ChatCompletionRequest.Tool.Function(
91
+ name=check.not_none(t.spec.name),
92
+ description=prepare_content_str(t.spec.desc),
93
+ parameters=build_tool_spec_params_json_schema(t.spec),
94
+ ),
95
+ )
96
+
97
+
98
+ def build_mc_choices_response(cer_resp: pt.ChatCompletionResponse) -> ChatChoicesResponse:
99
+ def build_choice(cer_choice: pt.ChatCompletionResponse.Choice) -> AiChoice:
100
+ cer_msg = cer_choice.message
101
+
102
+ lst: list[AnyAiMessage] = []
103
+
104
+ if cer_msg.content is not None:
105
+ lst.append(AiMessage(
106
+ check.isinstance(cer_msg.content, str),
107
+ ))
108
+
109
+ for cer_tc in cer_msg.tool_calls or []:
110
+ lst.append(ToolUseMessage(ToolUse(
111
+ id=cer_tc.id,
112
+ name=cer_tc.function.name,
113
+ args=json.loads(cer_tc.function.arguments or '{}'),
114
+ raw_args=cer_tc.function.arguments,
115
+ )))
116
+
117
+ return AiChoice(lst)
118
+
119
+ return ChatChoicesResponse(list(map(build_choice, cer_resp.choices)))
120
+
121
+
122
+ def build_mc_ai_choice_deltas(delta: pt.ChatCompletionChunk.Choice.Delta) -> AiChoiceDeltas:
123
+ if delta.role in (None, 'assistant'):
124
+ lst: list[AiDelta] = []
125
+
126
+ if delta.content is not None:
127
+ lst.append(ContentAiDelta(delta.content))
128
+
129
+ for tc in delta.tool_calls or []:
130
+ tc_fn = check.not_none(tc.function)
131
+ lst.append(ToolUseAiDelta(
132
+ id=tc.id,
133
+ name=check.not_none(tc_fn.name),
134
+ args=json.loads(tc_fn.arguments or '{}'),
135
+ ))
136
+
137
+ return AiChoiceDeltas(lst)
138
+
139
+ elif delta.channel in ('analysis', 'commentary'):
140
+ return AiChoiceDeltas([])
141
+
142
+ else:
143
+ raise ValueError(delta)
@@ -0,0 +1,125 @@
1
+ import typing as ta
2
+
3
+ from omlish import check
4
+ from omlish import marshal as msh
5
+ from omlish import typedvalues as tv
6
+ from omlish.formats import json
7
+ from omlish.http import all as http
8
+ from omlish.http import sse
9
+ from omlish.io.buffers import DelimitingBuffer
10
+
11
+ from .....backends.cerebras import protocol as pt
12
+ from ....chat.choices.services import ChatChoicesOutputs
13
+ from ....chat.choices.stream.services import ChatChoicesStreamRequest
14
+ from ....chat.choices.stream.services import ChatChoicesStreamResponse
15
+ from ....chat.choices.stream.services import static_check_is_chat_choices_stream_service
16
+ from ....chat.choices.stream.types import AiChoicesDeltas
17
+ from ....chat.tools.types import Tool
18
+ from ....configs import Config
19
+ from ....resources import UseResources
20
+ from ....standard import ApiKey
21
+ from ....stream.services import StreamResponseSink
22
+ from ....stream.services import new_stream_response
23
+ from .chat import CerebrasChatChoicesService
24
+ from .names import MODEL_NAMES
25
+ from .protocol import build_cer_request_messages
26
+ from .protocol import build_cer_request_tool
27
+ from .protocol import build_mc_ai_choice_deltas
28
+
29
+
30
+ ##
31
+
32
+
33
+ # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
34
+ # name='cerebras',
35
+ # type='ChatChoicesStreamService',
36
+ # )
37
+ @static_check_is_chat_choices_stream_service
38
+ class CerebrasChatChoicesStreamService:
39
+ def __init__(
40
+ self,
41
+ *configs: Config,
42
+ http_client: http.AsyncHttpClient | None = None,
43
+ ) -> None:
44
+ super().__init__()
45
+
46
+ self._http_client = http_client
47
+
48
+ with tv.consume(*configs) as cc:
49
+ self._model_name = cc.pop(CerebrasChatChoicesService.DEFAULT_MODEL_NAME)
50
+ self._api_key = ApiKey.pop_secret(cc, env='CEREBRAS_API_KEY')
51
+
52
+ READ_CHUNK_SIZE: ta.ClassVar[int] = -1
53
+
54
+ async def invoke(self, request: ChatChoicesStreamRequest) -> ChatChoicesStreamResponse:
55
+ tools: list[pt.ChatCompletionRequest.Tool] = []
56
+ with tv.TypedValues(*request.options).consume() as oc:
57
+ t: Tool
58
+ for t in oc.pop(Tool, []):
59
+ tools.append(build_cer_request_tool(t))
60
+
61
+ cer_request = pt.ChatCompletionRequest(
62
+ messages=build_cer_request_messages(request.v),
63
+ model=MODEL_NAMES.resolve(self._model_name.v),
64
+ tools=tools or None,
65
+ stream=True,
66
+ )
67
+
68
+ raw_request = msh.marshal(cer_request)
69
+
70
+ http_request = http.HttpRequest(
71
+ 'https://api.cerebras.ai/v1/chat/completions',
72
+ headers={
73
+ http.consts.HEADER_CONTENT_TYPE: http.consts.CONTENT_TYPE_JSON,
74
+ http.consts.HEADER_AUTH: http.consts.format_bearer_auth_header(check.not_none(self._api_key).reveal()),
75
+ },
76
+ data=json.dumps(raw_request).encode('utf-8'),
77
+ )
78
+
79
+ async with UseResources.or_new(request.options) as rs:
80
+ http_client = await rs.enter_async_context(http.manage_async_client(self._http_client))
81
+ http_response = await rs.enter_async_context(await http_client.stream_request(http_request))
82
+
83
+ async def inner(sink: StreamResponseSink[AiChoicesDeltas]) -> ta.Sequence[ChatChoicesOutputs]:
84
+ db = DelimitingBuffer([b'\r', b'\n', b'\r\n'])
85
+ sd = sse.SseDecoder()
86
+ while True:
87
+ b = await http_response.stream.read1(self.READ_CHUNK_SIZE)
88
+ for l in db.feed(b):
89
+ if isinstance(l, DelimitingBuffer.Incomplete):
90
+ # FIXME: handle
91
+ return []
92
+
93
+ # FIXME: https://platform.openai.com/docs/guides/function-calling?api-mode=responses#streaming
94
+ for so in sd.process_line(l):
95
+ if isinstance(so, sse.SseEvent) and so.type == b'message':
96
+ ss = so.data.decode('utf-8')
97
+ if ss == '[DONE]':
98
+ return []
99
+
100
+ sj = json.loads(ss) # ChatCompletionChunk
101
+
102
+ check.state(sj['object'] == 'chat.completion.chunk')
103
+
104
+ ccc = msh.unmarshal(sj, pt.ChatCompletionChunk)
105
+
106
+ # FIXME: stop reason
107
+ if not ccc.choices:
108
+ continue
109
+
110
+ if any(choice.finish_reason for choice in ccc.choices):
111
+ check.state(all(choice.finish_reason for choice in ccc.choices))
112
+ break
113
+
114
+ await sink.emit(AiChoicesDeltas([
115
+ build_mc_ai_choice_deltas(choice.delta)
116
+ for choice in ccc.choices
117
+ ]))
118
+
119
+ if not b:
120
+ return []
121
+
122
+ # raw_response = json.loads(check.not_none(http_response.data).decode('utf-8'))
123
+ # return rh.build_response(raw_response)
124
+
125
+ return await new_stream_response(rs, inner)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ommlds
3
- Version: 0.0.0.dev487
3
+ Version: 0.0.0.dev489
4
4
  Summary: ommlds
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,9 +14,9 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev487
17
+ Requires-Dist: omlish==0.0.0.dev489
18
18
  Provides-Extra: all
19
- Requires-Dist: omdev==0.0.0.dev487; extra == "all"
19
+ Requires-Dist: omdev==0.0.0.dev489; extra == "all"
20
20
  Requires-Dist: llama-cpp-python~=0.3; extra == "all"
21
21
  Requires-Dist: mlx~=0.30; sys_platform == "darwin" and extra == "all"
22
22
  Requires-Dist: mlx-lm~=0.28; sys_platform == "darwin" and extra == "all"
@@ -25,7 +25,7 @@ Requires-Dist: tinygrad~=0.11; extra == "all"
25
25
  Requires-Dist: tokenizers~=0.22; extra == "all"
26
26
  Requires-Dist: torch~=2.9; extra == "all"
27
27
  Requires-Dist: transformers~=4.57; extra == "all"
28
- Requires-Dist: sentence-transformers~=5.1; extra == "all"
28
+ Requires-Dist: sentence-transformers~=5.2; extra == "all"
29
29
  Requires-Dist: huggingface-hub~=0.36; extra == "all"
30
30
  Requires-Dist: datasets~=4.4; extra == "all"
31
31
  Requires-Dist: regex>=2025.0; extra == "all"
@@ -38,7 +38,7 @@ Requires-Dist: mwparserfromhell~=0.7; extra == "all"
38
38
  Requires-Dist: wikitextparser~=0.56; extra == "all"
39
39
  Requires-Dist: lxml>=5.3; python_version < "3.13" and extra == "all"
40
40
  Provides-Extra: omdev
41
- Requires-Dist: omdev==0.0.0.dev487; extra == "omdev"
41
+ Requires-Dist: omdev==0.0.0.dev489; extra == "omdev"
42
42
  Provides-Extra: backends
43
43
  Requires-Dist: llama-cpp-python~=0.3; extra == "backends"
44
44
  Requires-Dist: mlx~=0.30; sys_platform == "darwin" and extra == "backends"
@@ -48,7 +48,7 @@ Requires-Dist: tinygrad~=0.11; extra == "backends"
48
48
  Requires-Dist: tokenizers~=0.22; extra == "backends"
49
49
  Requires-Dist: torch~=2.9; extra == "backends"
50
50
  Requires-Dist: transformers~=4.57; extra == "backends"
51
- Requires-Dist: sentence-transformers~=5.1; extra == "backends"
51
+ Requires-Dist: sentence-transformers~=5.2; extra == "backends"
52
52
  Provides-Extra: huggingface
53
53
  Requires-Dist: huggingface-hub~=0.36; extra == "huggingface"
54
54
  Requires-Dist: datasets~=4.4; extra == "huggingface"
@@ -1,5 +1,5 @@
1
- ommlds/.omlish-manifests.json,sha256=yK0cA7mLFsZKuzVooF6fF6BhCRjbZ73d8pblEkLUsc8,26200
2
- ommlds/__about__.py,sha256=qfeQ6miEt4bO6LdLNb7kNqab6GA_7Oi9kPGR4wHcoOM,1900
1
+ ommlds/.omlish-manifests.json,sha256=GK2z4amhnfODpo7Y5eiHis85o0RtuNz2pLF359R73-E,27810
2
+ ommlds/__about__.py,sha256=gnCMdmCDHlxqHPcTXICOiu9Z9QQUAOUMmRttpexOzA0,1900
3
3
  ommlds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  ommlds/_hacks/__init__.py,sha256=ajfw7dMKH8UuloeQ5MSxWwgAmdWf2v8gm-K3uLP9wtY,196
5
5
  ommlds/_hacks/funcs.py,sha256=8XseIblP7yolDUD7WQSGn1LP90IQzByVejSzphAPDyM,2861
@@ -17,6 +17,10 @@ ommlds/backends/anthropic/protocol/sse/__init__.py,sha256=LpijqXk0ceMDcgwOvZ8iLo
17
17
  ommlds/backends/anthropic/protocol/sse/_marshal.py,sha256=2No-qWRKV9ilOhC5NqHAA92DJF0fAcr4-OPvEP0KOjQ,627
18
18
  ommlds/backends/anthropic/protocol/sse/assemble.py,sha256=MVpA0iSU2LNMXy4VpIVV8Oe7nj3dgmXpfLe-7nnA5QE,6552
19
19
  ommlds/backends/anthropic/protocol/sse/events.py,sha256=pLscyLFpxcrtOijNPRgivrxYBFpE270oDW1dECjGtFg,2507
20
+ ommlds/backends/cerebras/__init__.py,sha256=-RtLrdEGN2da1KCf7YNs32jN-kJhT_kNVrcOv4x_J-w,101
21
+ ommlds/backends/cerebras/_dataclasses.py,sha256=Z4NZSwc1mFZqScqRWvv-LK69bsX2XFYkzw9oqk6nKgM,215150
22
+ ommlds/backends/cerebras/_marshal.py,sha256=KqhIymYaVUJ5-XubSHLDiEagK_jmp-738mbduazlEE8,658
23
+ ommlds/backends/cerebras/protocol.py,sha256=gfOdPgJRg0XsZIMgrZh8yppAB7iuzgSVM8qFv2Spq_I,8848
20
24
  ommlds/backends/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
25
  ommlds/backends/google/protocol/__init__.py,sha256=5fguMBg9qGfTEvEBCgjFbDBfRzaiRdil6d1DakJGvPY,214
22
26
  ommlds/backends/google/protocol/_dataclasses.py,sha256=tySVfhYQuufyrsB2-kPBPVFqtu86IjhiED_O3HHcH3o,305060
@@ -96,11 +100,11 @@ ommlds/backends/transformers/filecache.py,sha256=ycfswt7f4qRrPSTFRhofXZaDBuDPpyp
96
100
  ommlds/backends/transformers/streamers.py,sha256=Hu_9lp_kUilKjOfs7Ixqr2NoA5FuRn2eRh8JdvaBDYc,1688
97
101
  ommlds/cli/__init__.py,sha256=-RtLrdEGN2da1KCf7YNs32jN-kJhT_kNVrcOv4x_J-w,101
98
102
  ommlds/cli/__main__.py,sha256=1ffCb0fcUOJMzxROJmJRXQ8PSOVYv7KrcuBtT95cf0c,140
99
- ommlds/cli/_dataclasses.py,sha256=yXvetsypIhkqXpUIA4AZCUoXkzv_3hBSj2nG_YxE8F4,121231
103
+ ommlds/cli/_dataclasses.py,sha256=eD6xmF2ZZkiOfNjdpXP8no6nz4XGjl_3Y4JiJdN44Kc,130497
100
104
  ommlds/cli/asyncs.py,sha256=NAMzzaZq7ORjlbbBB_Y9vcM9qoBpGf4VJNtl_3p_8G4,629
101
105
  ommlds/cli/inject.py,sha256=CdG-Zgq3T0pDWLhHRZSqlkR4W2mS7LlCOHD2uP1llf0,610
102
- ommlds/cli/main.py,sha256=IhiHpFpUMCYuoQZakRrRXif6mmFwmSjvL5-zyPAmuD4,9067
103
- ommlds/cli/secrets.py,sha256=LAlpESndxbEJLF2ohJQQJUEODsY5Vqv3wH8_TDRExHw,441
106
+ ommlds/cli/main.py,sha256=D8TKCHJEJ5nLVAmTMVOdaUDrHYQJbFAlO0u7fR_APJ0,9633
107
+ ommlds/cli/secrets.py,sha256=8GHlewS3yeFDfFNekaYwRm4nG9l3nd-Mc8tKl9Ma_Uo,469
104
108
  ommlds/cli/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
109
  ommlds/cli/backends/catalog.py,sha256=hLcBXBCiB7eKT_2yv8kyLD5f94LV7vCcOe144URuJxs,3225
106
110
  ommlds/cli/backends/configs.py,sha256=RvNWxsJDSsHc0eWA6hI1_3n__HU7rXAUmzS06ykMPh0,137
@@ -123,10 +127,10 @@ ommlds/cli/sessions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
123
127
  ommlds/cli/sessions/base.py,sha256=diwERBpapd73Cn2T2_ctEIfhzjzJ1DTzjcExxwxccqw,464
124
128
  ommlds/cli/sessions/inject.py,sha256=9SrtsozIhqok3jZtepKTJwpOxHkU7FrqKw6pc78mEO4,926
125
129
  ommlds/cli/sessions/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
- ommlds/cli/sessions/chat/configs.py,sha256=IN2JMJv_Vat8K8-1GUgfOjQG_jzeJ4aKpGoztX498iE,636
130
+ ommlds/cli/sessions/chat/configs.py,sha256=cboswtxSsL9ueZ_ualVy2avU4I3DRWuVM34S5ACImTg,734
127
131
  ommlds/cli/sessions/chat/driver.py,sha256=ddnCYTKqWiPxV8U4UbFwb7E3yi81ItjZ9j3AJd3a3Mk,1395
128
- ommlds/cli/sessions/chat/inject.py,sha256=uLOSGyVI6UsZxeYw62w4Sl1GmuxGpcRnJRXCmzj4xBA,1463
129
- ommlds/cli/sessions/chat/session.py,sha256=DOkCg_PLdleyYFQa2WLAOBWwgQeuVITJ6rY_sqk3sCc,533
132
+ ommlds/cli/sessions/chat/inject.py,sha256=paMPTWRQpHTiRfTgv9ZrCQOo_QRGsfJ2ca6EPHjhZYg,1562
133
+ ommlds/cli/sessions/chat/session.py,sha256=O5hju0S78zo0K3bCwCg1GIdhZkUYt2H2gpl-efJnUMY,800
130
134
  ommlds/cli/sessions/chat/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
135
  ommlds/cli/sessions/chat/chat/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
136
  ommlds/cli/sessions/chat/chat/ai/configs.py,sha256=zIth9PKJ9u68Mblctraj2HQcEuiztKGF5sPeJZ-OABw,182
@@ -143,11 +147,23 @@ ommlds/cli/sessions/chat/chat/state/inmemory.py,sha256=4wX-8NA8SUTytXeUaTMaI64KB
143
147
  ommlds/cli/sessions/chat/chat/state/storage.py,sha256=gKUNsNj3TtH67-FOuHXrQlDsESeIYDUHPhn7unTQCx8,1447
144
148
  ommlds/cli/sessions/chat/chat/state/types.py,sha256=NsHCZNeBfLW1BMVB2rn-DUqA9C5w2vp-_3UjjKl4QRo,806
145
149
  ommlds/cli/sessions/chat/chat/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
- ommlds/cli/sessions/chat/chat/user/configs.py,sha256=QdsHopwQnShreEgLMlFEdLo1c4ursmL09woXiwJLv1o,364
147
- ommlds/cli/sessions/chat/chat/user/inject.py,sha256=9HGjOxgfuLRAKDDozO0UhH2mnVrE2fQqUmkji20BZS8,2444
148
- ommlds/cli/sessions/chat/chat/user/interactive.py,sha256=SHeiuhkCkM0SM0dTph-W-qk9VLBMuwL1nTE-Moex2qA,862
150
+ ommlds/cli/sessions/chat/chat/user/configs.py,sha256=qsiua5CkTRPhO4prORK-GXauUhWRZ3psfpoHvuj8EyA,311
151
+ ommlds/cli/sessions/chat/chat/user/inject.py,sha256=guy8eQLXlUtXKG9jNnJSCwwT6_jPJ0oxPIGNI2KaT6A,1895
149
152
  ommlds/cli/sessions/chat/chat/user/oneshot.py,sha256=jPrZBBuf-olBfPF7CPTYK7-Dr7EvSriU7L0nORHfbv4,588
150
153
  ommlds/cli/sessions/chat/chat/user/types.py,sha256=MNlhMxlLtxVod9rUZlSPvRaippPAXEdX_GHh73QLeSg,262
154
+ ommlds/cli/sessions/chat/interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
+ ommlds/cli/sessions/chat/interface/base.py,sha256=3z7yI-ow7037_n6VanQYZjOgKL_iRZ8FB6JP553SY7M,198
156
+ ommlds/cli/sessions/chat/interface/configs.py,sha256=xu9nUAI9opNR7X4m92JKr5HhXPNNflHUHQ4UbOPmVMg,244
157
+ ommlds/cli/sessions/chat/interface/inject.py,sha256=Ip-srA7ONGF-YgbLikwfTd3O1UoxeDTMI6CnPpc6A80,493
158
+ ommlds/cli/sessions/chat/interface/bare/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
+ ommlds/cli/sessions/chat/interface/bare/inject.py,sha256=rJPZnntuELdjxovU2yDo_RZl5qBhUfadMb2Dg1e50Pw,1048
160
+ ommlds/cli/sessions/chat/interface/bare/interface.py,sha256=X-M0fyyY6FlJbY_ToJOMGJrPwbx68Hi1y9GfkhdPLKA,336
161
+ ommlds/cli/sessions/chat/interface/bare/user.py,sha256=DIRX8-yWl0U9AD1qr5og0XbFhSZxpCUgnwOxIJloK1Y,874
162
+ ommlds/cli/sessions/chat/interface/textual/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
+ ommlds/cli/sessions/chat/interface/textual/app.py,sha256=r25t-0Gvh5O_oS-mKKR5xHSI6d-ibHkpH6ZYKxAFDIk,4303
164
+ ommlds/cli/sessions/chat/interface/textual/inject.py,sha256=MwtFeF3SXfidsxCihcgk3Bp888Ba5CwEj2ZYugkJRtM,620
165
+ ommlds/cli/sessions/chat/interface/textual/interface.py,sha256=SISY0RardWhYdXfpVMTTjNlaeUIu9lgFIxKkDn0_SwA,417
166
+ ommlds/cli/sessions/chat/interface/textual/user.py,sha256=ywXycpaHX7beD1EAv6PtCYNC5vQL6CLIfWM9iYzH3ts,482
151
167
  ommlds/cli/sessions/chat/phases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
168
  ommlds/cli/sessions/chat/phases/inject.py,sha256=m9GcCVcp1GnNKN1qwDSgTkfp3e107wXgPeEHDLbfG8s,448
153
169
  ommlds/cli/sessions/chat/phases/injection.py,sha256=ZUFRRLp3HNhKaPBW6aiw5XFEGNkqTj8WVSlXM0kg0y0,326
@@ -212,6 +228,11 @@ ommlds/minichain/backends/impls/anthropic/chat.py,sha256=e4Kcbjvca_yaZsNB_-h335g
212
228
  ommlds/minichain/backends/impls/anthropic/names.py,sha256=GPPeYt0CcDcDCR8I6BMd7bMjC_Zk_bjnLLpF9ClwXcg,1099
213
229
  ommlds/minichain/backends/impls/anthropic/protocol.py,sha256=whPVYuKShKiMCzasHl77sCIiymhzXj8mFZXEyhZvld8,3292
214
230
  ommlds/minichain/backends/impls/anthropic/stream.py,sha256=jxKzytoYJLK9JftihGhWTcFIoXFgouQR7Yu5Q1j_ku8,8794
231
+ ommlds/minichain/backends/impls/cerebras/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
+ ommlds/minichain/backends/impls/cerebras/chat.py,sha256=FbwXrOMbHIIzO8gLZsyI3faYJYFYWPcxZTMxcpIaB4Y,2858
233
+ ommlds/minichain/backends/impls/cerebras/names.py,sha256=NcJF7Py3y8EiQUJ5gL3KV2l25rpsi4Hc3_bwHv7lncQ,574
234
+ ommlds/minichain/backends/impls/cerebras/protocol.py,sha256=DhDXzV6YCE0l8EwsObS9eYAd_9Zvt06ch5uuJHzcdAQ,5239
235
+ ommlds/minichain/backends/impls/cerebras/stream.py,sha256=gMGlP_QNQ9h8qGZSoFwEZ-mpND7_hx86y3smrsLrUX8,5150
215
236
  ommlds/minichain/backends/impls/duckduckgo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
216
237
  ommlds/minichain/backends/impls/duckduckgo/search.py,sha256=HA5UriBVvNw6-6vmeYJsm83LxsFsksLtzFxj-kdzoPE,1010
217
238
  ommlds/minichain/backends/impls/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -428,9 +449,9 @@ ommlds/wiki/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
428
449
  ommlds/wiki/utils/io.py,sha256=UKgDJGtmpnWvIqVd2mJc2QNPOqlToEY1GEveNp6_pMo,7088
429
450
  ommlds/wiki/utils/progress.py,sha256=EhvKcMFYtsarCQhIahlO6f0SboyAKP3UwUyrnVnP-Vk,3222
430
451
  ommlds/wiki/utils/xml.py,sha256=sNJNkZ9rT8B-kJMO6bRz8J1USy4fyPx0m2PwTX7vxYY,3846
431
- ommlds-0.0.0.dev487.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
432
- ommlds-0.0.0.dev487.dist-info/METADATA,sha256=zNidxj78G8t4sL-LE_MkkplkdwxnKQTYe6vSwQ4o9pw,3493
433
- ommlds-0.0.0.dev487.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
434
- ommlds-0.0.0.dev487.dist-info/entry_points.txt,sha256=Z5YWtX7ClfiCKdW-dd_CSVvM0h4yQpJPi-2G3q6gNFo,35
435
- ommlds-0.0.0.dev487.dist-info/top_level.txt,sha256=Rbnk5d5wi58vnAXx13WFZqdQ4VX8hBCS2hEL3WeXOhY,7
436
- ommlds-0.0.0.dev487.dist-info/RECORD,,
452
+ ommlds-0.0.0.dev489.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
453
+ ommlds-0.0.0.dev489.dist-info/METADATA,sha256=3ZTS2XgARBEwxODOmnG5PcDx16y_4TNAy5_ibrVeOO0,3493
454
+ ommlds-0.0.0.dev489.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
455
+ ommlds-0.0.0.dev489.dist-info/entry_points.txt,sha256=Z5YWtX7ClfiCKdW-dd_CSVvM0h4yQpJPi-2G3q6gNFo,35
456
+ ommlds-0.0.0.dev489.dist-info/top_level.txt,sha256=Rbnk5d5wi58vnAXx13WFZqdQ4VX8hBCS2hEL3WeXOhY,7
457
+ ommlds-0.0.0.dev489.dist-info/RECORD,,