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,114 @@
|
|
|
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
|
+
|
|
10
|
+
from .....backends.cerebras import protocol as pt
|
|
11
|
+
from .....backends.cerebras.clients import REQUIRED_HTTP_HEADERS
|
|
12
|
+
from ....chat.choices.stream.services import ChatChoicesStreamRequest
|
|
13
|
+
from ....chat.choices.stream.services import ChatChoicesStreamResponse
|
|
14
|
+
from ....chat.choices.stream.services import static_check_is_chat_choices_stream_service
|
|
15
|
+
from ....chat.choices.stream.types import AiChoicesDeltas
|
|
16
|
+
from ....chat.tools.types import Tool
|
|
17
|
+
from ....configs import Config
|
|
18
|
+
from ....http.stream import BytesHttpStreamResponseBuilder
|
|
19
|
+
from ....http.stream import SimpleSseLinesHttpStreamResponseHandler
|
|
20
|
+
from ....standard import ApiKey
|
|
21
|
+
from .chat import CerebrasChatChoicesService
|
|
22
|
+
from .names import MODEL_NAMES
|
|
23
|
+
from .protocol import build_cer_request_messages
|
|
24
|
+
from .protocol import build_cer_request_tool
|
|
25
|
+
from .protocol import build_mc_ai_choice_deltas
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
##
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
|
|
32
|
+
# name='cerebras',
|
|
33
|
+
# type='ChatChoicesStreamService',
|
|
34
|
+
# )
|
|
35
|
+
@static_check_is_chat_choices_stream_service
|
|
36
|
+
class CerebrasChatChoicesStreamService:
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
*configs: Config,
|
|
40
|
+
http_client: http.AsyncHttpClient | None = None,
|
|
41
|
+
) -> None:
|
|
42
|
+
super().__init__()
|
|
43
|
+
|
|
44
|
+
self._http_client = http_client
|
|
45
|
+
|
|
46
|
+
with tv.consume(*configs) as cc:
|
|
47
|
+
self._model_name = cc.pop(CerebrasChatChoicesService.DEFAULT_MODEL_NAME)
|
|
48
|
+
self._api_key = ApiKey.pop_secret(cc, env='CEREBRAS_API_KEY')
|
|
49
|
+
|
|
50
|
+
URL: ta.ClassVar[str] = 'https://api.cerebras.ai/v1/chat/completions'
|
|
51
|
+
|
|
52
|
+
def _process_sse(self, so: sse.SseDecoderOutput) -> ta.Sequence[AiChoicesDeltas | None]:
|
|
53
|
+
if not (isinstance(so, sse.SseEvent) and so.type == b'message'):
|
|
54
|
+
return []
|
|
55
|
+
|
|
56
|
+
ss = so.data.decode('utf-8')
|
|
57
|
+
if ss == '[DONE]':
|
|
58
|
+
return [None]
|
|
59
|
+
|
|
60
|
+
sj = json.loads(ss) # ChatCompletionChunk
|
|
61
|
+
|
|
62
|
+
check.state(sj['object'] == 'chat.completion.chunk')
|
|
63
|
+
|
|
64
|
+
ccc = msh.unmarshal(sj, pt.ChatCompletionChunk)
|
|
65
|
+
|
|
66
|
+
# FIXME: stop reason
|
|
67
|
+
if not ccc.choices:
|
|
68
|
+
return []
|
|
69
|
+
|
|
70
|
+
if any(choice.finish_reason for choice in ccc.choices):
|
|
71
|
+
check.state(all(choice.finish_reason for choice in ccc.choices))
|
|
72
|
+
return [None]
|
|
73
|
+
|
|
74
|
+
return [AiChoicesDeltas([
|
|
75
|
+
build_mc_ai_choice_deltas(choice.delta)
|
|
76
|
+
for choice in ccc.choices
|
|
77
|
+
])]
|
|
78
|
+
|
|
79
|
+
READ_CHUNK_SIZE: ta.ClassVar[int] = -1
|
|
80
|
+
|
|
81
|
+
async def invoke(self, request: ChatChoicesStreamRequest) -> ChatChoicesStreamResponse:
|
|
82
|
+
tools: list[pt.ChatCompletionRequest.Tool] = []
|
|
83
|
+
with tv.TypedValues(*request.options).consume() as oc:
|
|
84
|
+
t: Tool
|
|
85
|
+
for t in oc.pop(Tool, []):
|
|
86
|
+
tools.append(build_cer_request_tool(t))
|
|
87
|
+
|
|
88
|
+
cer_request = pt.ChatCompletionRequest(
|
|
89
|
+
messages=build_cer_request_messages(request.v),
|
|
90
|
+
model=MODEL_NAMES.resolve(self._model_name.v),
|
|
91
|
+
tools=tools or None,
|
|
92
|
+
stream=True,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
raw_request = msh.marshal(cer_request)
|
|
96
|
+
|
|
97
|
+
http_request = http.HttpRequest(
|
|
98
|
+
'https://api.cerebras.ai/v1/chat/completions',
|
|
99
|
+
headers={
|
|
100
|
+
http.consts.HEADER_CONTENT_TYPE: http.consts.CONTENT_TYPE_JSON,
|
|
101
|
+
http.consts.HEADER_AUTH: http.consts.format_bearer_auth_header(check.not_none(self._api_key).reveal()),
|
|
102
|
+
**REQUIRED_HTTP_HEADERS,
|
|
103
|
+
},
|
|
104
|
+
data=json.dumps(raw_request).encode('utf-8'),
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return await BytesHttpStreamResponseBuilder(
|
|
108
|
+
self._http_client,
|
|
109
|
+
lambda http_response: SimpleSseLinesHttpStreamResponseHandler(self._process_sse).as_lines().as_bytes(),
|
|
110
|
+
read_chunk_size=self.READ_CHUNK_SIZE,
|
|
111
|
+
).new_stream_response(
|
|
112
|
+
http_request,
|
|
113
|
+
request.options,
|
|
114
|
+
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
from omlish import lang
|
|
2
2
|
|
|
3
3
|
from ....search import SearchHit
|
|
4
4
|
from ....search import SearchHits
|
|
@@ -7,6 +7,10 @@ from ....search import SearchResponse
|
|
|
7
7
|
from ....search import static_check_is_search_service
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
with lang.auto_proxy_import(globals()):
|
|
11
|
+
import ddgs
|
|
12
|
+
|
|
13
|
+
|
|
10
14
|
##
|
|
11
15
|
|
|
12
16
|
|
|
File without changes
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# ruff: noqa: PERF402
|
|
2
|
+
import typing as ta
|
|
3
|
+
|
|
4
|
+
from omlish.text.lorem import LOREM
|
|
5
|
+
|
|
6
|
+
from ....chat.choices.services import ChatChoicesRequest
|
|
7
|
+
from ....chat.choices.services import ChatChoicesResponse
|
|
8
|
+
from ....chat.choices.services import static_check_is_chat_choices_service
|
|
9
|
+
from ....chat.choices.stream.services import ChatChoicesStreamRequest
|
|
10
|
+
from ....chat.choices.stream.services import ChatChoicesStreamResponse
|
|
11
|
+
from ....chat.choices.stream.services import static_check_is_chat_choices_stream_service
|
|
12
|
+
from ....chat.choices.stream.types import AiChoiceDeltas
|
|
13
|
+
from ....chat.choices.stream.types import AiChoicesDeltas
|
|
14
|
+
from ....chat.choices.types import AiChoice
|
|
15
|
+
from ....chat.choices.types import ChatChoicesOutputs
|
|
16
|
+
from ....chat.messages import AiMessage
|
|
17
|
+
from ....chat.stream.types import ContentAiDelta
|
|
18
|
+
from ....resources import UseResources
|
|
19
|
+
from ....stream.services import StreamResponseSink
|
|
20
|
+
from ....stream.services import new_stream_response
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
|
|
27
|
+
# name='dummy',
|
|
28
|
+
# type='ChatChoicesService',
|
|
29
|
+
# )
|
|
30
|
+
@static_check_is_chat_choices_service
|
|
31
|
+
class DummyChatChoicesService:
|
|
32
|
+
async def invoke(self, request: ChatChoicesRequest) -> ChatChoicesResponse:
|
|
33
|
+
return ChatChoicesResponse([AiChoice([AiMessage(LOREM)])])
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
|
|
40
|
+
# name='dummy',
|
|
41
|
+
# type='ChatChoicesStreamService',
|
|
42
|
+
# )
|
|
43
|
+
@static_check_is_chat_choices_stream_service
|
|
44
|
+
class DummyChatChoicesStreamService:
|
|
45
|
+
async def invoke(self, request: ChatChoicesStreamRequest) -> ChatChoicesStreamResponse:
|
|
46
|
+
async with UseResources.or_new(request.options) as rs:
|
|
47
|
+
async def inner(sink: StreamResponseSink[AiChoicesDeltas]) -> ta.Sequence[ChatChoicesOutputs]:
|
|
48
|
+
for s in LOREM:
|
|
49
|
+
await sink.emit(AiChoicesDeltas([
|
|
50
|
+
AiChoiceDeltas([
|
|
51
|
+
ContentAiDelta(s),
|
|
52
|
+
]),
|
|
53
|
+
]))
|
|
54
|
+
|
|
55
|
+
return []
|
|
56
|
+
|
|
57
|
+
return await new_stream_response(rs, inner)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
##
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# @omlish-manifest $.minichain.backends.strings.manifests.BackendStringsManifest(
|
|
64
|
+
# [
|
|
65
|
+
# 'ChatChoicesService',
|
|
66
|
+
# 'ChatChoicesStreamService',
|
|
67
|
+
# ],
|
|
68
|
+
# 'dummy',
|
|
69
|
+
# )
|
|
@@ -16,16 +16,14 @@ from ....chat.choices.services import static_check_is_chat_choices_service
|
|
|
16
16
|
from ....chat.choices.types import AiChoice
|
|
17
17
|
from ....chat.messages import AiMessage
|
|
18
18
|
from ....chat.messages import AnyAiMessage
|
|
19
|
-
from ....chat.messages import Message
|
|
20
|
-
from ....chat.messages import SystemMessage
|
|
21
19
|
from ....chat.messages import ToolUseMessage
|
|
22
|
-
from ....chat.messages import ToolUseResultMessage
|
|
23
|
-
from ....chat.messages import UserMessage
|
|
24
20
|
from ....chat.tools.types import Tool
|
|
25
21
|
from ....models.configs import ModelName
|
|
26
22
|
from ....standard import ApiKey
|
|
27
23
|
from ....tools.types import ToolUse
|
|
28
24
|
from .names import MODEL_NAMES
|
|
25
|
+
from .protocol import make_msg_content
|
|
26
|
+
from .protocol import pop_system_instructions
|
|
29
27
|
from .tools import build_tool_spec_schema
|
|
30
28
|
|
|
31
29
|
|
|
@@ -40,97 +38,27 @@ from .tools import build_tool_spec_schema
|
|
|
40
38
|
class GoogleChatChoicesService:
|
|
41
39
|
DEFAULT_MODEL_NAME: ta.ClassVar[ModelName] = ModelName(check.not_none(MODEL_NAMES.default))
|
|
42
40
|
|
|
43
|
-
def __init__(
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
*configs: ApiKey | ModelName,
|
|
44
|
+
http_client: http.AsyncHttpClient | None = None,
|
|
45
|
+
) -> None:
|
|
44
46
|
super().__init__()
|
|
45
47
|
|
|
48
|
+
self._http_client = http_client
|
|
49
|
+
|
|
46
50
|
with tv.consume(*configs) as cc:
|
|
47
51
|
self._model_name = cc.pop(self.DEFAULT_MODEL_NAME)
|
|
48
52
|
self._api_key = ApiKey.pop_secret(cc, env='GEMINI_API_KEY')
|
|
49
53
|
|
|
50
|
-
def _get_msg_content(self, m: Message) -> str | None:
|
|
51
|
-
if isinstance(m, AiMessage):
|
|
52
|
-
return check.isinstance(m.c, str)
|
|
53
|
-
|
|
54
|
-
elif isinstance(m, (SystemMessage, UserMessage)):
|
|
55
|
-
return check.isinstance(m.c, str)
|
|
56
|
-
|
|
57
|
-
else:
|
|
58
|
-
raise TypeError(m)
|
|
59
|
-
|
|
60
54
|
BASE_URL: ta.ClassVar[str] = 'https://generativelanguage.googleapis.com/v1beta/models'
|
|
61
55
|
|
|
62
|
-
ROLES_MAP: ta.ClassVar[ta.Mapping[type[Message], str]] = {
|
|
63
|
-
UserMessage: 'user',
|
|
64
|
-
AiMessage: 'model',
|
|
65
|
-
ToolUseMessage: 'model',
|
|
66
|
-
}
|
|
67
|
-
|
|
68
56
|
async def invoke(
|
|
69
57
|
self,
|
|
70
58
|
request: ChatChoicesRequest,
|
|
71
59
|
) -> ChatChoicesResponse:
|
|
72
60
|
key = check.not_none(self._api_key).reveal()
|
|
73
61
|
|
|
74
|
-
g_sys_content: pt.Content | None = None
|
|
75
|
-
g_contents: list[pt.Content] = []
|
|
76
|
-
for i, m in enumerate(request.v):
|
|
77
|
-
if isinstance(m, SystemMessage):
|
|
78
|
-
check.arg(i == 0)
|
|
79
|
-
check.none(g_sys_content)
|
|
80
|
-
g_sys_content = pt.Content(
|
|
81
|
-
parts=[pt.Part(
|
|
82
|
-
text=check.not_none(self._get_msg_content(m)),
|
|
83
|
-
)],
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
elif isinstance(m, ToolUseResultMessage):
|
|
87
|
-
tr_resp_val: pt.Value
|
|
88
|
-
if m.tur.c is None:
|
|
89
|
-
tr_resp_val = pt.NullValue() # type: ignore[unreachable]
|
|
90
|
-
elif isinstance(m.tur.c, str):
|
|
91
|
-
tr_resp_val = pt.StringValue(m.tur.c)
|
|
92
|
-
else:
|
|
93
|
-
raise TypeError(m.tur.c)
|
|
94
|
-
g_contents.append(pt.Content(
|
|
95
|
-
parts=[pt.Part(
|
|
96
|
-
function_response=pt.FunctionResponse(
|
|
97
|
-
id=m.tur.id,
|
|
98
|
-
name=m.tur.name,
|
|
99
|
-
response={
|
|
100
|
-
'value': tr_resp_val,
|
|
101
|
-
},
|
|
102
|
-
),
|
|
103
|
-
)],
|
|
104
|
-
))
|
|
105
|
-
|
|
106
|
-
elif isinstance(m, AiMessage):
|
|
107
|
-
g_contents.append(pt.Content(
|
|
108
|
-
parts=[pt.Part(
|
|
109
|
-
text=check.not_none(self._get_msg_content(m)),
|
|
110
|
-
)],
|
|
111
|
-
role='model',
|
|
112
|
-
))
|
|
113
|
-
|
|
114
|
-
elif isinstance(m, ToolUseMessage):
|
|
115
|
-
g_contents.append(pt.Content(
|
|
116
|
-
parts=[pt.Part(
|
|
117
|
-
function_call=pt.FunctionCall(
|
|
118
|
-
id=m.tu.id,
|
|
119
|
-
name=m.tu.name,
|
|
120
|
-
args=m.tu.args,
|
|
121
|
-
),
|
|
122
|
-
)],
|
|
123
|
-
role='model',
|
|
124
|
-
))
|
|
125
|
-
|
|
126
|
-
else:
|
|
127
|
-
g_contents.append(pt.Content(
|
|
128
|
-
parts=[pt.Part(
|
|
129
|
-
text=check.not_none(self._get_msg_content(m)),
|
|
130
|
-
)],
|
|
131
|
-
role=self.ROLES_MAP[type(m)], # type: ignore[arg-type]
|
|
132
|
-
))
|
|
133
|
-
|
|
134
62
|
g_tools: list[pt.Tool] = []
|
|
135
63
|
with tv.TypedValues(*request.options).consume() as oc:
|
|
136
64
|
t: Tool
|
|
@@ -139,21 +67,29 @@ class GoogleChatChoicesService:
|
|
|
139
67
|
function_declarations=[build_tool_spec_schema(t.spec)],
|
|
140
68
|
))
|
|
141
69
|
|
|
70
|
+
msgs = list(request.v)
|
|
71
|
+
|
|
72
|
+
system_inst = pop_system_instructions(msgs)
|
|
73
|
+
|
|
142
74
|
g_req = pt.GenerateContentRequest(
|
|
143
|
-
contents=
|
|
75
|
+
contents=[
|
|
76
|
+
make_msg_content(m)
|
|
77
|
+
for m in msgs
|
|
78
|
+
] or None,
|
|
144
79
|
tools=g_tools or None,
|
|
145
|
-
system_instruction=
|
|
80
|
+
system_instruction=system_inst,
|
|
146
81
|
)
|
|
147
82
|
|
|
148
83
|
req_dct = msh.marshal(g_req)
|
|
149
84
|
|
|
150
85
|
model_name = MODEL_NAMES.resolve(self._model_name.v)
|
|
151
86
|
|
|
152
|
-
resp = http.
|
|
87
|
+
resp = await http.async_request(
|
|
153
88
|
f'{self.BASE_URL.rstrip("/")}/{model_name}:generateContent?key={key}',
|
|
154
89
|
headers={'Content-Type': 'application/json'},
|
|
155
90
|
data=json.dumps_compact(req_dct).encode('utf-8'),
|
|
156
91
|
method='POST',
|
|
92
|
+
client=self._http_client,
|
|
157
93
|
)
|
|
158
94
|
|
|
159
95
|
resp_dct = json.loads(check.not_none(resp.data).decode('utf-8'))
|
|
@@ -16,6 +16,12 @@ from ...strings.manifests import BackendStringsManifest
|
|
|
16
16
|
MODEL_NAMES = ModelNameCollection(
|
|
17
17
|
default='gemini',
|
|
18
18
|
aliases={
|
|
19
|
+
'gemini-3-pro-preview': None,
|
|
20
|
+
'gemini-3-pro': 'gemini-3-pro-preview',
|
|
21
|
+
|
|
22
|
+
'gemini-3-flash-preview': None,
|
|
23
|
+
'gemini-3-flash': 'gemini-3-flash-preview',
|
|
24
|
+
|
|
19
25
|
'gemini-2.5-pro': None,
|
|
20
26
|
'gemini-2.5-flash': None,
|
|
21
27
|
'gemini-2.5-flash-lite': None,
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from omlish import check
|
|
4
|
+
|
|
5
|
+
from .....backends.google.protocol import types as pt
|
|
6
|
+
from ....chat.messages import AiMessage
|
|
7
|
+
from ....chat.messages import Message
|
|
8
|
+
from ....chat.messages import SystemMessage
|
|
9
|
+
from ....chat.messages import ToolUseMessage
|
|
10
|
+
from ....chat.messages import ToolUseResultMessage
|
|
11
|
+
from ....chat.messages import UserMessage
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
ROLES_MAP: ta.Mapping[type[Message], pt.ContentRole | None] = { # noqa
|
|
18
|
+
SystemMessage: None,
|
|
19
|
+
UserMessage: 'user',
|
|
20
|
+
AiMessage: 'model',
|
|
21
|
+
ToolUseMessage: 'model',
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def make_str_content(
|
|
26
|
+
s: str | None,
|
|
27
|
+
*,
|
|
28
|
+
role: pt.ContentRole | None = None,
|
|
29
|
+
) -> pt.Content | None:
|
|
30
|
+
if s is None:
|
|
31
|
+
return None
|
|
32
|
+
|
|
33
|
+
return pt.Content(
|
|
34
|
+
parts=[pt.Part(
|
|
35
|
+
text=check.not_none(s),
|
|
36
|
+
)],
|
|
37
|
+
role=role,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def make_msg_content(m: Message) -> pt.Content:
|
|
42
|
+
if isinstance(m, (AiMessage, SystemMessage, UserMessage)):
|
|
43
|
+
return check.not_none(make_str_content(
|
|
44
|
+
check.isinstance(m.c, str),
|
|
45
|
+
role=ROLES_MAP[type(m)],
|
|
46
|
+
))
|
|
47
|
+
|
|
48
|
+
elif isinstance(m, ToolUseResultMessage):
|
|
49
|
+
tr_resp_val: pt.Value
|
|
50
|
+
if m.tur.c is None:
|
|
51
|
+
tr_resp_val = pt.NullValue() # type: ignore[unreachable]
|
|
52
|
+
elif isinstance(m.tur.c, str):
|
|
53
|
+
tr_resp_val = pt.StringValue(m.tur.c)
|
|
54
|
+
else:
|
|
55
|
+
raise TypeError(m.tur.c)
|
|
56
|
+
|
|
57
|
+
return pt.Content(
|
|
58
|
+
parts=[pt.Part(
|
|
59
|
+
function_response=pt.FunctionResponse(
|
|
60
|
+
id=m.tur.id,
|
|
61
|
+
name=m.tur.name,
|
|
62
|
+
response={
|
|
63
|
+
'value': tr_resp_val,
|
|
64
|
+
},
|
|
65
|
+
),
|
|
66
|
+
)],
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
elif isinstance(m, ToolUseMessage):
|
|
70
|
+
return pt.Content(
|
|
71
|
+
parts=[pt.Part(
|
|
72
|
+
function_call=pt.FunctionCall(
|
|
73
|
+
id=m.tu.id,
|
|
74
|
+
name=m.tu.name,
|
|
75
|
+
args=m.tu.args,
|
|
76
|
+
),
|
|
77
|
+
)],
|
|
78
|
+
role='model',
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
else:
|
|
82
|
+
raise TypeError(m)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def pop_system_instructions(msgs: list[Message]) -> pt.Content | None:
|
|
86
|
+
if not msgs:
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
m0 = msgs[0]
|
|
90
|
+
if not isinstance(m0 := msgs[0], SystemMessage):
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
msgs.pop(0)
|
|
94
|
+
return make_msg_content(m0)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def get_msg_content(m: Message) -> str | None:
|
|
98
|
+
if isinstance(m, AiMessage):
|
|
99
|
+
return check.isinstance(m.c, str)
|
|
100
|
+
|
|
101
|
+
elif isinstance(m, (SystemMessage, UserMessage)):
|
|
102
|
+
return check.isinstance(m.c, str)
|
|
103
|
+
|
|
104
|
+
else:
|
|
105
|
+
raise TypeError(m)
|
|
@@ -24,7 +24,7 @@ from ....search import static_check_is_search_service
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
@dc.dataclass(frozen=True)
|
|
27
|
-
@msh.
|
|
27
|
+
@msh.update_object_options(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
|
|
28
28
|
class CseSearchResult(lang.Final):
|
|
29
29
|
kind: str | None = None
|
|
30
30
|
|
|
@@ -49,7 +49,7 @@ class CseSearchResult(lang.Final):
|
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
@dc.dataclass(frozen=True)
|
|
52
|
-
@msh.
|
|
52
|
+
@msh.update_object_options(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
|
|
53
53
|
class CseSearchInfo(lang.Final):
|
|
54
54
|
search_time: float | None = None
|
|
55
55
|
total_results: int | None = None
|
|
@@ -58,10 +58,10 @@ class CseSearchInfo(lang.Final):
|
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
@dc.dataclass(frozen=True)
|
|
61
|
-
@msh.
|
|
61
|
+
@msh.update_object_options(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
|
|
62
62
|
class CseSearchResponse(lang.Final):
|
|
63
63
|
kind: str | None = None
|
|
64
|
-
info: CseSearchInfo | None = dc.xfield(None) | msh.
|
|
64
|
+
info: CseSearchInfo | None = dc.xfield(None) | msh.with_field_options(name='searchInformation')
|
|
65
65
|
items: ta.Sequence[CseSearchResult] | None = None
|
|
66
66
|
|
|
67
67
|
x: ta.Mapping[str, ta.Any] | None = dc.field(default=None, repr=False)
|
|
@@ -82,12 +82,16 @@ class CseSearchService:
|
|
|
82
82
|
self,
|
|
83
83
|
cse_id: str | None = None,
|
|
84
84
|
cse_api_key: str | None = None,
|
|
85
|
+
*,
|
|
86
|
+
http_client: http.AsyncHttpClient | None = None,
|
|
85
87
|
) -> None:
|
|
86
88
|
super().__init__()
|
|
87
89
|
|
|
88
90
|
self._cse_id = cse_id
|
|
89
91
|
self._cse_api_key = cse_api_key
|
|
90
92
|
|
|
93
|
+
self._http_client = http_client
|
|
94
|
+
|
|
91
95
|
async def invoke(
|
|
92
96
|
self,
|
|
93
97
|
request: SearchRequest,
|
|
@@ -97,8 +101,9 @@ class CseSearchService:
|
|
|
97
101
|
cx=check.non_empty_str(self._cse_id),
|
|
98
102
|
q=request.v,
|
|
99
103
|
))
|
|
100
|
-
resp = http.
|
|
104
|
+
resp = await http.async_request(
|
|
101
105
|
f'https://www.googleapis.com/customsearch/v1?{qs}',
|
|
106
|
+
client=self._http_client,
|
|
102
107
|
)
|
|
103
108
|
out = check.not_none(resp.data)
|
|
104
109
|
|