ommlds 0.0.0.dev466__py3-none-any.whl → 0.0.0.dev512__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.
- ommlds/.omlish-manifests.json +404 -31
- ommlds/README.md +11 -0
- ommlds/__about__.py +21 -12
- ommlds/_hacks/__init__.py +4 -0
- ommlds/_hacks/funcs.py +110 -0
- ommlds/_hacks/names.py +158 -0
- ommlds/_hacks/params.py +73 -0
- ommlds/_hacks/patches.py +0 -3
- ommlds/backends/anthropic/protocol/__init__.py +13 -1
- ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
- ommlds/backends/anthropic/protocol/sse/events.py +2 -0
- ommlds/backends/anthropic/protocol/types.py +5 -7
- ommlds/backends/cerebras/__init__.py +7 -0
- ommlds/backends/cerebras/_dataclasses.py +4254 -0
- ommlds/backends/cerebras/_marshal.py +24 -0
- ommlds/backends/cerebras/clients.py +9 -0
- ommlds/backends/cerebras/protocol.py +310 -0
- ommlds/backends/google/protocol/__init__.py +13 -0
- ommlds/backends/google/protocol/_dataclasses.py +5997 -0
- ommlds/backends/google/protocol/types.py +6 -8
- ommlds/backends/groq/__init__.py +7 -0
- ommlds/backends/groq/_dataclasses.py +3901 -0
- ommlds/backends/groq/_marshal.py +23 -0
- ommlds/backends/groq/clients.py +9 -0
- ommlds/backends/groq/protocol.py +247 -0
- ommlds/{huggingface.py → backends/huggingface/cache.py} +1 -6
- ommlds/backends/huggingface/cli.py +208 -0
- ommlds/backends/llamacpp/logging.py +4 -1
- ommlds/backends/mlx/caching.py +7 -3
- ommlds/backends/mlx/cli.py +10 -7
- ommlds/backends/mlx/generation.py +18 -16
- ommlds/backends/mlx/limits.py +10 -6
- ommlds/backends/mlx/loading.py +7 -4
- ommlds/backends/ollama/__init__.py +7 -0
- ommlds/backends/ollama/_dataclasses.py +3940 -0
- ommlds/backends/ollama/cli.py +36 -0
- ommlds/backends/ollama/protocol.py +201 -0
- ommlds/backends/openai/protocol/__init__.py +15 -1
- ommlds/backends/openai/protocol/_common.py +3 -5
- ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
- ommlds/backends/tavily/__init__.py +7 -0
- ommlds/backends/tavily/_dataclasses.py +1734 -0
- ommlds/backends/tavily/protocol.py +299 -0
- ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
- ommlds/backends/torch/backends.py +1 -1
- ommlds/backends/transformers/__init__.py +14 -0
- ommlds/backends/transformers/filecache.py +109 -0
- ommlds/backends/transformers/streamers.py +73 -0
- ommlds/cli/__init__.py +7 -0
- ommlds/cli/_dataclasses.py +3835 -0
- ommlds/cli/asyncs.py +30 -0
- ommlds/cli/backends/catalog.py +88 -0
- ommlds/cli/backends/configs.py +9 -0
- ommlds/cli/backends/inject.py +100 -42
- ommlds/cli/{sessions/chat/backends → backends}/injection.py +1 -1
- ommlds/cli/backends/meta.py +82 -0
- ommlds/cli/{sessions/chat/backends → backends}/types.py +11 -1
- ommlds/cli/{sessions/chat/content → content}/messages.py +2 -2
- ommlds/cli/{sessions/chat/content → content}/strings.py +1 -1
- ommlds/cli/inject.py +17 -8
- ommlds/cli/inputs/asyncs.py +32 -0
- ommlds/cli/inputs/sync.py +75 -0
- ommlds/cli/main.py +346 -114
- ommlds/cli/rendering/configs.py +9 -0
- ommlds/cli/{sessions/chat/rendering → rendering}/inject.py +4 -5
- ommlds/cli/{sessions/chat/rendering → rendering}/markdown.py +1 -1
- ommlds/cli/{sessions/chat/rendering → rendering}/raw.py +1 -1
- ommlds/cli/{sessions/chat/rendering → rendering}/types.py +7 -1
- ommlds/cli/secrets.py +22 -0
- ommlds/cli/sessions/base.py +1 -10
- ommlds/cli/sessions/chat/configs.py +13 -30
- ommlds/cli/sessions/chat/drivers/ai/configs.py +13 -0
- ommlds/cli/sessions/chat/drivers/ai/events.py +57 -0
- ommlds/cli/sessions/chat/{chat → drivers}/ai/inject.py +15 -12
- ommlds/cli/sessions/chat/{chat → drivers}/ai/rendering.py +8 -8
- ommlds/cli/sessions/chat/{chat → drivers}/ai/services.py +5 -5
- ommlds/cli/sessions/chat/{chat → drivers}/ai/tools.py +4 -8
- ommlds/cli/sessions/chat/{chat → drivers}/ai/types.py +10 -1
- ommlds/cli/sessions/chat/drivers/configs.py +25 -0
- ommlds/cli/sessions/chat/drivers/events/inject.py +27 -0
- ommlds/cli/sessions/chat/drivers/events/injection.py +14 -0
- ommlds/cli/sessions/chat/drivers/events/manager.py +16 -0
- ommlds/cli/sessions/chat/drivers/events/types.py +44 -0
- ommlds/cli/sessions/chat/drivers/impl.py +50 -0
- ommlds/cli/sessions/chat/drivers/inject.py +70 -0
- ommlds/cli/sessions/chat/drivers/state/configs.py +13 -0
- ommlds/cli/sessions/chat/drivers/state/ids.py +25 -0
- ommlds/cli/sessions/chat/drivers/state/inject.py +83 -0
- ommlds/cli/sessions/chat/{chat → drivers}/state/inmemory.py +1 -6
- ommlds/cli/sessions/chat/{chat → drivers}/state/storage.py +18 -12
- ommlds/cli/sessions/chat/{chat → drivers}/state/types.py +11 -6
- ommlds/cli/sessions/chat/drivers/tools/configs.py +22 -0
- ommlds/cli/sessions/chat/drivers/tools/confirmation.py +44 -0
- ommlds/cli/sessions/chat/drivers/tools/errorhandling.py +39 -0
- ommlds/cli/sessions/chat/{tools → drivers/tools}/execution.py +3 -4
- ommlds/cli/sessions/chat/drivers/tools/fs/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/tools/fs/configs.py +12 -0
- ommlds/cli/sessions/chat/drivers/tools/fs/inject.py +35 -0
- ommlds/cli/sessions/chat/drivers/tools/inject.py +83 -0
- ommlds/cli/sessions/chat/{tools → drivers/tools}/injection.py +20 -5
- ommlds/cli/sessions/chat/{tools → drivers/tools}/rendering.py +3 -3
- ommlds/cli/sessions/chat/drivers/tools/todo/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/tools/todo/configs.py +12 -0
- ommlds/cli/sessions/chat/drivers/tools/todo/inject.py +31 -0
- ommlds/cli/sessions/chat/drivers/tools/weather/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/tools/weather/configs.py +12 -0
- ommlds/cli/sessions/chat/drivers/tools/weather/inject.py +22 -0
- ommlds/cli/sessions/chat/{tools/weather.py → drivers/tools/weather/tools.py} +1 -1
- ommlds/cli/sessions/chat/drivers/types.py +31 -0
- ommlds/cli/sessions/chat/drivers/user/__init__.py +0 -0
- ommlds/cli/sessions/chat/drivers/user/configs.py +14 -0
- ommlds/cli/sessions/chat/drivers/user/inject.py +41 -0
- ommlds/cli/sessions/chat/facades/__init__.py +0 -0
- ommlds/cli/sessions/chat/facades/commands/__init__.py +0 -0
- ommlds/cli/sessions/chat/facades/commands/base.py +83 -0
- ommlds/cli/sessions/chat/facades/commands/configs.py +9 -0
- ommlds/cli/sessions/chat/facades/commands/inject.py +41 -0
- ommlds/cli/sessions/chat/facades/commands/injection.py +15 -0
- ommlds/cli/sessions/chat/facades/commands/manager.py +59 -0
- ommlds/cli/sessions/chat/facades/commands/simple.py +34 -0
- ommlds/cli/sessions/chat/facades/commands/types.py +13 -0
- ommlds/cli/sessions/chat/facades/configs.py +11 -0
- ommlds/cli/sessions/chat/facades/facade.py +26 -0
- ommlds/cli/sessions/chat/facades/inject.py +35 -0
- ommlds/cli/sessions/chat/facades/ui.py +34 -0
- ommlds/cli/sessions/chat/inject.py +10 -49
- ommlds/cli/sessions/chat/interfaces/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/bare/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/bare/configs.py +15 -0
- ommlds/cli/sessions/chat/interfaces/bare/inject.py +69 -0
- ommlds/cli/sessions/chat/interfaces/bare/interactive.py +49 -0
- ommlds/cli/sessions/chat/interfaces/bare/oneshot.py +21 -0
- ommlds/cli/sessions/chat/{tools/confirmation.py → interfaces/bare/tools.py} +3 -22
- ommlds/cli/sessions/chat/interfaces/base.py +13 -0
- ommlds/cli/sessions/chat/interfaces/configs.py +11 -0
- ommlds/cli/sessions/chat/interfaces/inject.py +29 -0
- ommlds/cli/sessions/chat/interfaces/textual/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/textual/app.py +429 -0
- ommlds/cli/sessions/chat/interfaces/textual/configs.py +11 -0
- ommlds/cli/sessions/chat/interfaces/textual/facades.py +19 -0
- ommlds/cli/sessions/chat/interfaces/textual/inject.py +111 -0
- ommlds/cli/sessions/chat/interfaces/textual/inputhistory.py +174 -0
- ommlds/cli/sessions/chat/interfaces/textual/interface.py +24 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/__init__.py +29 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/input.tcss +53 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/markdown.tcss +7 -0
- ommlds/cli/sessions/chat/interfaces/textual/styles/messages.tcss +167 -0
- ommlds/cli/sessions/chat/interfaces/textual/tools.py +38 -0
- ommlds/cli/sessions/chat/interfaces/textual/widgets/__init__.py +0 -0
- ommlds/cli/sessions/chat/interfaces/textual/widgets/input.py +70 -0
- ommlds/cli/sessions/chat/interfaces/textual/widgets/messages.py +207 -0
- ommlds/cli/sessions/chat/session.py +8 -13
- ommlds/cli/sessions/completion/configs.py +5 -6
- ommlds/cli/sessions/completion/inject.py +15 -2
- ommlds/cli/sessions/completion/session.py +10 -18
- ommlds/cli/sessions/configs.py +10 -0
- ommlds/cli/sessions/embedding/configs.py +5 -6
- ommlds/cli/sessions/embedding/inject.py +15 -2
- ommlds/cli/sessions/embedding/session.py +10 -18
- ommlds/cli/sessions/inject.py +15 -15
- ommlds/cli/state/storage.py +8 -2
- ommlds/minichain/__init__.py +217 -60
- ommlds/minichain/_dataclasses.py +20640 -0
- ommlds/minichain/_typedvalues.py +15 -8
- ommlds/minichain/backends/catalogs/base.py +20 -1
- ommlds/minichain/backends/catalogs/simple.py +2 -2
- ommlds/minichain/backends/catalogs/strings.py +13 -10
- ommlds/minichain/backends/impls/anthropic/chat.py +28 -5
- ommlds/minichain/backends/impls/anthropic/names.py +3 -3
- ommlds/minichain/backends/impls/anthropic/protocol.py +2 -2
- ommlds/minichain/backends/impls/anthropic/stream.py +23 -18
- ommlds/minichain/backends/impls/cerebras/__init__.py +0 -0
- ommlds/minichain/backends/impls/cerebras/chat.py +82 -0
- ommlds/minichain/backends/impls/cerebras/names.py +45 -0
- ommlds/minichain/backends/impls/cerebras/protocol.py +143 -0
- ommlds/minichain/backends/impls/cerebras/stream.py +114 -0
- ommlds/minichain/backends/impls/duckduckgo/search.py +5 -1
- ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
- ommlds/minichain/backends/impls/dummy/chat.py +69 -0
- ommlds/minichain/backends/impls/google/chat.py +20 -84
- ommlds/minichain/backends/impls/google/names.py +6 -0
- ommlds/minichain/backends/impls/google/protocol.py +105 -0
- ommlds/minichain/backends/impls/google/search.py +10 -5
- ommlds/minichain/backends/impls/google/stream.py +64 -142
- ommlds/minichain/backends/impls/google/tools.py +2 -2
- ommlds/minichain/backends/impls/groq/__init__.py +0 -0
- ommlds/minichain/backends/impls/groq/chat.py +77 -0
- ommlds/minichain/backends/impls/groq/names.py +48 -0
- ommlds/minichain/backends/impls/groq/protocol.py +143 -0
- ommlds/minichain/backends/impls/groq/stream.py +114 -0
- ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
- ommlds/minichain/backends/impls/llamacpp/chat.py +15 -3
- ommlds/minichain/backends/impls/llamacpp/completion.py +7 -3
- ommlds/minichain/backends/impls/llamacpp/stream.py +38 -19
- ommlds/minichain/backends/impls/mistral.py +9 -2
- ommlds/minichain/backends/impls/mlx/chat.py +100 -23
- ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
- ommlds/minichain/backends/impls/ollama/chat.py +193 -0
- ommlds/minichain/backends/impls/ollama/protocol.py +144 -0
- ommlds/minichain/backends/impls/openai/chat.py +14 -7
- ommlds/minichain/backends/impls/openai/completion.py +9 -2
- ommlds/minichain/backends/impls/openai/embedding.py +9 -2
- ommlds/minichain/backends/impls/openai/format.py +117 -115
- ommlds/minichain/backends/impls/openai/names.py +33 -5
- ommlds/minichain/backends/impls/openai/stream.py +61 -70
- ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
- ommlds/minichain/backends/impls/tavily.py +66 -0
- ommlds/minichain/backends/impls/tinygrad/chat.py +17 -14
- ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
- ommlds/minichain/backends/impls/transformers/sentence.py +5 -2
- ommlds/minichain/backends/impls/transformers/tokens.py +9 -6
- ommlds/minichain/backends/impls/transformers/transformers.py +139 -20
- ommlds/minichain/backends/strings/parsing.py +2 -2
- ommlds/minichain/backends/strings/resolving.py +7 -2
- ommlds/minichain/chat/choices/stream/__init__.py +0 -0
- ommlds/minichain/chat/{stream → choices/stream}/adapters.py +7 -7
- ommlds/minichain/chat/choices/stream/joining.py +31 -0
- ommlds/minichain/chat/choices/stream/services.py +45 -0
- ommlds/minichain/chat/choices/stream/types.py +43 -0
- ommlds/minichain/chat/content.py +42 -0
- ommlds/minichain/chat/messages.py +46 -42
- ommlds/minichain/chat/stream/_marshal.py +4 -4
- ommlds/minichain/chat/stream/joining.py +56 -43
- ommlds/minichain/chat/stream/services.py +15 -15
- ommlds/minichain/chat/stream/types.py +17 -24
- ommlds/minichain/chat/templating.py +3 -3
- ommlds/minichain/content/__init__.py +20 -3
- ommlds/minichain/content/_marshal.py +181 -55
- ommlds/minichain/content/code.py +26 -0
- ommlds/minichain/content/composite.py +28 -0
- ommlds/minichain/content/content.py +27 -0
- ommlds/minichain/content/dynamic.py +12 -0
- ommlds/minichain/content/emphasis.py +27 -0
- ommlds/minichain/content/images.py +2 -2
- ommlds/minichain/content/json.py +2 -2
- ommlds/minichain/content/link.py +13 -0
- ommlds/minichain/content/markdown.py +12 -0
- ommlds/minichain/content/metadata.py +10 -0
- ommlds/minichain/content/namespaces.py +8 -0
- ommlds/minichain/content/placeholders.py +10 -9
- ommlds/minichain/content/quote.py +26 -0
- ommlds/minichain/content/raw.py +49 -0
- ommlds/minichain/content/recursive.py +12 -0
- ommlds/minichain/content/resources.py +22 -0
- ommlds/minichain/content/section.py +26 -0
- ommlds/minichain/content/sequence.py +17 -3
- ommlds/minichain/content/standard.py +32 -0
- ommlds/minichain/content/tag.py +28 -0
- ommlds/minichain/content/templates.py +13 -0
- ommlds/minichain/content/text.py +2 -2
- ommlds/minichain/content/transform/__init__.py +0 -0
- ommlds/minichain/content/transform/json.py +55 -0
- ommlds/minichain/content/transform/markdown.py +8 -0
- ommlds/minichain/content/transform/materialize.py +59 -0
- ommlds/minichain/content/transform/metadata.py +16 -0
- ommlds/minichain/content/transform/namespaces.py +20 -0
- ommlds/minichain/content/transform/placeholders.py +60 -0
- ommlds/minichain/content/{prepare.py → transform/prepare.py} +10 -15
- ommlds/minichain/content/transform/recursive.py +54 -0
- ommlds/minichain/content/transform/resources.py +58 -0
- ommlds/minichain/content/transform/standard.py +43 -0
- ommlds/minichain/content/{transforms → transform}/stringify.py +1 -7
- ommlds/minichain/content/transform/strings.py +33 -0
- ommlds/minichain/content/transform/templates.py +25 -0
- ommlds/minichain/content/transform/types.py +18 -0
- ommlds/minichain/content/transform/visitors.py +38 -0
- ommlds/minichain/content/visitors.py +218 -0
- ommlds/minichain/http/__init__.py +0 -0
- ommlds/minichain/http/stream.py +195 -0
- ommlds/minichain/lib/fs/tools/read.py +1 -1
- ommlds/minichain/lib/fs/tools/recursivels/rendering.py +1 -1
- ommlds/minichain/lib/fs/tools/recursivels/running.py +1 -1
- ommlds/minichain/lib/todo/tools/write.py +2 -1
- ommlds/minichain/lib/todo/types.py +1 -1
- ommlds/minichain/llms/types.py +4 -0
- ommlds/minichain/metadata.py +56 -2
- ommlds/minichain/models/configs.py +2 -2
- ommlds/minichain/models/names.py +2 -0
- ommlds/minichain/registries/globals.py +18 -4
- ommlds/minichain/resources.py +49 -3
- ommlds/minichain/search.py +1 -1
- ommlds/minichain/services/README.md +154 -0
- ommlds/minichain/services/__init__.py +6 -2
- ommlds/minichain/services/_marshal.py +46 -10
- ommlds/minichain/services/_origclasses.py +11 -0
- ommlds/minichain/services/_typedvalues.py +8 -3
- ommlds/minichain/services/requests.py +73 -3
- ommlds/minichain/services/responses.py +73 -3
- ommlds/minichain/services/services.py +9 -0
- ommlds/minichain/standard.py +8 -0
- ommlds/minichain/stream/services.py +43 -17
- ommlds/minichain/text/applypatch.py +2 -1
- ommlds/minichain/text/toolparsing/llamacpp/types.py +1 -1
- ommlds/minichain/tokens/specials.py +1 -1
- ommlds/minichain/tools/execution/catalog.py +2 -2
- ommlds/minichain/tools/execution/errorhandling.py +36 -0
- ommlds/minichain/tools/execution/errors.py +2 -2
- ommlds/minichain/tools/execution/executors.py +1 -1
- ommlds/minichain/tools/fns.py +1 -1
- ommlds/minichain/tools/jsonschema.py +2 -2
- ommlds/minichain/tools/reflect.py +11 -7
- ommlds/minichain/tools/types.py +16 -19
- ommlds/minichain/vectors/_marshal.py +1 -1
- ommlds/minichain/vectors/embeddings.py +1 -1
- ommlds/minichain/wrappers/__init__.py +7 -0
- ommlds/minichain/wrappers/firstinwins.py +144 -0
- ommlds/minichain/wrappers/instrument.py +146 -0
- ommlds/minichain/wrappers/retry.py +168 -0
- ommlds/minichain/wrappers/services.py +98 -0
- ommlds/minichain/wrappers/stream.py +57 -0
- ommlds/nanochat/LICENSE +21 -0
- ommlds/nanochat/__init__.py +0 -0
- ommlds/nanochat/rustbpe/LICENSE +21 -0
- ommlds/nanochat/rustbpe/README.md +10 -0
- ommlds/nanochat/tokenizers.py +440 -0
- ommlds/specs/__init__.py +0 -0
- ommlds/specs/mcp/__init__.py +0 -0
- ommlds/specs/mcp/_marshal.py +23 -0
- ommlds/specs/mcp/clients.py +146 -0
- ommlds/specs/mcp/protocol.py +369 -0
- ommlds/tools/git.py +84 -64
- ommlds/tools/ocr.py +1 -1
- ommlds/wiki/analyze.py +2 -2
- ommlds/wiki/models.py +4 -4
- ommlds/wiki/text/mfh.py +9 -9
- ommlds/wiki/utils/xml.py +5 -5
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/METADATA +28 -21
- ommlds-0.0.0.dev512.dist-info/RECORD +534 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/WHEEL +1 -1
- ommlds/cli/backends/standard.py +0 -20
- ommlds/cli/sessions/chat/backends/catalog.py +0 -56
- ommlds/cli/sessions/chat/backends/inject.py +0 -37
- ommlds/cli/sessions/chat/chat/state/inject.py +0 -40
- ommlds/cli/sessions/chat/chat/user/inject.py +0 -61
- ommlds/cli/sessions/chat/chat/user/interactive.py +0 -29
- ommlds/cli/sessions/chat/chat/user/oneshot.py +0 -25
- ommlds/cli/sessions/chat/chat/user/types.py +0 -15
- ommlds/cli/sessions/chat/driver.py +0 -43
- ommlds/cli/sessions/chat/tools/inject.py +0 -145
- ommlds/minichain/backends/impls/openai/format2.py +0 -210
- ommlds/minichain/content/materialize.py +0 -196
- ommlds/minichain/content/simple.py +0 -47
- ommlds/minichain/content/transforms/base.py +0 -46
- ommlds/minichain/content/transforms/interleave.py +0 -70
- ommlds/minichain/content/transforms/squeeze.py +0 -72
- ommlds/minichain/content/transforms/strings.py +0 -24
- ommlds/minichain/content/types.py +0 -43
- ommlds/minichain/stream/wrap.py +0 -62
- ommlds-0.0.0.dev466.dist-info/RECORD +0 -376
- /ommlds/{cli/sessions/chat/backends → backends/huggingface}/__init__.py +0 -0
- /ommlds/cli/{sessions/chat/chat → content}/__init__.py +0 -0
- /ommlds/cli/{sessions/chat/chat/ai → inputs}/__init__.py +0 -0
- /ommlds/cli/{sessions/chat/chat/state → rendering}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{chat/user → drivers}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{content → drivers/ai}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{chat → drivers}/ai/injection.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/events}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{rendering → drivers/phases}/__init__.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/inject.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/injection.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/manager.py +0 -0
- /ommlds/cli/sessions/chat/{phases → drivers/phases}/types.py +0 -0
- /ommlds/cli/sessions/chat/{tools → drivers/state}/__init__.py +0 -0
- /ommlds/{minichain/content/transforms → cli/sessions/chat/drivers/tools}/__init__.py +0 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/entry_points.txt +0 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/licenses/LICENSE +0 -0
- {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import typing as ta
|
|
3
|
+
|
|
4
|
+
from omlish import dataclasses as dc
|
|
5
|
+
from omlish import lang
|
|
6
|
+
from omlish.argparse import all as argparse
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CommandError(Exception):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dc.dataclass()
|
|
17
|
+
class ArgsCommandError(CommandError):
|
|
18
|
+
command: 'Command'
|
|
19
|
+
argv: ta.Sequence[str]
|
|
20
|
+
help: str
|
|
21
|
+
|
|
22
|
+
arg_error: argparse.ArgumentError | None = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Command(lang.Abstract):
|
|
29
|
+
def __init__(self) -> None:
|
|
30
|
+
super().__init__()
|
|
31
|
+
|
|
32
|
+
self.__parser: argparse.ArgumentParser = argparse.NoExitArgumentParser(
|
|
33
|
+
prog=self.name,
|
|
34
|
+
description=self.description,
|
|
35
|
+
formatter_class=self._HelpFormatter,
|
|
36
|
+
)
|
|
37
|
+
self._configure_parser(self.__parser)
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def name(self) -> str:
|
|
43
|
+
return lang.camel_to_snake(type(self).__name__.removesuffix('Command'))
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def description(self) -> str | None:
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
class _HelpFormatter(argparse.HelpFormatter):
|
|
50
|
+
def start_section(self, heading):
|
|
51
|
+
return super().start_section(heading.title())
|
|
52
|
+
|
|
53
|
+
def add_usage(self, usage, actions, groups, prefix=None):
|
|
54
|
+
if prefix is None:
|
|
55
|
+
prefix = 'Usage: '
|
|
56
|
+
return super().add_usage(usage, actions, groups, prefix)
|
|
57
|
+
|
|
58
|
+
def _configure_parser(self, parser: argparse.ArgumentParser) -> None:
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
#
|
|
62
|
+
|
|
63
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
64
|
+
class Context:
|
|
65
|
+
print: ta.Callable[[str], ta.Awaitable[None]]
|
|
66
|
+
|
|
67
|
+
@ta.final
|
|
68
|
+
async def run(self, ctx: Context, argv: list[str]) -> None:
|
|
69
|
+
try:
|
|
70
|
+
args = self.__parser.parse_args(argv)
|
|
71
|
+
except argparse.ArgumentError as ae:
|
|
72
|
+
raise ArgsCommandError(
|
|
73
|
+
self,
|
|
74
|
+
argv,
|
|
75
|
+
self.__parser.format_help(),
|
|
76
|
+
ae,
|
|
77
|
+
) from ae
|
|
78
|
+
|
|
79
|
+
await self._run_args(ctx, args)
|
|
80
|
+
|
|
81
|
+
@abc.abstractmethod
|
|
82
|
+
def _run_args(self, ctx: Context, args: argparse.Namespace) -> ta.Awaitable[None]:
|
|
83
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from omlish import inject as inj
|
|
2
|
+
from omlish import lang
|
|
3
|
+
|
|
4
|
+
from .configs import CommandsConfig
|
|
5
|
+
from .injection import commands
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
with lang.auto_proxy_import(globals()):
|
|
9
|
+
from . import manager as _manager
|
|
10
|
+
from . import simple as _simple
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def bind_commands(cfg: CommandsConfig = CommandsConfig()) -> inj.Elements:
|
|
17
|
+
els: list[inj.Elemental] = []
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
els.append(commands().bind_items_provider(singleton=True))
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
|
|
25
|
+
els.extend([
|
|
26
|
+
inj.bind(_manager.CommandsManager, singleton=True),
|
|
27
|
+
])
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
|
|
31
|
+
els.extend([
|
|
32
|
+
inj.bind(_simple.EchoCommand, singleton=True),
|
|
33
|
+
commands().bind_item(to_key=_simple.EchoCommand),
|
|
34
|
+
|
|
35
|
+
inj.bind(_simple.QuitCommand, singleton=True),
|
|
36
|
+
commands().bind_item(to_key=_simple.QuitCommand),
|
|
37
|
+
])
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
|
|
41
|
+
return inj.as_elements(*els)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from omlish import inject as inj
|
|
2
|
+
from omlish import lang
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
with lang.auto_proxy_import(globals()):
|
|
6
|
+
from . import base as _base
|
|
7
|
+
from . import types as _types
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@lang.cached_function
|
|
14
|
+
def commands() -> 'inj.ItemsBinderHelper[_base.Command]':
|
|
15
|
+
return inj.items_binder_helper[_base.Command](_types.Commands)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import enum
|
|
2
|
+
import shlex
|
|
3
|
+
|
|
4
|
+
from omlish import collections as col
|
|
5
|
+
|
|
6
|
+
from ..ui import UiMessageDisplayer
|
|
7
|
+
from .base import Command
|
|
8
|
+
from .types import Commands
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RunCommandResult(enum.StrEnum):
|
|
15
|
+
SUCCESS = 'success'
|
|
16
|
+
FAILURE = 'failure'
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CommandsManager:
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
*,
|
|
23
|
+
commands: Commands,
|
|
24
|
+
ui_message_displayer: UiMessageDisplayer,
|
|
25
|
+
) -> None:
|
|
26
|
+
super().__init__()
|
|
27
|
+
|
|
28
|
+
self._commands = commands
|
|
29
|
+
self._ui_message_displayer = ui_message_displayer
|
|
30
|
+
|
|
31
|
+
self._commands_by_name = col.make_map((
|
|
32
|
+
(c.name, c) for c in commands
|
|
33
|
+
), strict=True)
|
|
34
|
+
|
|
35
|
+
async def run_command_text(self, text: str) -> RunCommandResult:
|
|
36
|
+
try:
|
|
37
|
+
parts = shlex.split(text)
|
|
38
|
+
except ValueError as e:
|
|
39
|
+
await self._ui_message_displayer.display_ui_message(f'Invalid command syntax: {e}')
|
|
40
|
+
return RunCommandResult.FAILURE
|
|
41
|
+
|
|
42
|
+
if not parts:
|
|
43
|
+
return RunCommandResult.FAILURE
|
|
44
|
+
|
|
45
|
+
cmd = parts[0].lstrip('/').lower()
|
|
46
|
+
argv = parts[1:]
|
|
47
|
+
|
|
48
|
+
command = self._commands_by_name.get(cmd)
|
|
49
|
+
if not command:
|
|
50
|
+
await self._ui_message_displayer.display_ui_message(f'Unknown command: {cmd}')
|
|
51
|
+
return RunCommandResult.FAILURE
|
|
52
|
+
|
|
53
|
+
ctx = Command.Context(
|
|
54
|
+
print=self._ui_message_displayer.display_ui_message,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
await command.run(ctx, argv)
|
|
58
|
+
|
|
59
|
+
return RunCommandResult.SUCCESS
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from omlish.argparse import all as argparse
|
|
2
|
+
|
|
3
|
+
from ..ui import UiQuitSignal
|
|
4
|
+
from .base import Command
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EchoCommand(Command):
|
|
11
|
+
def _configure_parser(self, parser: argparse.ArgumentParser) -> None:
|
|
12
|
+
super()._configure_parser(parser)
|
|
13
|
+
|
|
14
|
+
parser.add_argument('message', help='Message to echo')
|
|
15
|
+
|
|
16
|
+
async def _run_args(self, ctx: Command.Context, args: argparse.Namespace) -> None:
|
|
17
|
+
await ctx.print(args.message)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class QuitCommand(Command):
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
*,
|
|
27
|
+
quit_signal: UiQuitSignal,
|
|
28
|
+
) -> None:
|
|
29
|
+
super().__init__()
|
|
30
|
+
|
|
31
|
+
self._quit_signal = quit_signal
|
|
32
|
+
|
|
33
|
+
async def _run_args(self, ctx: Command.Context, args: argparse.Namespace) -> None:
|
|
34
|
+
await self._quit_signal()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from ..... import minichain as mc
|
|
2
|
+
from ..drivers.types import ChatDriver
|
|
3
|
+
from .commands.manager import CommandsManager
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ChatFacade:
|
|
10
|
+
def __init__(
|
|
11
|
+
self,
|
|
12
|
+
*,
|
|
13
|
+
driver: ChatDriver,
|
|
14
|
+
commands: CommandsManager,
|
|
15
|
+
) -> None:
|
|
16
|
+
super().__init__()
|
|
17
|
+
|
|
18
|
+
self._driver = driver
|
|
19
|
+
self._commands = commands
|
|
20
|
+
|
|
21
|
+
async def handle_user_input(self, text: str) -> None:
|
|
22
|
+
if text.startswith('/'):
|
|
23
|
+
await self._commands.run_command_text(text[1:])
|
|
24
|
+
|
|
25
|
+
else:
|
|
26
|
+
await self._driver.send_user_messages([mc.UserMessage(text)])
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from omlish import inject as inj
|
|
2
|
+
from omlish import lang
|
|
3
|
+
|
|
4
|
+
from .configs import FacadeConfig
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
with lang.auto_proxy_import(globals()):
|
|
8
|
+
from . import facade as _facade
|
|
9
|
+
from . import ui as _ui
|
|
10
|
+
from .commands import inject as _commands
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def bind_facade(cfg: FacadeConfig = FacadeConfig()) -> inj.Elements:
|
|
17
|
+
els: list[inj.Elemental] = []
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
els.extend([
|
|
22
|
+
_commands.bind_commands(cfg.commands),
|
|
23
|
+
])
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
els.append(inj.bind(_facade.ChatFacade, singleton=True))
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
|
|
31
|
+
els.append(inj.bind(_ui.UiQuitSignal(_ui.raise_system_exit_ui_quit_signal)))
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
|
|
35
|
+
return inj.as_elements(*els)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import typing as ta
|
|
3
|
+
|
|
4
|
+
from omlish import lang
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class UiMessageDisplayer(lang.Abstract):
|
|
11
|
+
@abc.abstractmethod
|
|
12
|
+
def display_ui_message(self, content: str) -> ta.Awaitable[None]:
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class NopUiMessageDisplayer(UiMessageDisplayer):
|
|
17
|
+
async def display_ui_message(self, content: str) -> None:
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PrintMessageDisplayer(UiMessageDisplayer):
|
|
22
|
+
async def display_ui_message(self, content: str) -> None:
|
|
23
|
+
print(content)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class UiQuitSignal(lang.Func0[ta.Awaitable[None]]):
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def raise_system_exit_ui_quit_signal() -> None:
|
|
34
|
+
raise SystemExit
|
|
@@ -1,79 +1,40 @@
|
|
|
1
|
-
from omlish import dataclasses as dc
|
|
2
1
|
from omlish import inject as inj
|
|
3
2
|
from omlish import lang
|
|
4
3
|
|
|
5
4
|
from ..base import Session
|
|
6
|
-
from .configs import DEFAULT_CHAT_MODEL_BACKEND
|
|
7
5
|
from .configs import ChatConfig
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
with lang.auto_proxy_import(globals()):
|
|
11
|
-
from
|
|
9
|
+
from ...rendering import inject as _rendering
|
|
12
10
|
from . import session as _session
|
|
13
|
-
from .
|
|
14
|
-
from .
|
|
15
|
-
from .
|
|
16
|
-
from .chat.user import inject as _chat_user
|
|
17
|
-
from .phases import inject as _phases
|
|
18
|
-
from .rendering import inject as _rendering
|
|
19
|
-
from .tools import inject as _tools
|
|
11
|
+
from .drivers import inject as _drivers
|
|
12
|
+
from .facades import inject as _facades
|
|
13
|
+
from .interfaces import inject as _interfaces
|
|
20
14
|
|
|
21
15
|
|
|
22
16
|
##
|
|
23
17
|
|
|
24
18
|
|
|
25
|
-
def bind_chat(cfg: ChatConfig) -> inj.Elements:
|
|
19
|
+
def bind_chat(cfg: ChatConfig = ChatConfig()) -> inj.Elements:
|
|
26
20
|
els: list[inj.Elemental] = []
|
|
27
21
|
|
|
28
22
|
#
|
|
29
23
|
|
|
30
24
|
els.extend([
|
|
31
|
-
|
|
32
|
-
backend=cfg.backend or DEFAULT_CHAT_MODEL_BACKEND,
|
|
33
|
-
),
|
|
34
|
-
|
|
35
|
-
_chat_ai.bind_ai(
|
|
36
|
-
stream=cfg.stream,
|
|
37
|
-
silent=cfg.silent,
|
|
38
|
-
enable_tools=cfg.enable_tools,
|
|
39
|
-
),
|
|
40
|
-
|
|
41
|
-
_chat_user.bind_user(
|
|
42
|
-
initial_system_content=cfg.initial_system_content,
|
|
43
|
-
initial_user_content=cfg.initial_user_content,
|
|
44
|
-
interactive=cfg.interactive,
|
|
45
|
-
),
|
|
46
|
-
|
|
47
|
-
_chat_state.bind_state(
|
|
48
|
-
state=cfg.state,
|
|
49
|
-
),
|
|
50
|
-
|
|
51
|
-
_phases.bind_phases(),
|
|
52
|
-
|
|
53
|
-
_rendering.bind_rendering(
|
|
54
|
-
markdown=cfg.markdown,
|
|
55
|
-
),
|
|
56
|
-
])
|
|
25
|
+
_drivers.bind_driver(cfg.driver),
|
|
57
26
|
|
|
58
|
-
|
|
27
|
+
_facades.bind_facade(cfg.facade),
|
|
59
28
|
|
|
60
|
-
|
|
61
|
-
els.append(_tools.bind_tools(
|
|
62
|
-
silent=cfg.silent,
|
|
63
|
-
dangerous_no_confirmation=cfg.dangerous_no_tool_confirmation,
|
|
64
|
-
enabled_tools=cfg.enabled_tools,
|
|
65
|
-
))
|
|
29
|
+
_interfaces.bind_interface(cfg.interface),
|
|
66
30
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
els.extend([
|
|
70
|
-
inj.bind(_driver.ChatDriver, singleton=True),
|
|
31
|
+
_rendering.bind_rendering(cfg.rendering),
|
|
71
32
|
])
|
|
72
33
|
|
|
73
34
|
#
|
|
74
35
|
|
|
75
36
|
els.extend([
|
|
76
|
-
inj.bind(
|
|
37
|
+
# inj.bind(cfg), # NOTE: *not* done - the code is properly structured around not needing it.
|
|
77
38
|
inj.bind(Session, to_ctor=_session.ChatSession, singleton=True),
|
|
78
39
|
])
|
|
79
40
|
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from omlish import dataclasses as dc
|
|
4
|
+
|
|
5
|
+
from ..configs import InterfaceConfig
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
12
|
+
class BareInterfaceConfig(InterfaceConfig):
|
|
13
|
+
interactive: bool = False
|
|
14
|
+
|
|
15
|
+
use_readline: bool | ta.Literal['auto'] = 'auto'
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from omlish import inject as inj
|
|
2
|
+
from omlish import lang
|
|
3
|
+
|
|
4
|
+
from ..base import ChatInterface
|
|
5
|
+
from .configs import BareInterfaceConfig
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
with lang.auto_proxy_import(globals()):
|
|
9
|
+
from .....inputs import asyncs as _inputs_asyncs
|
|
10
|
+
from .....inputs import sync as _inputs_sync
|
|
11
|
+
from ...drivers.tools import confirmation as _tools_confirmation
|
|
12
|
+
from ...facades import ui as _facades_ui
|
|
13
|
+
from . import interactive as _interactive
|
|
14
|
+
from . import oneshot as _oneshot
|
|
15
|
+
from . import tools as _tools
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def bind_bare(cfg: BareInterfaceConfig = BareInterfaceConfig()) -> inj.Elements:
|
|
22
|
+
els: list[inj.Elemental] = []
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
|
|
26
|
+
if cfg.interactive:
|
|
27
|
+
els.extend([
|
|
28
|
+
inj.bind(_interactive.InteractiveBareChatInterface, singleton=True),
|
|
29
|
+
inj.bind(ChatInterface, to_key=_interactive.InteractiveBareChatInterface),
|
|
30
|
+
])
|
|
31
|
+
|
|
32
|
+
els.extend([
|
|
33
|
+
inj.bind(_inputs_sync.SyncStringInput, to_const=_inputs_sync.InputSyncStringInput(use_readline=cfg.use_readline)), # noqa
|
|
34
|
+
inj.bind(_inputs_asyncs.AsyncStringInput, to_ctor=_inputs_asyncs.ThreadAsyncStringInput, singleton=True),
|
|
35
|
+
])
|
|
36
|
+
|
|
37
|
+
else:
|
|
38
|
+
els.extend([
|
|
39
|
+
inj.bind(_oneshot.OneshotBareChatInterface, singleton=True),
|
|
40
|
+
inj.bind(ChatInterface, to_key=_oneshot.OneshotBareChatInterface),
|
|
41
|
+
])
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
|
|
45
|
+
if cfg.enable_tools:
|
|
46
|
+
if cfg.dangerous_no_tool_confirmation:
|
|
47
|
+
els.append(inj.bind(
|
|
48
|
+
_tools_confirmation.ToolExecutionConfirmation,
|
|
49
|
+
to_ctor=_tools_confirmation.UnsafeAlwaysAllowToolExecutionConfirmation,
|
|
50
|
+
singleton=True,
|
|
51
|
+
))
|
|
52
|
+
|
|
53
|
+
else:
|
|
54
|
+
els.append(inj.bind(
|
|
55
|
+
_tools_confirmation.ToolExecutionConfirmation,
|
|
56
|
+
to_ctor=_tools.InteractiveToolExecutionConfirmation,
|
|
57
|
+
singleton=True,
|
|
58
|
+
))
|
|
59
|
+
|
|
60
|
+
#
|
|
61
|
+
|
|
62
|
+
els.extend([
|
|
63
|
+
inj.bind(_facades_ui.PrintMessageDisplayer, singleton=True),
|
|
64
|
+
inj.bind(_facades_ui.UiMessageDisplayer, to_key=_facades_ui.PrintMessageDisplayer),
|
|
65
|
+
])
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
|
|
69
|
+
return inj.as_elements(*els)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from .....inputs.asyncs import AsyncStringInput
|
|
4
|
+
from .....inputs.asyncs import SyncAsyncStringInput
|
|
5
|
+
from .....inputs.sync import InputSyncStringInput
|
|
6
|
+
from ...drivers.types import ChatDriver
|
|
7
|
+
from ...facades.facade import ChatFacade
|
|
8
|
+
from ..base import ChatInterface
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class InteractiveBareChatInterface(ChatInterface):
|
|
15
|
+
DEFAULT_STRING_INPUT: ta.ClassVar[AsyncStringInput] = SyncAsyncStringInput(InputSyncStringInput())
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
*,
|
|
20
|
+
driver: ChatDriver,
|
|
21
|
+
facade: ChatFacade,
|
|
22
|
+
string_input: AsyncStringInput | None = None,
|
|
23
|
+
) -> None:
|
|
24
|
+
super().__init__()
|
|
25
|
+
|
|
26
|
+
self._driver = driver
|
|
27
|
+
self._facade = facade
|
|
28
|
+
if string_input is None:
|
|
29
|
+
string_input = self.DEFAULT_STRING_INPUT
|
|
30
|
+
self._string_input = string_input
|
|
31
|
+
|
|
32
|
+
async def run(self) -> None:
|
|
33
|
+
await self._driver.start()
|
|
34
|
+
|
|
35
|
+
while True:
|
|
36
|
+
try:
|
|
37
|
+
s = await self._string_input()
|
|
38
|
+
except EOFError:
|
|
39
|
+
break
|
|
40
|
+
|
|
41
|
+
print()
|
|
42
|
+
print('<')
|
|
43
|
+
print()
|
|
44
|
+
|
|
45
|
+
await self._facade.handle_user_input(s)
|
|
46
|
+
|
|
47
|
+
print()
|
|
48
|
+
|
|
49
|
+
await self._driver.stop()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from ...drivers.types import ChatDriver
|
|
2
|
+
from ..base import ChatInterface
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
##
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class OneshotBareChatInterface(ChatInterface):
|
|
9
|
+
def __init__(
|
|
10
|
+
self,
|
|
11
|
+
*,
|
|
12
|
+
driver: ChatDriver,
|
|
13
|
+
) -> None:
|
|
14
|
+
super().__init__()
|
|
15
|
+
|
|
16
|
+
self._driver = driver
|
|
17
|
+
|
|
18
|
+
async def run(self) -> None:
|
|
19
|
+
await self._driver.start()
|
|
20
|
+
|
|
21
|
+
await self._driver.stop()
|
|
@@ -1,28 +1,9 @@
|
|
|
1
|
-
import abc
|
|
2
|
-
import typing as ta
|
|
3
|
-
|
|
4
|
-
from omlish import lang
|
|
5
1
|
from omlish.formats import json
|
|
6
2
|
from omlish.term.confirm import confirm_action
|
|
7
3
|
|
|
8
|
-
from
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class ToolExecutionRequestDeniedError(Exception):
|
|
15
|
-
pass
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class ToolExecutionConfirmation(lang.Abstract):
|
|
19
|
-
@abc.abstractmethod
|
|
20
|
-
def confirm_tool_execution_or_raise(
|
|
21
|
-
self,
|
|
22
|
-
use: 'mc.ToolUse',
|
|
23
|
-
entry: 'mc.ToolCatalogEntry',
|
|
24
|
-
) -> ta.Awaitable[None]:
|
|
25
|
-
raise NotImplementedError
|
|
4
|
+
from ...... import minichain as mc
|
|
5
|
+
from ...drivers.tools.confirmation import ToolExecutionConfirmation
|
|
6
|
+
from ...drivers.tools.confirmation import ToolExecutionRequestDeniedError
|
|
26
7
|
|
|
27
8
|
|
|
28
9
|
##
|