A third `InferencePort` beside the connector and the SDK sidecar: one loopback-only OpenAI-compatible `POST /v1/chat/completions` call per prepared request, tool calls returned inert for Rust's own evaluator to drive the next round, exactly as the connector lane already does. No credential is read or sent; `open_inference` refuses a non-loopback `LocalBinding` and a model prefix two transports both claim. `RoutedInferencePort` gains the local slot and routes by longest claimed prefix, refusing rather than falling back to the connector when a claimed prefix has no configured port behind it (the same rule the SDK prefix already had, now made explicit for both). `ControllerModels::each` is `pub` and `open_inference` takes `models: &[&str]` instead of the whole struct, so a caller can extend the list with a model the struct does not carry. Dungeon's runtime reads `GHOSTLIGHT_LOCAL_ENDPOINT` and `GHOSTLIGHT_LOCAL_MODEL_PREFIX` and wires the binding through; no other Dungeon behavior changes in this cut. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
26 lines
618 B
TOML
26 lines
618 B
TOML
[package]
|
|
name = "ghostlight"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
|
|
[dependencies]
|
|
async-trait.workspace = true
|
|
chrono.workspace = true
|
|
codex-connector.workspace = true
|
|
cultcache-rs.workspace = true
|
|
ghostlight-persona-projection = { path = "../ghostlight-persona-projection" }
|
|
reqwest.workspace = true
|
|
rmp-serde.workspace = true
|
|
serde.workspace = true
|
|
serde_bytes = "0.11"
|
|
serde_json.workspace = true
|
|
sha2.workspace = true
|
|
thiserror.workspace = true
|
|
tokio.workspace = true
|
|
tracing.workspace = true
|
|
uuid.workspace = true
|
|
zeroize.workspace = true
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3"
|