From 7cfb3fd192c0933e11d8a29f0c95a5c38e289a00 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Mon, 20 May 2024 16:08:39 -0700 Subject: [PATCH 01/12] add router (compiling) --- .gitignore | 4 +- Cargo.lock | 240 ++++++++++- Cargo.toml | 1 + openai/api/llm_provider:nick1udwig.os-v0.wit | 97 +++++ openai/metadata.json | 8 +- openai/pkg/manifest.json | 15 +- openai/pkg/scripts.json | 12 - openai/router/Cargo.toml | 20 + openai/router/src/lib.rs | 400 +++++++++++++++++++ 9 files changed, 756 insertions(+), 41 deletions(-) create mode 100644 openai/api/llm_provider:nick1udwig.os-v0.wit delete mode 100644 openai/pkg/scripts.json create mode 100644 openai/router/Cargo.toml create mode 100644 openai/router/src/lib.rs diff --git a/.gitignore b/.gitignore index 7e45607..7e2a0f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ */target */*/target/ **/pkg/*.wasm +**/pkg/*.zip **/pkg/ui */*.swp */*.swo @@ -15,5 +16,4 @@ /target **/.DS_Store **/.vscode/ - - +*.swp diff --git a/Cargo.lock b/Cargo.lock index f9d8f42..e9f0457 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1123,7 +1123,29 @@ dependencies = [ "serde_json", "thiserror", "url 2.5.0", - "wit-bindgen", + "wit-bindgen 0.17.0", +] + +[[package]] +name = "kinode_process_lib" +version = "0.6.1" +source = "git+https://github.com/kinode-dao/process_lib?tag=v0.6.1#37a20b0249dc2c86ae6c2c69cfb199fb177f1520" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-types", + "alloy-transport", + "anyhow", + "bincode", + "http", + "mime_guess 2.0.4", + "rand 0.8.5", + "rmp-serde", + "serde", + "serde_json", + "thiserror", + "url 2.5.0", + "wit-bindgen 0.24.0", ] [[package]] @@ -1144,12 +1166,12 @@ version = "0.1.0" dependencies = [ "anyhow", "bincode", - "kinode_process_lib", + "kinode_process_lib 0.6.0", "llm_interface 0.1.0 (git+https://github.com/kinode-dao/llm/?branch=interface)", "multipart", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.17.0", ] [[package]] @@ -1391,12 +1413,12 @@ version = "0.1.0" dependencies = [ "anyhow", "bincode", - "kinode_process_lib", + "kinode_process_lib 0.6.0", "llm_interface 0.1.0 (git+https://github.com/kinode-dao/llm/?branch=hf/interface)", "multipart", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.17.0", ] [[package]] @@ -1635,7 +1657,7 @@ dependencies = [ "rand_isaac", "rand_jitter", "rand_os", - "rand_pcg", + "rand_pcg 0.1.2", "rand_xorshift 0.1.1", "winapi", ] @@ -1748,6 +1770,16 @@ dependencies = [ "rand_core 0.4.2", ] +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core 0.6.4", + "serde", +] + [[package]] name = "rand_xorshift" version = "0.1.1" @@ -1824,6 +1856,42 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "router" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "kinode_process_lib 0.6.1", + "rand 0.8.5", + "rand_pcg 0.3.1", + "serde", + "serde_json", + "wit-bindgen 0.24.0", +] + [[package]] name = "ruint" version = "1.12.1" @@ -2517,6 +2585,15 @@ dependencies = [ "leb128", ] +[[package]] +name = "wasm-encoder" +version = "0.202.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfd106365a7f5f7aa3c1916a98cbb3ad477f5ff96ddb130285a91c6e7429e67a" +dependencies = [ + "leb128", +] + [[package]] name = "wasm-metadata" version = "0.10.20" @@ -2529,8 +2606,24 @@ dependencies = [ "serde_derive", "serde_json", "spdx", - "wasm-encoder", - "wasmparser", + "wasm-encoder 0.41.2", + "wasmparser 0.121.2", +] + +[[package]] +name = "wasm-metadata" +version = "0.202.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "094aea3cb90e09f16ee25a4c0e324b3e8c934e7fd838bfa039aef5352f44a917" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.202.0", + "wasmparser 0.202.0", ] [[package]] @@ -2544,6 +2637,17 @@ dependencies = [ "semver 1.0.22", ] +[[package]] +name = "wasmparser" +version = "0.202.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6998515d3cf3f8b980ef7c11b29a9b1017d4cf86b99ae93b546992df9931413" +dependencies = [ + "bitflags 2.5.0", + "indexmap", + "semver 1.0.22", +] + [[package]] name = "web-sys" version = "0.3.69" @@ -2666,7 +2770,17 @@ version = "0.17.0" source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=21a46c7#21a46c774532da99384f7a1877c1fcfb7a4c72d3" dependencies = [ "bitflags 2.5.0", - "wit-bindgen-rust-macro", + "wit-bindgen-rust-macro 0.17.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb4e7653763780be47e38f479e9aa83c768aa6a3b2ed086dc2826fdbbb7e7f5" +dependencies = [ + "wit-bindgen-rt", + "wit-bindgen-rust-macro 0.24.0", ] [[package]] @@ -2675,8 +2789,27 @@ version = "0.17.0" source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=21a46c7#21a46c774532da99384f7a1877c1fcfb7a4c72d3" dependencies = [ "anyhow", - "wit-component", - "wit-parser", + "wit-component 0.20.3", + "wit-parser 0.13.2", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b67e11c950041849a10828c7600ea62a4077c01e8af72e8593253575428f91b" +dependencies = [ + "anyhow", + "wit-parser 0.202.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0780cf7046630ed70f689a098cd8d56c5c3b22f2a7379bbdb088879963ff96" +dependencies = [ + "bitflags 2.5.0", ] [[package]] @@ -2686,9 +2819,23 @@ source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=21a46c7#21a46c dependencies = [ "anyhow", "heck", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", + "wasm-metadata 0.10.20", + "wit-bindgen-core 0.17.0", + "wit-component 0.20.3", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30acbe8fb708c3a830a33c4cb705df82659bf831b492ec6ca1a17a369cfeeafb" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "wasm-metadata 0.202.0", + "wit-bindgen-core 0.24.0", + "wit-component 0.202.0", ] [[package]] @@ -2700,9 +2847,23 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.58", - "wit-bindgen-core", - "wit-bindgen-rust", - "wit-component", + "wit-bindgen-core 0.17.0", + "wit-bindgen-rust 0.17.0", + "wit-component 0.20.3", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b1b06eae85feaecdf9f2854f7cac124e00d5a6e5014bfb02eb1ecdeb5f265b9" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.58", + "wit-bindgen-core 0.24.0", + "wit-bindgen-rust 0.24.0", ] [[package]] @@ -2718,10 +2879,29 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", + "wasm-encoder 0.41.2", + "wasm-metadata 0.10.20", + "wasmparser 0.121.2", + "wit-parser 0.13.2", +] + +[[package]] +name = "wit-component" +version = "0.202.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c836b1fd9932de0431c1758d8be08212071b6bba0151f7bac826dbc4312a2a9" +dependencies = [ + "anyhow", + "bitflags 2.5.0", + "indexmap", + "log 0.4.21", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.202.0", + "wasm-metadata 0.202.0", + "wasmparser 0.202.0", + "wit-parser 0.202.0", ] [[package]] @@ -2741,6 +2921,24 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "wit-parser" +version = "0.202.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744237b488352f4f27bca05a10acb79474415951c450e52ebd0da784c1df2bcc" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log 0.4.21", + "semver 1.0.22", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.202.0", +] + [[package]] name = "wyz" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 910bfdb..32b9ca4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ resolver = "2" members = [ "lccp/lccp", "openai/openai", + "openai/router", ] [profile.release] diff --git a/openai/api/llm_provider:nick1udwig.os-v0.wit b/openai/api/llm_provider:nick1udwig.os-v0.wit new file mode 100644 index 0000000..e292c96 --- /dev/null +++ b/openai/api/llm_provider:nick1udwig.os-v0.wit @@ -0,0 +1,97 @@ +interface pkg { + type job-id = u64; + type model-name = string; + type error-message = string; + + /// client (external) sends to router + variant client-request { + run-job(run-job-request-params), + } + + /// client (external) receives from router + variant client-response { + run-job(result), + } + + /// driver sends to router + variant driver-request { + set-is-available(tuple), + /// job-update-request-blob in lazy-load-blob + job-update(job-update-request-params), + } + + /// driver receives from router + variant driver-response { + /// ack + set-is-available, + /// ack + job-update, + } + + /// router sends to driver + variant router-request { + run-job(tuple), + query-ready, + } + + /// router receives from driver + variant router-response { + run-job(result), + query-ready(bool), + } + + /// router sends to client (external) + variant router-client-request { + /// job-update-request-blob in lazy-load-blob + job-update(job-update-request-params), + } + + /// router receives from client (external) + variant router-client-response { + /// ack + job-update, + } + + record run-job-request-params { + model: string, + prompt: string, + seed: option, + } + + record job-update-request-params { + job-id: job-id, + is-final: bool, + signature: option, + } + + //record job-update-request-blob { + //} +} + +interface driver { + use pkg.{ + driver-request, + driver-response, + router-request, + router-response, + }; +} + +interface router { + use pkg.{ + client-request, + client-response, + driver-request, + driver-response, + router-request, + router-response, + run-job-request-params, + job-update-request-params, + }; +} + +world llm-provider-nick1udwig-dot-os-v0 { + import driver; + import router; + include process; +} diff --git a/openai/metadata.json b/openai/metadata.json index efec521..a79a707 100644 --- a/openai/metadata.json +++ b/openai/metadata.json @@ -1,11 +1,11 @@ { - "name": "OpenAI LLM", - "description": "OpenAI LLM api beindings", + "name": "OpenAI-API LLM Provider", + "description": "Expose a locally running LLM or use a remote one", "image": "", "properties": { - "package_name": "openai", + "package_name": "llm_provider", "current_version": "0.1.0", - "publisher": "appattacc.os", + "publisher": "nick1udwig.os", "mirrors": [], "code_hashes": { "0.1.0": "" diff --git a/openai/pkg/manifest.json b/openai/pkg/manifest.json index 7ec9191..f66fb7a 100644 --- a/openai/pkg/manifest.json +++ b/openai/pkg/manifest.json @@ -2,8 +2,8 @@ { "process_name": "openai", "process_wasm_path": "/openai.wasm", - "on_exit": "None", - "request_networking": true, + "on_exit": "Restart", + "request_networking": false, "request_capabilities": [ "http_client:distro:sys", "http_server:distro:sys" @@ -12,6 +12,17 @@ "http_client:distro:sys", "http_server:distro:sys" ], + "public": false + }, + { + "process_name": "router", + "process_wasm_path": "/router.wasm", + "on_exit": "Restart", + "request_networking": true, + "request_capabilities": [ + "http_server:distro:sys" + ], + "grant_capabilities": [], "public": true } ] diff --git a/openai/pkg/scripts.json b/openai/pkg/scripts.json deleted file mode 100644 index da4ecb8..0000000 --- a/openai/pkg/scripts.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "openai_tester.wasm": { - "root": false, - "public": false, - "request_networking": false, - "request_capabilities": [ - ], - "grant_capabilities": [ - "openai:llm:kinode" - ] - } -} diff --git a/openai/router/Cargo.toml b/openai/router/Cargo.toml new file mode 100644 index 0000000..f65a5d5 --- /dev/null +++ b/openai/router/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "router" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0" +bincode = "1.3.3" +kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" } +rand = "0.8" +rand_pcg = { version = "0.3", features = ["serde1"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +wit-bindgen = "0.24.0" + +[lib] +crate-type = ["cdylib"] + +[package.metadata.component] +package = "kinode:process" diff --git a/openai/router/src/lib.rs b/openai/router/src/lib.rs new file mode 100644 index 0000000..f9a4b4e --- /dev/null +++ b/openai/router/src/lib.rs @@ -0,0 +1,400 @@ +use std::collections::{HashMap, VecDeque}; + +use rand::{Rng, SeedableRng, prelude::SliceRandom}; +use rand_pcg::Pcg64; + +use crate::kinode::process::router::{ + ClientRequest, ClientResponse, + DriverRequest, DriverResponse, + RouterRequest, RouterResponse, + RunJobRequestParams, + JobUpdateRequestParams, + //JobUpdateRequestBlob, +}; +use kinode_process_lib::{await_message, call_init, get_typed_state, println, set_state, Address, ProcessId, Request, Response}; + +const DEFAULT_DRIVER_PROCESS_ID: &str = "driver:llm_provider:nick1udwig.os"; +const DEFAULT_QUEUE_RESPONSE_TIMEOUT_SECONDS: u8 = 5; +const DEFAULT_SERVE_TIMEOUT_SECONDS: u16 = 60; + +wit_bindgen::generate!({ + path: "target/wit", + world: "llm-provider-nick1udwig-dot-os-v0", + generate_unused_types: true, + additional_derives: [serde::Deserialize, serde::Serialize], +}); + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +enum Req { + ClientRequest(ClientRequest), + DriverRequest(DriverRequest), +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +enum Res { + RouterResponse(RouterResponse), +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +struct State { + driver_process_id: Option, + available_drivers: HashMap, // driver node to model + outstanding_jobs: HashMap, + job_queue: VecDeque<(Address, u64, RunJobRequestParams)>, + job_queries: HashMap, + rng: Pcg64, + pub queue_response_timeout_seconds: u8, + pub serve_timeout_seconds: u16, // TODO +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +struct JobQuery { + job: RunJobRequestParams, + num_rejections: u32, + num_queried: u32, +} + +impl Default for State { + fn default() -> Self { + Self { + driver_process_id: None, + available_drivers: HashMap::new(), + outstanding_jobs: HashMap::new(), + job_queue: VecDeque::new(), + job_queries: HashMap::new(), + rng: Pcg64::from_entropy(), + queue_response_timeout_seconds: DEFAULT_QUEUE_RESPONSE_TIMEOUT_SECONDS, + serve_timeout_seconds: DEFAULT_SERVE_TIMEOUT_SECONDS, + } + } +} + +impl State { + fn save(&self) -> anyhow::Result<()> { + set_state(&serde_json::to_vec(self)?); + Ok(()) + } + + fn load() -> Self { + get_typed_state(|bytes| Ok(serde_json::from_slice::(bytes)?)) + .unwrap_or_default() + } +} + +fn permute(mut vec: Vec, rng: &mut Pcg64) -> Vec { + vec.shuffle(rng); + vec +} + +fn serve_job( + driver: &Address, + job_source: &Address, + job_id: u64, + job: RunJobRequestParams, + state: &mut State, +) -> anyhow::Result<()> { + state.outstanding_jobs.insert( + driver.node().to_string(), + (job_source.clone(), job_id.clone()), + ); + Request::to(driver) + .body(serde_json::to_vec(&RouterRequest::RunJob((job_id, job)))?) + .inherit(true) + .expects_response(5) // TODO + .send()?; + state.save()?; + Ok(()) +} + +//fn handle_admin_request( +// our: &Address, +// message: &Message, +// state: &mut State, +//) -> anyhow::Result<()> { +// let source = message.source(); +// if source.node() != our.node() { +// return Err(anyhow::anyhow!("only our can make AdminRequests; rejecting from {source:?}")); +// } +// match serde_json::from_slice(message.body())? { +// AdminRequest::SetProviderProcess { process_id } => { +// let process_id = process_id.parse()?; +// state.provider_process = Some(process_id); +// state.save()?; +// Response::new() +// .body(serde_json::to_vec(&AdminResponse::SetProviderProcess { err: None })?) +// .send()?; +// } +// AdminRequest::SetRollupSequencer { address } => { +// let address = address.parse()?; +// state.rollup_sequencer = Some(address); +// await_chain_state(state)?; +// Response::new() +// .body(serde_json::to_vec(&AdminResponse::SetRollupSequencer { err: None })?) +// .send()?; +// } +// AdminRequest::SetContractAddress { address } => { +// state.contract_address = address; +// Response::new() +// .body(serde_json::to_vec(&AdminResponse::SetContractAddress { err: None })?) +// .send()?; +// } +// AdminRequest::CreateDao => { +// // TODO: +// // this belong on the FE, along with all other DAO-changing requests +// // so we can take advantage of already-existing wallet software +// //init_eth(our, eth_provider, filter, state).unwrap(); +// //Response::new() +// // .body(serde_json::to_vec(&AdminResponse::CreateDao { err: None })?) +// // .send()?; +// } +// AdminRequest::SetDaoId { dao_id } => { +// state.dao_id = dao_id; +// init_eth(our, eth_provider, filter, state).unwrap(); +// Response::new() +// .body(serde_json::to_vec(&AdminResponse::SetDaoId { err: None })?) +// .send()?; +// } +// } +// Ok(()) +//} + +fn handle_client_request( + _our: &Address, + source: &Address, + client_request: &ClientRequest, + state: &mut State, +) -> anyhow::Result<()> { + match client_request { + ClientRequest::RunJob(job) => { + let job_id: u64 = state.rng.gen(); + Response::new() + .body(serde_json::to_vec(&ClientResponse::RunJob(Ok(job_id.clone())))?) + .send()?; + let num_hosting_model: Vec<(String, String)> = state.available_drivers + .iter() + .filter_map(|(node, model)| { + if &job.model != model { + None + } else { + Some((node.clone(), model.clone())) + } + }) + .collect(); + if num_hosting_model.is_empty() { + // no available drivers -> add to queue + state.job_queue.push_back((source.clone(), job_id, job.clone())); + println!("new job added to queue; now have {} queued", state.job_queue.len()); + state.save()?; + return Ok(()); + } + // permute available drivers & flood all with query if ready; + // first gets job; if none ready, queue + // TODO: improve algo + let process_id: ProcessId = state.driver_process_id + .clone() + .unwrap_or_else(|| DEFAULT_DRIVER_PROCESS_ID.parse().unwrap()); + state.job_queries.insert(job_id, JobQuery { + job: job.clone(), + num_rejections: 0, + num_queried: num_hosting_model.len() as u32, + }); + for (member, model) in permute(num_hosting_model, &mut state.rng) { + if job.model != model { + continue; + } + let address = Address::new(member.clone(), process_id.clone()); + Request::to(address.clone()) + .body(serde_json::to_vec(&RouterRequest::QueryReady)?) + .context(serde_json::to_vec(&(source.clone(), job_id))?) + .expects_response(state.queue_response_timeout_seconds as u64) + .send()?; + } + } + } + Ok(()) +} + +fn handle_driver_request( + _our: &Address, + source: &Address, + driver_request: &DriverRequest, + state: &mut State, +) -> anyhow::Result<()> { + match driver_request { + DriverRequest::SetIsAvailable((is_available, model_name)) => { + if !is_available { + state.available_drivers.remove(source.node()); + state.save()?; + } else { + if !state.job_queue.is_empty() { + let (job_source, job_id, job) = state.job_queue.pop_front().unwrap(); + serve_job(source, &job_source, job_id, job, state)?; + } else { + state.available_drivers.insert(source.node().to_string(), model_name.clone()); + state.save()?; + } + } + Response::new() + .body(serde_json::to_vec(&DriverResponse::SetIsAvailable)?) + .send()?; + } + DriverRequest::JobUpdate(JobUpdateRequestParams { ref job_id, ref is_final, .. }) => { + let Some((job_source, expected_job_id)) = state.outstanding_jobs.get(source.node()) else { + return Err(anyhow::anyhow!("provider sent back {job_id} but no record here")); + }; + if job_id != expected_job_id { + println!("job_id != expected_job_id: this should never occur! provider gave us wrong job back"); + } + Request::to(job_source) + .body(serde_json::to_vec(driver_request)?) + //.body(message.body()) + .inherit(true) + .send()?; + // TODO: log sigs + if is_final == &true { + state.outstanding_jobs.remove(source.node()); + state.save()?; + } + Response::new() + .body(serde_json::to_vec(&DriverResponse::JobUpdate)?) + .send()?; + } + } + Ok(()) +} + +fn handle_router_response( + _our: &Address, + source: &Address, + context: &[u8], + router_response: &RouterResponse, + state: &mut State, +) -> anyhow::Result<()> { + match router_response { + RouterResponse::RunJob(_result) => { + // TODO: pass on errors to client? + } + RouterResponse::QueryReady(is_ready) => { + // compare to handle_message() send_err case + let (job_source, job_id): (Address, u64) = serde_json::from_slice(context)?; + // message.context().unwrap_or_default() + //)?; + let Some(mut job_query) = state.job_queries.remove(&job_id) else { + // TODO: readd JobTaken again? + //Request::to(message.source()) + // .body(serde_json::to_vec(&MemberRequest::JobTaken { job_id })?) + // .send()?; + //state.save()?; + return Ok(()); + }; + if !is_ready { + // TODO: reprimand fake ready member? + job_query.num_rejections += 1; + if job_query.num_rejections >= job_query.num_queried { + // no one available to serve job + // TODO: add stat trackers so we can expose endpoints: + // * how long queue is + // * average time / job + // -> expected time till result + state.job_queue.push_back((job_source, job_id.clone(), job_query.job)); + println!("no ready providers; now have {} queued", state.job_queue.len()); + state.save()?; + return Ok(()); + } + state.job_queries.insert(job_id, job_query); + state.save()?; + return Ok(()); + } + serve_job(source, &job_source, job_id, job_query.job, state)?; + } + } + Ok(()) +} + +//fn handle_sequencer_response(state: &mut State) -> anyhow::Result<()> { +// let Some(LazyLoadBlob { ref bytes, .. }) = get_blob() else { +// return Err(anyhow::anyhow!("fetch_chain_state didn't get back blob")); +// }; +// let Ok(SequencerResponse::Read(ReadResponse::All(new_dao_state))) = serde_json::from_slice(bytes) else { +// return Err(anyhow::anyhow!("fetch_chain_state got wrong Response back")); +// }; +// state.on_chain_state = new_dao_state.clone(); +// state.save()?; +// Ok(()) +//} + +fn handle_message( + our: &Address, + state: &mut State, +) -> anyhow::Result<()> { + let message = match await_message() { + Ok(m) => m, + Err(send_err) => { + //println!("SendError\nkind: {:?}\nbody: {:?}", send_err.kind(), serde_json::from_slice::(send_err.message().body())); + // compare to handle_member_response() MemberResponse::QueryReady case + let (source, job_id): (Address, u64) = serde_json::from_slice( + send_err.context().unwrap_or_default() + )?; + let Some(mut job_query) = state.job_queries.remove(&job_id) else { + // provider is offline, so don't inform them + return Ok(()); + }; + job_query.num_rejections += 1; + if job_query.num_rejections >= job_query.num_queried { + // no one available to serve job + // TODO: add stat trackers so we can expose endpoints: + // * how long queue is + // * average time / job + // -> expected time till result + state.job_queue.push_back((source, job_id, job_query.job)); + println!("no ready drivers; now have {} queued", state.job_queue.len()); + state.save()?; + return Ok(()); + } + state.job_queries.insert(job_id, job_query); + state.save()?; + return Ok(()); + } + }; + + if message.is_request() { + return match serde_json::from_slice(message.body())? { + Req::ClientRequest(ref client_request) => handle_client_request( + our, + message.source(), + client_request, + state, + ), + Req::DriverRequest(ref driver_request) => handle_driver_request( + our, + message.source(), + driver_request, + state, + ), + }; + } + + match serde_json::from_slice(message.body())? { + Res::RouterResponse(ref router_response) => handle_router_response( + our, + message.source(), + message.context().unwrap_or_default(), + router_response, + state, + ), + } +} + +call_init!(init); +fn init(our: Address) { + println!("begin"); + + let mut state = State::load(); + + loop { + match handle_message(&our, &mut state) { + Ok(()) => {}, + Err(e) => println!("{}: error: {:?}", our.process(), e), + }; + } +} From 4dbd0c8deb6ec5c80c018334f284ccd8f93e0ae9 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Mon, 20 May 2024 17:09:33 -0700 Subject: [PATCH 02/12] use macro for improved devex --- Cargo.lock | 48 ++++++++++++++++++++++++---------------- openai/router/Cargo.toml | 1 + openai/router/src/lib.rs | 42 +++++++++++++---------------------- 3 files changed, 45 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e9f0457..de78319 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,7 +78,7 @@ checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -276,7 +276,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -561,7 +561,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -572,7 +572,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -614,7 +614,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -624,7 +624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -796,7 +796,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -1532,7 +1532,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -1595,13 +1595,22 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] +[[package]] +name = "process_macros" +version = "0.1.0" +source = "git+https://github.com/kinode-dao/process_macros?rev=626e501#626e501d351e3365480ec6f770d474ed4ae339bf" +dependencies = [ + "quote", + "syn 2.0.65", +] + [[package]] name = "proptest" version = "1.4.0" @@ -1885,6 +1894,7 @@ dependencies = [ "anyhow", "bincode", "kinode_process_lib 0.6.1", + "process_macros", "rand 0.8.5", "rand_pcg 0.3.1", "serde", @@ -2044,7 +2054,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -2160,9 +2170,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -2204,7 +2214,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -2531,7 +2541,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", "wasm-bindgen-shared", ] @@ -2565,7 +2575,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2846,7 +2856,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", "wit-bindgen-core 0.17.0", "wit-bindgen-rust 0.17.0", "wit-component 0.20.3", @@ -2861,7 +2871,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", "wit-bindgen-core 0.24.0", "wit-bindgen-rust 0.24.0", ] @@ -2965,5 +2975,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] diff --git a/openai/router/Cargo.toml b/openai/router/Cargo.toml index f65a5d5..1dc5584 100644 --- a/openai/router/Cargo.toml +++ b/openai/router/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" anyhow = "1.0" bincode = "1.3.3" kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" } +process_macros = { git = "https://github.com/kinode-dao/process_macros", rev = "626e501" } rand = "0.8" rand_pcg = { version = "0.3", features = ["serde1"] } serde = { version = "1.0", features = ["derive"] } diff --git a/openai/router/src/lib.rs b/openai/router/src/lib.rs index f9a4b4e..314eafb 100644 --- a/openai/router/src/lib.rs +++ b/openai/router/src/lib.rs @@ -13,6 +13,7 @@ use crate::kinode::process::router::{ }; use kinode_process_lib::{await_message, call_init, get_typed_state, println, set_state, Address, ProcessId, Request, Response}; + const DEFAULT_DRIVER_PROCESS_ID: &str = "driver:llm_provider:nick1udwig.os"; const DEFAULT_QUEUE_RESPONSE_TIMEOUT_SECONDS: u8 = 5; const DEFAULT_SERVE_TIMEOUT_SECONDS: u16 = 60; @@ -21,21 +22,21 @@ wit_bindgen::generate!({ path: "target/wit", world: "llm-provider-nick1udwig-dot-os-v0", generate_unused_types: true, - additional_derives: [serde::Deserialize, serde::Serialize], + additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], }); -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] enum Req { ClientRequest(ClientRequest), DriverRequest(DriverRequest), } -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] enum Res { RouterResponse(RouterResponse), } -#[derive(Debug, serde::Serialize, serde::Deserialize)] +#[derive(Debug, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] struct State { driver_process_id: Option, available_drivers: HashMap, // driver node to model @@ -47,7 +48,7 @@ struct State { pub serve_timeout_seconds: u16, // TODO } -#[derive(Debug, serde::Serialize, serde::Deserialize)] +#[derive(Debug, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] struct JobQuery { job: RunJobRequestParams, num_rejections: u32, @@ -76,7 +77,7 @@ impl State { } fn load() -> Self { - get_typed_state(|bytes| Ok(serde_json::from_slice::(bytes)?)) + get_typed_state(|bytes| Ok(bytes.try_into()?)) .unwrap_or_default() } } @@ -98,7 +99,7 @@ fn serve_job( (job_source.clone(), job_id.clone()), ); Request::to(driver) - .body(serde_json::to_vec(&RouterRequest::RunJob((job_id, job)))?) + .body(RouterRequest::RunJob((job_id, job))) .inherit(true) .expects_response(5) // TODO .send()?; @@ -168,7 +169,7 @@ fn handle_client_request( ClientRequest::RunJob(job) => { let job_id: u64 = state.rng.gen(); Response::new() - .body(serde_json::to_vec(&ClientResponse::RunJob(Ok(job_id.clone())))?) + .body(ClientResponse::RunJob(Ok(job_id.clone()))) .send()?; let num_hosting_model: Vec<(String, String)> = state.available_drivers .iter() @@ -204,7 +205,7 @@ fn handle_client_request( } let address = Address::new(member.clone(), process_id.clone()); Request::to(address.clone()) - .body(serde_json::to_vec(&RouterRequest::QueryReady)?) + .body(RouterRequest::QueryReady) .context(serde_json::to_vec(&(source.clone(), job_id))?) .expects_response(state.queue_response_timeout_seconds as u64) .send()?; @@ -235,7 +236,7 @@ fn handle_driver_request( } } Response::new() - .body(serde_json::to_vec(&DriverResponse::SetIsAvailable)?) + .body(DriverResponse::SetIsAvailable) .send()?; } DriverRequest::JobUpdate(JobUpdateRequestParams { ref job_id, ref is_final, .. }) => { @@ -246,8 +247,7 @@ fn handle_driver_request( println!("job_id != expected_job_id: this should never occur! provider gave us wrong job back"); } Request::to(job_source) - .body(serde_json::to_vec(driver_request)?) - //.body(message.body()) + .body(driver_request) .inherit(true) .send()?; // TODO: log sigs @@ -256,7 +256,7 @@ fn handle_driver_request( state.save()?; } Response::new() - .body(serde_json::to_vec(&DriverResponse::JobUpdate)?) + .body(DriverResponse::JobUpdate) .send()?; } } @@ -311,18 +311,6 @@ fn handle_router_response( Ok(()) } -//fn handle_sequencer_response(state: &mut State) -> anyhow::Result<()> { -// let Some(LazyLoadBlob { ref bytes, .. }) = get_blob() else { -// return Err(anyhow::anyhow!("fetch_chain_state didn't get back blob")); -// }; -// let Ok(SequencerResponse::Read(ReadResponse::All(new_dao_state))) = serde_json::from_slice(bytes) else { -// return Err(anyhow::anyhow!("fetch_chain_state got wrong Response back")); -// }; -// state.on_chain_state = new_dao_state.clone(); -// state.save()?; -// Ok(()) -//} - fn handle_message( our: &Address, state: &mut State, @@ -358,7 +346,7 @@ fn handle_message( }; if message.is_request() { - return match serde_json::from_slice(message.body())? { + return match message.body().try_into()? { Req::ClientRequest(ref client_request) => handle_client_request( our, message.source(), @@ -374,7 +362,7 @@ fn handle_message( }; } - match serde_json::from_slice(message.body())? { + match message.body().try_into()? { Res::RouterResponse(ref router_response) => handle_router_response( our, message.source(), From c26c1dc4916430f485aae723eb1eddc64e9aa728 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Wed, 22 May 2024 21:29:31 -0700 Subject: [PATCH 03/12] get it working --- Cargo.lock | 64 +++ Cargo.toml | 3 + openai/admin/Cargo.toml | 18 + openai/admin/src/lib.rs | 60 +++ openai/api/llm_provider:nick1udwig.os-v0.wit | 58 ++- openai/driver/Cargo.toml | 26 ++ openai/driver/src/lib.rs | 404 +++++++++++++++++++ openai/pkg/manifest.json | 6 +- openai/pkg/scripts.json | 26 ++ openai/router/src/lib.rs | 43 +- openai/run_job/Cargo.toml | 18 + openai/run_job/src/lib.rs | 63 +++ 12 files changed, 774 insertions(+), 15 deletions(-) create mode 100644 openai/admin/Cargo.toml create mode 100644 openai/admin/src/lib.rs create mode 100644 openai/driver/Cargo.toml create mode 100644 openai/driver/src/lib.rs create mode 100644 openai/pkg/scripts.json create mode 100644 openai/run_job/Cargo.toml create mode 100644 openai/run_job/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index de78319..6960713 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,18 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "admin" +version = "0.1.0" +dependencies = [ + "anyhow", + "kinode_process_lib 0.6.1", + "process_macros", + "serde", + "serde_json", + "wit-bindgen 0.24.0", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -661,6 +673,26 @@ dependencies = [ "subtle", ] +[[package]] +name = "driver" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "kinode_process_lib 0.6.1", + "llm_interface 0.1.0 (git+https://github.com/kinode-dao/llm/?branch=hf/interface)", + "process_macros", + "rand 0.8.5", + "rand_pcg 0.3.1", + "serde", + "serde_json", + "serde_qs", + "thiserror", + "url 2.5.0", + "uuid", + "wit-bindgen 0.24.0", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -1932,6 +1964,18 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" +[[package]] +name = "run_job" +version = "0.1.0" +dependencies = [ + "anyhow", + "kinode_process_lib 0.6.1", + "process_macros", + "serde", + "serde_json", + "wit-bindgen 0.24.0", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2068,6 +2112,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_qs" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6" +dependencies = [ + "percent-encoding 2.3.1", + "serde", + "thiserror", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2481,6 +2536,15 @@ dependencies = [ "percent-encoding 2.3.1", ] +[[package]] +name = "uuid" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +dependencies = [ + "getrandom", +] + [[package]] name = "valuable" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 32b9ca4..4749eb0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,8 +2,11 @@ resolver = "2" members = [ "lccp/lccp", + "openai/admin", + "openai/driver", "openai/openai", "openai/router", + "openai/run_job", ] [profile.release] diff --git a/openai/admin/Cargo.toml b/openai/admin/Cargo.toml new file mode 100644 index 0000000..f464b82 --- /dev/null +++ b/openai/admin/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "admin" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0" +kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" } +process_macros = { git = "https://github.com/kinode-dao/process_macros", rev = "626e501" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +wit-bindgen = "0.24.0" + +[lib] +crate-type = ["cdylib"] + +[package.metadata.component] +package = "kinode:process" diff --git a/openai/admin/src/lib.rs b/openai/admin/src/lib.rs new file mode 100644 index 0000000..dd205e5 --- /dev/null +++ b/openai/admin/src/lib.rs @@ -0,0 +1,60 @@ +use crate::kinode::process::admin::AdminRequest; +use crate::kinode::process::driver::{AdminRequest as DriverAdminRequest}; +use kinode_process_lib::{ + await_next_message_body, call_init, our_capabilities, println, spawn, Address, OnExit, Request, +}; + +const PUBLISHER: &str = "nick1udwig.os"; +//const PROCESS_NAME: &str = "driver"; +const SCRIPT_NAME: &str = "admin"; +const ROUTER_PATH: &str = "llm_provider:nick1udwig.os/pkg/router.wasm"; + +wit_bindgen::generate!({ + path: "target/wit", + world: "llm-provider-nick1udwig-dot-os-v0", + generate_unused_types: true, + additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], +}); + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] +#[serde(untagged)] +enum Req { + AdminRequest(AdminRequest), + DriverAdminRequest(DriverAdminRequest), +} + +call_init!(init); +fn init(our: Address) { + let Ok(ref body) = await_next_message_body() else { + println!("failed to get args!"); + return; + }; + let package_name = our.package(); + + match body.clone().try_into() { + Ok(Req::AdminRequest(AdminRequest::StartRouter)) => { + let our_caps = our_capabilities(); + spawn( + Some("router"), + ROUTER_PATH, + OnExit::Restart, + our_caps, + vec![], + false, + ).unwrap(); + } + Ok(Req::DriverAdminRequest(DriverAdminRequest::SetLocalDriver(_))) => { + let driver_process: Address = format!("our@driver:{}", our.package_id()) + .parse() + .unwrap(); + Request::to(driver_process) + .body(body.clone()) + .send() + .unwrap(); + } + Err(_) => { + println!("usage:\n{SCRIPT_NAME}:{package_name}:{PUBLISHER} admin_action\ne.g.\n{SCRIPT_NAME}:{package_name}:{PUBLISHER} \"StartRouter\""); + return; + } + } +} diff --git a/openai/api/llm_provider:nick1udwig.os-v0.wit b/openai/api/llm_provider:nick1udwig.os-v0.wit index e292c96..513bd1f 100644 --- a/openai/api/llm_provider:nick1udwig.os-v0.wit +++ b/openai/api/llm_provider:nick1udwig.os-v0.wit @@ -3,29 +3,30 @@ interface pkg { type model-name = string; type error-message = string; - /// client (external) sends to router + /// client (external) sends to local driver. + /// local driver serves if connected to local llm, + /// else forwards to router. + /// router receives from driver. variant client-request { run-job(run-job-request-params), } - /// client (external) receives from router + /// client (external) receives from local driver. + /// client (external) receives from router. variant client-response { run-job(result), } /// driver sends to router variant driver-request { + // TODO: use local-driver set-is-available(tuple), - /// job-update-request-blob in lazy-load-blob - job-update(job-update-request-params), } /// driver receives from router variant driver-response { /// ack set-is-available, - /// ack - job-update, } /// router sends to driver @@ -40,14 +41,21 @@ interface pkg { query-ready(bool), } + /// local driver sends to client (external). + /// driver sends to router. /// router sends to client (external) - variant router-client-request { + // TODO: should we skip the router in the driver -> router -> client chain? + // pro: less bucket brigading + // con: router never notified about job completion + variant to-client-request { /// job-update-request-blob in lazy-load-blob job-update(job-update-request-params), } + /// local driver receives from client (external). + /// driver receives from router. /// router receives from client (external) - variant router-client-response { + variant to-client-response { /// ack job-update, } @@ -68,12 +76,42 @@ interface pkg { //} } +interface admin { + variant admin-request { + start-router, + } + + variant admin-response { + start-router, + } +} + interface driver { + variant admin-request { + set-local-driver(local-driver) + } + + variant admin-response { + set-provider + } + + record local-driver { + model: string, + is-public: bool, + } + use pkg.{ + client-request, + client-response, driver-request, driver-response, router-request, router-response, + to-client-request, + to-client-response, + run-job-request-params, + job-update-request-params, + //job-update-request-blob, }; } @@ -85,12 +123,16 @@ interface router { driver-response, router-request, router-response, + to-client-request, + to-client-response, run-job-request-params, job-update-request-params, + //job-update-request-blob, }; } world llm-provider-nick1udwig-dot-os-v0 { + import admin; import driver; import router; include process; diff --git a/openai/driver/Cargo.toml b/openai/driver/Cargo.toml new file mode 100644 index 0000000..31f52de --- /dev/null +++ b/openai/driver/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "driver" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0" +bincode = "1.3.3" +kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" } +llm_interface = { git = "https://github.com/kinode-dao/llm/", branch = "hf/interface" } +process_macros = { git = "https://github.com/kinode-dao/process_macros", rev = "626e501" } +rand = "0.8" +rand_pcg = { version = "0.3", features = ["serde1"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +serde_qs = "0.13" +thiserror = "1" +url = "2" +uuid = { version = "1", features = ["v4"] } +wit-bindgen = "0.24.0" + +[lib] +crate-type = ["cdylib"] + +[package.metadata.component] +package = "kinode:process" diff --git a/openai/driver/src/lib.rs b/openai/driver/src/lib.rs new file mode 100644 index 0000000..417483d --- /dev/null +++ b/openai/driver/src/lib.rs @@ -0,0 +1,404 @@ +use crate::kinode::process::driver::{ + AdminRequest, AdminResponse, + ClientRequest, + DriverRequest, DriverResponse, + LocalDriver, + RouterRequest, RouterResponse, + ToClientRequest, ToClientResponse, + RunJobRequestParams, + JobUpdateRequestParams, + //JobUpdateRequestBlob, +}; +use kinode_process_lib::{ + await_message, call_init, get_typed_state, println, set_state, + Address, ProcessId, Request, Response, +}; +use llm_interface::openai::{ChatRequestBuilder, ChatResponse, LLMRequest, LLMResponse, Message as LLMMessage}; + +const DEFAULT_ROUTER_PROCESS_ID: &str = "router:llm_provider:nick1udwig.os"; +const DEFAULT_ROUTER_NODE: &str = "fake.dev"; // NOTE: this should be changed +//const DEFAULT_ROUTER_NODE: &str = "nick1udwig.os"; // NOTE: this should be changed +const DEFAULT_TIMEOUT_SECONDS: u64 = 60; + +wit_bindgen::generate!({ + path: "target/wit", + world: "llm-provider-nick1udwig-dot-os-v0", + generate_unused_types: true, + additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], +}); + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] +#[serde(untagged)] +enum Req { + AdminRequest(AdminRequest), + ClientRequest(ClientRequest), + RouterRequest(RouterRequest), + ToClientRequest(ToClientRequest), +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] +#[serde(untagged)] +enum Res { + DriverResponse(DriverResponse), + ToClientResponse(ToClientResponse), +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] +struct State { + router_process_id: Option, + router_node: Option, + local_driver: Option, + outstanding_job: Option +} + +impl Default for State { + fn default() -> Self { + Self { + router_process_id: None, + router_node: None, + local_driver: None, + outstanding_job: None, + } + } +} + +impl State { + fn save(&self) -> anyhow::Result<()> { + set_state(&serde_json::to_vec(self)?); + Ok(()) + } + + fn load() -> Self { + get_typed_state(|bytes| Ok(bytes.try_into()?)) + .unwrap_or_default() + } +} + +fn extract_chat_response_message(chat_response: &ChatResponse) -> anyhow::Result { + if chat_response.choices.len() != 1 { + return Err(anyhow::anyhow!("unexpected form of ChatResponse: {chat_response:?}")); + } + Ok(chat_response.choices[0].message.content.clone()) +} + +fn send_to_sidecar( + our: &Address, + job: &RunJobRequestParams, + timeout: Option, +) -> anyhow::Result { + let llm_process: Address = format!("{}@openai:{}", our.node(), our.package_id()).parse()?; + let mut chat_request = ChatRequestBuilder::default(); + chat_request + .model(job.model.clone()) + .messages(vec![LLMMessage { + role: "user".into(), + content: job.prompt.clone(), + }]); + if let Some(seed) = job.seed { + chat_request.seed(Some(seed as i32)); + }; + let chat_request = chat_request.build()?; + let chat_response = Request::to(llm_process) + .body(serde_json::to_vec(&LLMRequest::OaiProviderChat(chat_request))?) + .send_and_await_response(timeout.unwrap_or_else(|| DEFAULT_TIMEOUT_SECONDS))??; + let LLMResponse::Chat(chat_response) = serde_json::from_slice(chat_response.body())? else { + return Err(anyhow::anyhow!("unexpected chat response: {chat_response:?}")); + }; + let chat_response_message = extract_chat_response_message(&chat_response)?; + return Ok(chat_response_message); +} + +fn run_local_job( + our: &Address, + source: &Address, + job: &RunJobRequestParams, + timeout: Option, + state: &mut State, +) -> anyhow::Result<()> { + if source.node() != our.node() { + return Err(anyhow::anyhow!( + "rejecting local ClientRequest from {}; must be from our", + source.node(), + )); + } + + if let Some(ref local_driver) = state.local_driver { + println!("serving locally: {}", local_driver.model); + Response::new() + .body(RouterResponse::RunJob(Ok(0))) + .send()?; + let chat_response_message = send_to_sidecar(our, job, timeout)?; + Request::to(source) + .body(ToClientRequest::JobUpdate(JobUpdateRequestParams { + job_id: 0, + is_final: true, + signature: None, // TODO + })) + .blob_bytes(chat_response_message) + .expects_response(5) // TODO + .send()?; + } else { + // serve by passing Request to router + let router: Address = format!( + "{}@{}", + state.router_node.clone().unwrap_or_else(|| DEFAULT_ROUTER_NODE.to_string()), + state.router_process_id.clone().unwrap_or_else(|| DEFAULT_ROUTER_PROCESS_ID.parse().unwrap()), + ).parse()?; + println!("serving via router: {}", router); + Response::new() + .body(RouterResponse::RunJob(Ok(0))) + .send()?; + Request::to(router) + .body(ClientRequest::RunJob(job.clone())) + .send()?; + state.outstanding_job = Some(source.process.clone()); + } + + Ok(()) +} + +fn set_is_available(is_available: bool, state: &mut State) -> anyhow::Result<()> { + let Some(ref local_driver) = state.local_driver else { + return Err(anyhow::anyhow!("LocalDriver must be set before availability can be set")); + }; + let router: Address = format!( + "{}@{}", + state.router_node + .clone() + .unwrap_or_else(|| DEFAULT_ROUTER_NODE.to_string()), + state.router_process_id + .clone() + .unwrap_or_else(|| DEFAULT_ROUTER_PROCESS_ID.parse().unwrap()), + ).parse()?; + Request::to(router) + .body(DriverRequest::SetIsAvailable(( + is_available, + local_driver.model.clone(), + ))) + .send()?; + Ok(()) +} + +fn run_job( + our: &Address, + source: &Address, + job_id: &u64, + job: &RunJobRequestParams, + timeout: Option, + state: &mut State, +) -> anyhow::Result<()> { + let router_node = state.router_node + .clone() + .unwrap_or_else(|| DEFAULT_ROUTER_NODE.into()); + + if source.node() != router_node { + let err = format!( + "rejecting RouterRequest from {}; must be from router {}", + source.node(), + router_node, + ); + Response::new() + .body(RouterResponse::RunJob(Err(err.clone()))) + .send()?; + return Err(anyhow::anyhow!(err)); + } + if !state.local_driver.as_ref().is_some_and(|ld| ld.is_public) { + let err = "got request from router, but not public"; + Response::new() + .body(RouterResponse::RunJob(Err(err.to_string()))) + .send()?; + return Err(anyhow::anyhow!(err)); + } + let Some(ref local_driver) = state.local_driver else { + // deny Request: cannot serve it + let err = "got request from router, but don't have a local llm"; + Response::new() + .body(RouterResponse::RunJob(Err(err.to_string()))) + .send()?; + return Err(anyhow::anyhow!(err)); + }; + + Response::new() + .body(RouterResponse::RunJob(Ok(0))) + .send()?; + let chat_response_message = send_to_sidecar(our, job, timeout)?; + Request::to(source) + .body(ToClientRequest::JobUpdate(JobUpdateRequestParams { + job_id: job_id.clone(), + is_final: true, + signature: None, // TODO + })) + .blob_bytes(chat_response_message) + .expects_response(5) // TODO + .send()?; + + state.outstanding_job = None; + if state.local_driver.as_ref().is_some_and(|ld| ld.is_public) { + println!("setting ready again"); + set_is_available(true, state)? + } + + Ok(()) +} + +fn handle_admin_request( + our: &Address, + source: &Address, + admin_request: &AdminRequest, + state: &mut State, +) -> anyhow::Result<()> { + if source.node() != our.node() { + return Err(anyhow::anyhow!( + "rejecting AdminRequest from {}; must be from our", + source.node(), + )); + } + match admin_request { + AdminRequest::SetLocalDriver(ref local_driver) => { + state.local_driver = Some(local_driver.clone()); + if local_driver.is_public { + set_is_available(true, state)? + } + } + } + Ok(()) +} + +fn handle_client_request( + our: &Address, + source: &Address, + client_request: &ClientRequest, + state: &mut State, +) -> anyhow::Result<()> { + match client_request { + ClientRequest::RunJob(ref job) => { + run_local_job(our, source, job, None, state)?; + } + } + Ok(()) +} + +fn handle_router_request( + our: &Address, + source: &Address, + router_request: &RouterRequest, + state: &mut State, +) -> anyhow::Result<()> { + match router_request { + RouterRequest::RunJob((ref job_id, ref job)) => { + run_job(our, source, job_id, job, None, state)?; + } + RouterRequest::QueryReady => { + Response::new() + .body(RouterResponse::QueryReady( + state.local_driver.as_ref().is_some_and(|ld| ld.is_public) + && state.outstanding_job.as_ref().is_none() + )) + .send()?; + } + } + Ok(()) +} + +fn handle_to_client_request( + to_client_request: &ToClientRequest, + state: &mut State, +) -> anyhow::Result<()> { + match to_client_request { + ToClientRequest::JobUpdate(job_update) => { + let Some(ref requestor) = state.outstanding_job else { + return Err(anyhow::anyhow!("no outstanding job for {job_update:?}; dropping")); + }; + let requestor: Address = format!("our@{requestor}").parse()?; + Request::to(requestor) + .body(to_client_request) + .inherit(true) + .send()?; + state.outstanding_job = None; + if state.local_driver.as_ref().is_some_and(|ld| ld.is_public) { + println!("setting ready again"); + set_is_available(true, state)? + } + } + } + Ok(()) +} + +fn handle_driver_response( + driver_response: &DriverResponse, + state: &mut State, +) -> anyhow::Result<()> { + match driver_response { + DriverResponse::SetIsAvailable => {} + } + Ok(()) +} + +fn handle_to_client_response( + to_client_response: &ToClientResponse, + state: &mut State, +) -> anyhow::Result<()> { + match to_client_response { + ToClientResponse::JobUpdate => {} + } + Ok(()) +} + +fn handle_message( + our: &Address, + state: &mut State, +) -> anyhow::Result<()> { + let message = await_message()?; + + if message.is_request() { + return match message.body().try_into()? { + Req::AdminRequest(ref admin_request) => handle_admin_request( + our, + message.source(), + admin_request, + state, + ), + Req::ClientRequest(ref client_request) => handle_client_request( + our, + message.source(), + client_request, + state, + ), + Req::RouterRequest(ref router_request) => handle_router_request( + our, + message.source(), + router_request, + state, + ), + Req::ToClientRequest(ref to_client_request) => handle_to_client_request( + to_client_request, + state, + ), + }; + } + + match message.body().try_into()? { + Res::DriverResponse(ref driver_response) => handle_driver_response( + driver_response, + state, + ), + Res::ToClientResponse(ref to_client_response) => handle_to_client_response( + to_client_response, + state, + ), + } +} + +call_init!(init); +fn init(our: Address) { + println!("{}: begin", our.process()); + + let mut state = State::load(); + + loop { + match handle_message(&our, &mut state) { + Ok(()) => {}, + Err(e) => println!("{}: error: {:?}", our.process(), e), + }; + } +} diff --git a/openai/pkg/manifest.json b/openai/pkg/manifest.json index f66fb7a..6088ed3 100644 --- a/openai/pkg/manifest.json +++ b/openai/pkg/manifest.json @@ -12,11 +12,11 @@ "http_client:distro:sys", "http_server:distro:sys" ], - "public": false + "public": true }, { - "process_name": "router", - "process_wasm_path": "/router.wasm", + "process_name": "driver", + "process_wasm_path": "/driver.wasm", "on_exit": "Restart", "request_networking": true, "request_capabilities": [ diff --git a/openai/pkg/scripts.json b/openai/pkg/scripts.json new file mode 100644 index 0000000..5034659 --- /dev/null +++ b/openai/pkg/scripts.json @@ -0,0 +1,26 @@ +{ + "admin.wasm": { + "root": false, + "public": false, + "request_networking": true, + "request_capabilities": [ + "driver:llm_provider:nick1udwig.os", + "vfs:distro:sys" + ], + "grant_capabilities": [ + "driver:llm_provider:nick1udwig.os", + "vfs:distro:sys" + ] + }, + "run_job.wasm": { + "root": false, + "public": false, + "request_networking": false, + "request_capabilities": [ + "driver:llm_provider:nick1udwig.os" + ], + "grant_capabilities": [ + "driver:llm_provider:nick1udwig.os" + ] + } +} diff --git a/openai/router/src/lib.rs b/openai/router/src/lib.rs index 314eafb..6248018 100644 --- a/openai/router/src/lib.rs +++ b/openai/router/src/lib.rs @@ -7,6 +7,7 @@ use crate::kinode::process::router::{ ClientRequest, ClientResponse, DriverRequest, DriverResponse, RouterRequest, RouterResponse, + ToClientRequest, ToClientResponse, RunJobRequestParams, JobUpdateRequestParams, //JobUpdateRequestBlob, @@ -26,14 +27,18 @@ wit_bindgen::generate!({ }); #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] +#[serde(untagged)] enum Req { ClientRequest(ClientRequest), DriverRequest(DriverRequest), + ToClientRequest(ToClientRequest), } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] +#[serde(untagged)] enum Res { RouterResponse(RouterResponse), + ToClientResponse(ToClientResponse), } #[derive(Debug, serde::Serialize, serde::Deserialize, process_macros::SerdeJsonInto)] @@ -239,7 +244,17 @@ fn handle_driver_request( .body(DriverResponse::SetIsAvailable) .send()?; } - DriverRequest::JobUpdate(JobUpdateRequestParams { ref job_id, ref is_final, .. }) => { + } + Ok(()) +} + +fn handle_to_client_request( + source: &Address, + to_client_request: &ToClientRequest, + state: &mut State, +) -> anyhow::Result<()> { + match to_client_request { + ToClientRequest::JobUpdate(JobUpdateRequestParams { ref job_id, ref is_final, .. }) => { let Some((job_source, expected_job_id)) = state.outstanding_jobs.get(source.node()) else { return Err(anyhow::anyhow!("provider sent back {job_id} but no record here")); }; @@ -247,7 +262,7 @@ fn handle_driver_request( println!("job_id != expected_job_id: this should never occur! provider gave us wrong job back"); } Request::to(job_source) - .body(driver_request) + .body(to_client_request) .inherit(true) .send()?; // TODO: log sigs @@ -256,7 +271,7 @@ fn handle_driver_request( state.save()?; } Response::new() - .body(DriverResponse::JobUpdate) + .body(ToClientResponse::JobUpdate) .send()?; } } @@ -285,10 +300,12 @@ fn handle_router_response( // .body(serde_json::to_vec(&MemberRequest::JobTaken { job_id })?) // .send()?; //state.save()?; + println!("{source} didnt find job_query for {job_id}"); return Ok(()); }; if !is_ready { // TODO: reprimand fake ready member? + println!("{source} not ready"); job_query.num_rejections += 1; if job_query.num_rejections >= job_query.num_queried { // no one available to serve job @@ -305,12 +322,22 @@ fn handle_router_response( state.save()?; return Ok(()); } + println!("{source} accepts job"); serve_job(source, &job_source, job_id, job_query.job, state)?; } } Ok(()) } +fn handle_to_client_response( + to_client_response: &ToClientResponse, +) -> anyhow::Result<()> { + match to_client_response { + ToClientResponse::JobUpdate => {} + } + Ok(()) +} + fn handle_message( our: &Address, state: &mut State, @@ -359,6 +386,11 @@ fn handle_message( driver_request, state, ), + Req::ToClientRequest(ref to_client_request) => handle_to_client_request( + message.source(), + to_client_request, + state, + ), }; } @@ -370,12 +402,15 @@ fn handle_message( router_response, state, ), + Res::ToClientResponse(ref to_client_response) => handle_to_client_response( + to_client_response, + ), } } call_init!(init); fn init(our: Address) { - println!("begin"); + println!("{}: begin", our.process()); let mut state = State::load(); diff --git a/openai/run_job/Cargo.toml b/openai/run_job/Cargo.toml new file mode 100644 index 0000000..a6558a7 --- /dev/null +++ b/openai/run_job/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "run_job" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0" +kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" } +process_macros = { git = "https://github.com/kinode-dao/process_macros", rev = "626e501" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +wit-bindgen = "0.24.0" + +[lib] +crate-type = ["cdylib"] + +[package.metadata.component] +package = "kinode:process" diff --git a/openai/run_job/src/lib.rs b/openai/run_job/src/lib.rs new file mode 100644 index 0000000..bec7ddb --- /dev/null +++ b/openai/run_job/src/lib.rs @@ -0,0 +1,63 @@ +use crate::kinode::process::driver::{ClientRequest, ClientResponse, RunJobRequestParams, ToClientRequest, ToClientResponse}; +use kinode_process_lib::{ + await_next_message_body, call_init, get_blob, println, Address, OnExit, Request, +}; + +wit_bindgen::generate!({ + path: "target/wit", + world: "llm-provider-nick1udwig-dot-os-v0", + generate_unused_types: true, + additional_derives: [serde::Deserialize, serde::Serialize, process_macros::SerdeJsonInto], +}); + +const PUBLISHER: &str = "nick1udwig.os"; +//const PROCESS_NAME: &str = "driver"; +const SCRIPT_NAME: &str = "run_job"; +const ROUTER_PATH: &str = "llm_provider:nick1udwig.os/pkg/router.wasm"; + +call_init!(init); +fn init(our: Address) { + let Ok(body) = await_next_message_body() else { + println!("failed to get args!"); + return; + }; + let package_name = our.package(); + let body = String::from_utf8(body).unwrap_or_default(); + let Some((model, prompt)) = body.split_once(' ') else { + println!("usage:\n{SCRIPT_NAME}:{package_name}:{PUBLISHER} model prompt\ne.g.\n{SCRIPT_NAME}:{package_name}:{PUBLISHER} default How much wood could a woodchuck chuck? Be concise."); + return; + }; + + let driver_process: Address = format!("our@driver:{}", our.package_id()).parse().unwrap(); + let job = RunJobRequestParams { + model: model.into(), + prompt: prompt.into(), + seed: None, + }; + let result = Request::to(driver_process) + .body(ClientRequest::RunJob(job)) + .send_and_await_response(5); + let Ok(Ok(result)) = result else { + println!("got error getting Response: {result:?}"); + return; + }; + let Ok(ClientResponse::RunJob(Ok(_))) = result.body().try_into() else { + println!("got error parsing Response: {result:?}"); + return; + }; + + let Ok(body) = await_next_message_body() else { + println!("failed to get result"); + return; + }; + let Ok(ToClientRequest::JobUpdate(_job_update)) = body.try_into() else { + println!("unexpected message: not JobUpdate"); + return; + }; + + let job_result = get_blob().unwrap_or_default().bytes; + let job_result = String::from_utf8(job_result).unwrap_or_default(); + println!("{job_result}"); + + return; +} From 80956898871c90f612966cfbc078afefb2e5d529 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Thu, 23 May 2024 11:53:35 -0700 Subject: [PATCH 04/12] update README --- README.md | 162 ++++++++++--------- openai/admin/src/lib.rs | 2 +- openai/api/llm_provider:nick1udwig.os-v0.wit | 15 +- openai/driver/src/lib.rs | 18 ++- 4 files changed, 114 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index a071403..09c0856 100644 --- a/README.md +++ b/README.md @@ -1,98 +1,104 @@ -# LLM +# LLM Provider -Kinode process for interacting with LLMs. +Kinode processes for interacting with & serving LLMs. -- [LLM](#llm) - - [Local LLMs](#local-llms) - - [Running Local LLMs with Messages](#running-local-llms-with-messages) - - [Running Local LLMS with Test Scripts](#running-local-llms-with-test-scripts) - - [Online APIs](#online-apis) - - [Calling APIs Through Messages](#calling-apis-through-messages) - - [Calling APIs Through Test Scripts](#calling-apis-through-test-scripts) +## Usage -## Local LLMs - -To run the lccp component, follow these steps: - -***Terminal 1:*** Download `llama.cpp` from the GitHub repository: - - ```bash - cd llama.cpp - make - ./server -m ../llama.cpp-sharding.cpp/phi2.gguf --embedding --port 3000 - ``` - -***Terminal 2*** Start a fake node by running: - - ```bash - kit f - ``` - -***Terminal 3*** Build and start the lccp service: - - ```bash - kit bs lccp/ - ``` - -### Running Local LLMs with Messages - -TODO - -### Running Local LLMS with Test Scripts - -Run the tester script in your fakenode: - - ```bash -lccp_tester:llm:kinode - ``` - -Within the tester, you can see how different requests and responses are handled. - -### Running local LLMs with Llamafile - -TODO - -https://github.com/Mozilla-Ocho/llamafile +### Get llamafile & your favorite LLM in GGUF format. ``` -m our@openai:openai:appattacc.os '{"RegisterOaiProviderEndpoint": {"endpoint": "http://127.0.0.1:8080/v1"}}' - -m our@openai:openai:appattacc.os '{"OaiProviderChat": {"model": "", "messages": [{"role": "user", "content": "Suggest a Shakespeare play for me to read. Be concise."}]}}' -a 60 - -kit i openai:openai:appattacc.os '{"OaiProviderChat": {"model": "", "messages": [{"role": "user", "content": "Suggest a Shakespeare play for me to read."}]}}' -p 8081 +# Get llamafile. +export LLAMAFILE_PATH=$(realpath ~/llms) +mkdir -p $LLAMAFILE_PATH +cd $LLAMAFILE_PATH + +export LLAMAFILE_VERSION=0.8.4 +curl -L -o llamafile-${LLAMAFILE_VERSION} https://github.com/Mozilla-Ocho/llamafile/releases/download/${LLAMAFILE_VERSION}/llamafile-${LLAMAFILE_VERSION} +chmod +x llamafile-${LLAMAFILE_VERSION} + +# Get your favorite LLM in GGUF format. +# E.g. Llama-3-8B-Instruct +cd $LLAMAFILE_PATH +curl -L -o Meta-Llama-3-8B-Instruct-Q8_0.gguf https://huggingface.co/lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF/resolve/main/Meta-Llama-3-8B-Instruct-Q8_0.gguf?download=true + +# Serve the LLM with llamafile. +# Note the port; below we assume it is 8080. +cd $LLAMAFILE_PATH +./llamafile-${LLAMAFILE_VERSION} -m Meta-Llama-3-8B-Instruct-Q8_0.gguf --server --mlock --nobrowser +export LLAMAFILE_PORT=8080 ``` -## Online APIs +### Get kit & Kinode core develop (requires 0.8.0). -***Terminal 1*** Start a fake node by running: +``` +# Get kit. +cargo install --git https://github.com/kinode-dao/kit --branch develop + +# Get Kinode core develop. +export KINODE_PATH=$(realpath ~/kinode) +cd $KINODE_PATH + +git clone git@github.com:kinode-dao/kinode.git +cd kinode +git checkout develop + +# Get llm_provider. +cd $KINODE_PATH +git clone git@github.com:kinode-dao/llm +cd llm +git checkout hf/llm-provider +``` - ```bash - kit f - ``` +### Start fakenodes. -***Terminal 2*** Build and start the openai service: +``` +# Start some fakenodes. +# The first will be the router. +# The second the driver connected to the llamafile server. +# The third the client sending a request -- routed through: +# * third's driver, +# * first's router, +# * second's driver, +# * llamafile, +# * back again. +export ROUTER_PORT=8081 +export DRIVER_PORT=8082 +export CLIENT_PORT=8083 +kit f --runtime-path ${KINODE_PATH}/kinode --port $ROUTER_PORT + +# In a new terminal: +kit f -r ${KINODE_PATH}/kinode -h /tmp/kinode-fake-node-2 -p $DRIVER_PORT -f fake2.dev + +# In a third terminal: +kit f -r ${KINODE_PATH}/kinode -h /tmp/kinode-fake-node-3 -p $CLIENT_PORT -f fake3.dev +``` - ```bash - kit bs openai/ - ``` +### Build and install llm provider. -### Calling APIs Through Messages +``` +cd ${KINODE_PATH}/llm/openai +kit b +kit s $ROUTER_PORT && kit s $DRIVER_PORT && kit s $CLIENT_PORT +``` -TODO +### Configure routers, drivers, clients. -### Calling APIs Through Test Scripts +``` +# Start a router. +admin:llm_provider:nick1udwig.os "StartRouter" -Run the tester script in your fakenode: +# Set driver to use router. +admin:llm_provider:nick1udwig.os {"SetRouter": {"node": "fake.dev"}} +admin:llm_provider:nick1udwig.os {"SetLocalDriver": {"model": "llama3-8b", "is_public": true}} -***Terminal 1*** Run the tester script +# Send jobs from inside Kinode (client). +admin:llm_provider:nick1udwig.os {"SetRouter": {"node": "fake.dev"}} +run_job:llm_provider:nick1udwig.os llama3 How much wood could a woodchuck chuck? Be concise. - ```bash -openai_tester:llm:kinode - ``` +# Send jobs from outside Kinode (client). +kit i driver:llm_provider:nick1udwig.os '{"RunJob": {"model": "llama3-8b", "prompt": "What is the funniest book in the Bible? Be concise."}}' -p $CLIENT_PORT +``` -Within the tester, you can see how different requests and responses are handled. +## Repo structure -## TODOS -- [ ] Make a clean interface. This is a higher level question regarding process communication. -- [ ] Cleaner call functions. diff --git a/openai/admin/src/lib.rs b/openai/admin/src/lib.rs index dd205e5..ce7c002 100644 --- a/openai/admin/src/lib.rs +++ b/openai/admin/src/lib.rs @@ -43,7 +43,7 @@ fn init(our: Address) { false, ).unwrap(); } - Ok(Req::DriverAdminRequest(DriverAdminRequest::SetLocalDriver(_))) => { + Ok(Req::DriverAdminRequest(_)) => { let driver_process: Address = format!("our@driver:{}", our.package_id()) .parse() .unwrap(); diff --git a/openai/api/llm_provider:nick1udwig.os-v0.wit b/openai/api/llm_provider:nick1udwig.os-v0.wit index 513bd1f..673589f 100644 --- a/openai/api/llm_provider:nick1udwig.os-v0.wit +++ b/openai/api/llm_provider:nick1udwig.os-v0.wit @@ -87,12 +87,18 @@ interface admin { } interface driver { + use standard.{ + process-id, + }; + variant admin-request { - set-local-driver(local-driver) + set-local-driver(local-driver), + set-router(set-router-request), } variant admin-response { - set-provider + set-local-driver, + set-router, } record local-driver { @@ -100,6 +106,11 @@ interface driver { is-public: bool, } + record set-router-request { + process-id: option, + node: option, + } + use pkg.{ client-request, client-response, diff --git a/openai/driver/src/lib.rs b/openai/driver/src/lib.rs index 417483d..a893d37 100644 --- a/openai/driver/src/lib.rs +++ b/openai/driver/src/lib.rs @@ -16,8 +16,7 @@ use kinode_process_lib::{ use llm_interface::openai::{ChatRequestBuilder, ChatResponse, LLMRequest, LLMResponse, Message as LLMMessage}; const DEFAULT_ROUTER_PROCESS_ID: &str = "router:llm_provider:nick1udwig.os"; -const DEFAULT_ROUTER_NODE: &str = "fake.dev"; // NOTE: this should be changed -//const DEFAULT_ROUTER_NODE: &str = "nick1udwig.os"; // NOTE: this should be changed +const DEFAULT_ROUTER_NODE: &str = "nick1udwig.os"; // NOTE: this should be changed const DEFAULT_TIMEOUT_SECONDS: u64 = 60; wit_bindgen::generate!({ @@ -260,6 +259,21 @@ fn handle_admin_request( set_is_available(true, state)? } } + AdminRequest::SetRouter(ref router) => { + if let Some(ref process_id) = router.process_id { + state.router_process_id = Some(ProcessId { + process_name: process_id.process_name.clone(), + package_name: process_id.package_name.clone(), + publisher_node: process_id.publisher_node.clone(), + }); + }; + if let Some(ref node) = router.node { + state.router_node = Some(node.clone()); + }; + if state.local_driver.as_ref().is_some_and(|ld| ld.is_public) { + set_is_available(true, state)? + } + } } Ok(()) } From 30c70d1e0d4484186a73bea1525cbf3bc370a914 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Thu, 23 May 2024 13:34:00 -0700 Subject: [PATCH 05/12] restructure repo --- .gitignore | 10 +- Cargo.lock | 29 +- Cargo.toml | 11 +- README.md | 15 +- {openai/admin => admin}/Cargo.toml | 0 {openai/admin => admin}/src/lib.rs | 0 .../llm_provider:nick1udwig.os-v0.wit | 0 {openai/driver => driver}/Cargo.toml | 0 {openai/driver => driver}/src/lib.rs | 17 +- lccp/Cargo.lock | 1446 ----------------- lccp/lccp/Cargo.lock | 1434 ---------------- lccp/lccp/Cargo.toml | 20 - lccp/lccp/src/lib.rs | 177 -- lccp/lccp/wasi_snapshot_preview1.wasm | Bin 96761 -> 0 bytes lccp/lccp/wit/kinode.wit | 198 --- lccp/metadata.json | 16 - lccp/pkg/lccp.wasm | Bin 725654 -> 0 bytes lccp/pkg/manifest.json | 15 - lccp/pkg/scripts.json | 12 - openai/metadata.json => metadata.json | 0 openai/Cargo.lock | 12 - openai/{openai => }/Cargo.toml | 0 openai/openai/Cargo.lock | 1434 ---------------- openai/openai/wasi_snapshot_preview1.wasm | Bin 81041 -> 0 bytes openai/openai/wit/kinode.wit | 198 --- openai/{openai => }/src/helpers.rs | 0 openai/{openai => }/src/lib.rs | 0 openai/{openai => }/src/structs.rs | 0 {openai/pkg => pkg}/manifest.json | 0 {openai/pkg => pkg}/scripts.json | 0 {openai/router => router}/Cargo.toml | 0 {openai/router => router}/src/lib.rs | 0 {openai/run_job => run_job}/Cargo.toml | 0 {openai/run_job => run_job}/src/lib.rs | 6 +- 34 files changed, 30 insertions(+), 5020 deletions(-) rename {openai/admin => admin}/Cargo.toml (100%) rename {openai/admin => admin}/src/lib.rs (100%) rename {openai/api => api}/llm_provider:nick1udwig.os-v0.wit (100%) rename {openai/driver => driver}/Cargo.toml (100%) rename {openai/driver => driver}/src/lib.rs (98%) delete mode 100644 lccp/Cargo.lock delete mode 100644 lccp/lccp/Cargo.lock delete mode 100644 lccp/lccp/Cargo.toml delete mode 100644 lccp/lccp/src/lib.rs delete mode 100644 lccp/lccp/wasi_snapshot_preview1.wasm delete mode 100644 lccp/lccp/wit/kinode.wit delete mode 100644 lccp/metadata.json delete mode 100644 lccp/pkg/lccp.wasm delete mode 100644 lccp/pkg/manifest.json delete mode 100644 lccp/pkg/scripts.json rename openai/metadata.json => metadata.json (100%) rename openai/{openai => }/Cargo.toml (100%) delete mode 100644 openai/openai/Cargo.lock delete mode 100644 openai/openai/wasi_snapshot_preview1.wasm delete mode 100644 openai/openai/wit/kinode.wit rename openai/{openai => }/src/helpers.rs (100%) rename openai/{openai => }/src/lib.rs (100%) rename openai/{openai => }/src/structs.rs (100%) rename {openai/pkg => pkg}/manifest.json (100%) rename {openai/pkg => pkg}/scripts.json (100%) rename {openai/router => router}/Cargo.toml (100%) rename {openai/router => router}/src/lib.rs (100%) rename {openai/run_job => run_job}/Cargo.toml (100%) rename {openai/run_job => run_job}/src/lib.rs (91%) diff --git a/.gitignore b/.gitignore index 7e2a0f7..45bcb80 100644 --- a/.gitignore +++ b/.gitignore @@ -3,11 +3,11 @@ **/pkg/*.wasm **/pkg/*.zip **/pkg/ui -*/*.swp -*/*.swo -*/*/wasi_snapshot_preview1.wasm -*/*/wit/ -*/*/process_env +**.swp +**.swo +**/wasi_snapshot_preview1.wasm +**/wit/ +**/process_env */ui/dist */ui/node_modules */node_modules diff --git a/Cargo.lock b/Cargo.lock index 6960713..1e4ea67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -680,7 +680,7 @@ dependencies = [ "anyhow", "bincode", "kinode_process_lib 0.6.1", - "llm_interface 0.1.0 (git+https://github.com/kinode-dao/llm/?branch=hf/interface)", + "llm_interface", "process_macros", "rand 0.8.5", "rand_pcg 0.3.1", @@ -1192,20 +1192,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lccp" -version = "0.1.0" -dependencies = [ - "anyhow", - "bincode", - "kinode_process_lib 0.6.0", - "llm_interface 0.1.0 (git+https://github.com/kinode-dao/llm/?branch=interface)", - "multipart", - "serde", - "serde_json", - "wit-bindgen 0.17.0", -] - [[package]] name = "leb128" version = "0.2.5" @@ -1241,17 +1227,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "llm_interface" -version = "0.1.0" -source = "git+https://github.com/kinode-dao/llm/?branch=interface#2bd3067f13e319a7128481598a7e5ae248a924e5" -dependencies = [ - "anyhow", - "derive_builder", - "serde", - "serde_json", -] - [[package]] name = "log" version = "0.3.9" @@ -1446,7 +1421,7 @@ dependencies = [ "anyhow", "bincode", "kinode_process_lib 0.6.0", - "llm_interface 0.1.0 (git+https://github.com/kinode-dao/llm/?branch=hf/interface)", + "llm_interface", "multipart", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 4749eb0..4af2295 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,11 @@ [workspace] resolver = "2" members = [ - "lccp/lccp", - "openai/admin", - "openai/driver", - "openai/openai", - "openai/router", - "openai/run_job", + "admin", + "driver", + "openai", + "router", + "run_job", ] [profile.release] diff --git a/README.md b/README.md index 09c0856..6a67bc4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# LLM Provider +# LLM Kinode processes for interacting with & serving LLMs. @@ -76,7 +76,7 @@ kit f -r ${KINODE_PATH}/kinode -h /tmp/kinode-fake-node-3 -p $CLIENT_PORT -f fak ### Build and install llm provider. ``` -cd ${KINODE_PATH}/llm/openai +cd ${KINODE_PATH}/llm kit b kit s $ROUTER_PORT && kit s $DRIVER_PORT && kit s $CLIENT_PORT ``` @@ -84,21 +84,20 @@ kit s $ROUTER_PORT && kit s $DRIVER_PORT && kit s $CLIENT_PORT ### Configure routers, drivers, clients. ``` -# Start a router. +# Start a router (router node terminal). admin:llm_provider:nick1udwig.os "StartRouter" -# Set driver to use router. +# Set driver to use router (driver node terminal). admin:llm_provider:nick1udwig.os {"SetRouter": {"node": "fake.dev"}} admin:llm_provider:nick1udwig.os {"SetLocalDriver": {"model": "llama3-8b", "is_public": true}} -# Send jobs from inside Kinode (client). +# Send jobs from inside Kinode (client node terminal). admin:llm_provider:nick1udwig.os {"SetRouter": {"node": "fake.dev"}} run_job:llm_provider:nick1udwig.os llama3 How much wood could a woodchuck chuck? Be concise. -# Send jobs from outside Kinode (client). +# Send jobs from outside Kinode (unix terminal). kit i driver:llm_provider:nick1udwig.os '{"RunJob": {"model": "llama3-8b", "prompt": "What is the funniest book in the Bible? Be concise."}}' -p $CLIENT_PORT ``` -## Repo structure - +## Architecture diff --git a/openai/admin/Cargo.toml b/admin/Cargo.toml similarity index 100% rename from openai/admin/Cargo.toml rename to admin/Cargo.toml diff --git a/openai/admin/src/lib.rs b/admin/src/lib.rs similarity index 100% rename from openai/admin/src/lib.rs rename to admin/src/lib.rs diff --git a/openai/api/llm_provider:nick1udwig.os-v0.wit b/api/llm_provider:nick1udwig.os-v0.wit similarity index 100% rename from openai/api/llm_provider:nick1udwig.os-v0.wit rename to api/llm_provider:nick1udwig.os-v0.wit diff --git a/openai/driver/Cargo.toml b/driver/Cargo.toml similarity index 100% rename from openai/driver/Cargo.toml rename to driver/Cargo.toml diff --git a/openai/driver/src/lib.rs b/driver/src/lib.rs similarity index 98% rename from openai/driver/src/lib.rs rename to driver/src/lib.rs index a893d37..06c2ece 100644 --- a/openai/driver/src/lib.rs +++ b/driver/src/lib.rs @@ -1,5 +1,5 @@ use crate::kinode::process::driver::{ - AdminRequest, AdminResponse, + AdminRequest, ClientRequest, DriverRequest, DriverResponse, LocalDriver, @@ -151,6 +151,7 @@ fn run_local_job( .body(ClientRequest::RunJob(job.clone())) .send()?; state.outstanding_job = Some(source.process.clone()); + state.save()?; } Ok(()) @@ -208,7 +209,7 @@ fn run_job( .send()?; return Err(anyhow::anyhow!(err)); } - let Some(ref local_driver) = state.local_driver else { + let Some(ref _local_driver) = state.local_driver else { // deny Request: cannot serve it let err = "got request from router, but don't have a local llm"; Response::new() @@ -231,11 +232,12 @@ fn run_job( .expects_response(5) // TODO .send()?; - state.outstanding_job = None; if state.local_driver.as_ref().is_some_and(|ld| ld.is_public) { println!("setting ready again"); set_is_available(true, state)? } + state.outstanding_job = None; + state.save()?; Ok(()) } @@ -255,6 +257,7 @@ fn handle_admin_request( match admin_request { AdminRequest::SetLocalDriver(ref local_driver) => { state.local_driver = Some(local_driver.clone()); + state.save()?; if local_driver.is_public { set_is_available(true, state)? } @@ -270,6 +273,7 @@ fn handle_admin_request( if let Some(ref node) = router.node { state.router_node = Some(node.clone()); }; + state.save()?; if state.local_driver.as_ref().is_some_and(|ld| ld.is_public) { set_is_available(true, state)? } @@ -328,11 +332,12 @@ fn handle_to_client_request( .body(to_client_request) .inherit(true) .send()?; - state.outstanding_job = None; if state.local_driver.as_ref().is_some_and(|ld| ld.is_public) { println!("setting ready again"); set_is_available(true, state)? } + state.outstanding_job = None; + state.save()?; } } Ok(()) @@ -340,7 +345,6 @@ fn handle_to_client_request( fn handle_driver_response( driver_response: &DriverResponse, - state: &mut State, ) -> anyhow::Result<()> { match driver_response { DriverResponse::SetIsAvailable => {} @@ -350,7 +354,6 @@ fn handle_driver_response( fn handle_to_client_response( to_client_response: &ToClientResponse, - state: &mut State, ) -> anyhow::Result<()> { match to_client_response { ToClientResponse::JobUpdate => {} @@ -394,11 +397,9 @@ fn handle_message( match message.body().try_into()? { Res::DriverResponse(ref driver_response) => handle_driver_response( driver_response, - state, ), Res::ToClientResponse(ref to_client_response) => handle_to_client_response( to_client_response, - state, ), } } diff --git a/lccp/Cargo.lock b/lccp/Cargo.lock deleted file mode 100644 index 2cef475..0000000 --- a/lccp/Cargo.lock +++ /dev/null @@ -1,1446 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" - -[[package]] -name = "ascii" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97be891acc47ca214468e09425d02cef3af2c94d0d82081cd02061f996802f14" - -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" -dependencies = [ - "byteorder", - "safemem", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" - -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - -[[package]] -name = "bumpalo" -version = "3.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cc" -version = "1.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-targets", -] - -[[package]] -name = "chunked_transfer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87" - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "interface" -version = "0.1.0" - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding 2.3.1", -] - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "groupable" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32619942b8be646939eaf3db0602b39f5229b74575b67efc897811ded1db4e57" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" - -[[package]] -name = "http" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "hyper" -version = "0.10.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -dependencies = [ - "base64", - "httparse", - "language-tags", - "log 0.3.9", - "mime 0.2.6", - "num_cpus", - "time", - "traitobject", - "typeable", - "unicase 1.4.2", - "url 1.7.2", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "iron" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d308ca2d884650a8bf9ed2ff4cb13fbb2207b71f64cda11dc9b892067295e8" -dependencies = [ - "hyper", - "log 0.3.9", - "mime_guess 1.8.8", - "modifier", - "num_cpus", - "plugin", - "typemap", - "url 1.7.2", -] - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "js-sys" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kinode_process_lib" -version = "0.5.9" -source = "git+https://github.com/kinode-dao/process_lib.git?tag=v0.5.9-alpha#5e705086bbd10fde89e11d3e3671f6a618a875a7" -dependencies = [ - "anyhow", - "bincode", - "http", - "mime_guess 2.0.4", - "rand 0.8.5", - "serde", - "serde_json", - "thiserror", - "url 2.5.0", - "wit-bindgen", -] - -[[package]] -name = "language-tags" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "llm_process" -version = "0.1.0" -dependencies = [ - "anyhow", - "bincode", - "interface", - "kinode_process_lib", - "multipart", - "serde", - "serde_json", - "wit-bindgen", -] - -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -dependencies = [ - "log 0.4.20", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "mime" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -dependencies = [ - "log 0.3.9", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "1.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216929a5ee4dd316b1702eedf5e74548c123d370f47841ceaac38ca154690ca3" -dependencies = [ - "mime 0.2.6", - "phf", - "phf_codegen", - "unicase 1.4.2", -] - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime 0.3.17", - "unicase 2.7.0", -] - -[[package]] -name = "modifier" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" - -[[package]] -name = "multipart" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" -dependencies = [ - "buf_redux", - "httparse", - "hyper", - "iron", - "log 0.4.20", - "mime 0.3.17", - "mime_guess 2.0.4", - "nickel", - "quick-error", - "rand 0.8.5", - "safemem", - "tempfile", - "tiny_http", - "twoway", -] - -[[package]] -name = "mustache" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51956ef1c5d20a1384524d91e616fb44dfc7d8f249bf696d49c97dd3289ecab5" -dependencies = [ - "log 0.3.9", - "serde", -] - -[[package]] -name = "nickel" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5061a832728db2dacb61cefe0ce303b58f85764ec680e71d9138229640a46d9" -dependencies = [ - "groupable", - "hyper", - "lazy_static", - "log 0.3.9", - "modifier", - "mustache", - "plugin", - "regex", - "serde", - "serde_json", - "time", - "typemap", - "url 1.7.2", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" -dependencies = [ - "phf_shared", - "rand 0.6.5", -] - -[[package]] -name = "phf_shared" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" -dependencies = [ - "siphasher", - "unicase 1.4.2", -] - -[[package]] -name = "plugin" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" -dependencies = [ - "typemap", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "regex" -version = "1.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "rustix" -version = "0.38.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" -dependencies = [ - "bitflags 2.4.2", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.114" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "siphasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" - -[[package]] -name = "smallvec" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" - -[[package]] -name = "spdx" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bde1398b09b9f93fc2fc9b9da86e362693e999d3a54a8ac47a99a5a73f638b" -dependencies = [ - "smallvec", -] - -[[package]] -name = "syn" -version = "2.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys", -] - -[[package]] -name = "thiserror" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "tiny_http" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e22cb179b63e5fc2d0b5be237dc107da072e2407809ac70a8ce85b93fe8f562" -dependencies = [ - "ascii", - "chrono", - "chunked_transfer", - "log 0.4.20", - "url 1.7.2", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", -] - -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" - -[[package]] -name = "typemap" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" -dependencies = [ - "unsafe-any", -] - -[[package]] -name = "unicase" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -dependencies = [ - "version_check 0.1.5", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check 0.9.4", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "unsafe-any" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" -dependencies = [ - "traitobject", -] - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna 0.5.0", - "percent-encoding 2.3.1", -] - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" -dependencies = [ - "bumpalo", - "log 0.4.20", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" - -[[package]] -name = "wasm-encoder" -version = "0.38.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" -dependencies = [ - "leb128", -] - -[[package]] -name = "wasm-encoder" -version = "0.41.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae" -dependencies = [ - "leb128", -] - -[[package]] -name = "wasm-metadata" -version = "0.10.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ebaa7bd0f9e7a5e5dd29b9a998acf21c4abed74265524dd7e85934597bfb10" -dependencies = [ - "anyhow", - "indexmap", - "serde", - "serde_derive", - "serde_json", - "spdx", - "wasm-encoder 0.41.2", - "wasmparser 0.121.2", -] - -[[package]] -name = "wasmparser" -version = "0.118.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f1154f1ab868e2a01d9834a805faca7bf8b50d041b4ca714d005d0dab1c50c" -dependencies = [ - "indexmap", - "semver", -] - -[[package]] -name = "wasmparser" -version = "0.121.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" -dependencies = [ - "bitflags 2.4.2", - "indexmap", - "semver", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" - -[[package]] -name = "wit-bindgen" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "bitflags 2.4.2", - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "anyhow", - "wit-component", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "anyhow", - "heck", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", - "wit-component", -] - -[[package]] -name = "wit-component" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a35a2a9992898c9d27f1664001860595a4bc99d32dd3599d547412e17d7e2" -dependencies = [ - "anyhow", - "bitflags 2.4.2", - "indexmap", - "log 0.4.20", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder 0.38.1", - "wasm-metadata", - "wasmparser 0.118.2", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "316b36a9f0005f5aa4b03c39bc3728d045df136f8c13a73b7db4510dec725e08" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log 0.4.20", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", -] - -[[package]] -name = "worker" -version = "0.1.0" -dependencies = [ - "anyhow", - "bincode", - "kinode_process_lib", - "serde", - "serde_json", - "wit-bindgen", -] diff --git a/lccp/lccp/Cargo.lock b/lccp/lccp/Cargo.lock deleted file mode 100644 index 86c7c98..0000000 --- a/lccp/lccp/Cargo.lock +++ /dev/null @@ -1,1434 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" - -[[package]] -name = "ascii" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97be891acc47ca214468e09425d02cef3af2c94d0d82081cd02061f996802f14" - -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" -dependencies = [ - "byteorder", - "safemem", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" - -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - -[[package]] -name = "bumpalo" -version = "3.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cc" -version = "1.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-targets", -] - -[[package]] -name = "chunked_transfer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87" - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "interface" -version = "0.1.0" - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding 2.3.1", -] - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "groupable" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32619942b8be646939eaf3db0602b39f5229b74575b67efc897811ded1db4e57" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" - -[[package]] -name = "http" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "hyper" -version = "0.10.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -dependencies = [ - "base64", - "httparse", - "language-tags", - "log 0.3.9", - "mime 0.2.6", - "num_cpus", - "time", - "traitobject", - "typeable", - "unicase 1.4.2", - "url 1.7.2", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "iron" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d308ca2d884650a8bf9ed2ff4cb13fbb2207b71f64cda11dc9b892067295e8" -dependencies = [ - "hyper", - "log 0.3.9", - "mime_guess 1.8.8", - "modifier", - "num_cpus", - "plugin", - "typemap", - "url 1.7.2", -] - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "js-sys" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kinode_process_lib" -version = "0.5.9" -source = "git+https://github.com/kinode-dao/process_lib.git?tag=v0.5.9-alpha#5e705086bbd10fde89e11d3e3671f6a618a875a7" -dependencies = [ - "anyhow", - "bincode", - "http", - "mime_guess 2.0.4", - "rand 0.8.5", - "serde", - "serde_json", - "thiserror", - "url 2.5.0", - "wit-bindgen", -] - -[[package]] -name = "language-tags" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "llm_process" -version = "0.1.0" -dependencies = [ - "anyhow", - "bincode", - "interface", - "kinode_process_lib", - "multipart", - "serde", - "serde_json", - "wit-bindgen", -] - -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -dependencies = [ - "log 0.4.20", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "mime" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -dependencies = [ - "log 0.3.9", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "1.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216929a5ee4dd316b1702eedf5e74548c123d370f47841ceaac38ca154690ca3" -dependencies = [ - "mime 0.2.6", - "phf", - "phf_codegen", - "unicase 1.4.2", -] - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime 0.3.17", - "unicase 2.7.0", -] - -[[package]] -name = "modifier" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" - -[[package]] -name = "multipart" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" -dependencies = [ - "buf_redux", - "httparse", - "hyper", - "iron", - "log 0.4.20", - "mime 0.3.17", - "mime_guess 2.0.4", - "nickel", - "quick-error", - "rand 0.8.5", - "safemem", - "tempfile", - "tiny_http", - "twoway", -] - -[[package]] -name = "mustache" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51956ef1c5d20a1384524d91e616fb44dfc7d8f249bf696d49c97dd3289ecab5" -dependencies = [ - "log 0.3.9", - "serde", -] - -[[package]] -name = "nickel" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5061a832728db2dacb61cefe0ce303b58f85764ec680e71d9138229640a46d9" -dependencies = [ - "groupable", - "hyper", - "lazy_static", - "log 0.3.9", - "modifier", - "mustache", - "plugin", - "regex", - "serde", - "serde_json", - "time", - "typemap", - "url 1.7.2", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" -dependencies = [ - "phf_shared", - "rand 0.6.5", -] - -[[package]] -name = "phf_shared" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" -dependencies = [ - "siphasher", - "unicase 1.4.2", -] - -[[package]] -name = "plugin" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" -dependencies = [ - "typemap", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "regex" -version = "1.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "rustix" -version = "0.38.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" -dependencies = [ - "bitflags 2.4.2", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.114" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "siphasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" - -[[package]] -name = "smallvec" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" - -[[package]] -name = "spdx" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bde1398b09b9f93fc2fc9b9da86e362693e999d3a54a8ac47a99a5a73f638b" -dependencies = [ - "smallvec", -] - -[[package]] -name = "syn" -version = "2.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys", -] - -[[package]] -name = "thiserror" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "tiny_http" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e22cb179b63e5fc2d0b5be237dc107da072e2407809ac70a8ce85b93fe8f562" -dependencies = [ - "ascii", - "chrono", - "chunked_transfer", - "log 0.4.20", - "url 1.7.2", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", -] - -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" - -[[package]] -name = "typemap" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" -dependencies = [ - "unsafe-any", -] - -[[package]] -name = "unicase" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -dependencies = [ - "version_check 0.1.5", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check 0.9.4", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "unsafe-any" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" -dependencies = [ - "traitobject", -] - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna 0.5.0", - "percent-encoding 2.3.1", -] - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" -dependencies = [ - "bumpalo", - "log 0.4.20", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" - -[[package]] -name = "wasm-encoder" -version = "0.38.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" -dependencies = [ - "leb128", -] - -[[package]] -name = "wasm-encoder" -version = "0.41.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae" -dependencies = [ - "leb128", -] - -[[package]] -name = "wasm-metadata" -version = "0.10.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ebaa7bd0f9e7a5e5dd29b9a998acf21c4abed74265524dd7e85934597bfb10" -dependencies = [ - "anyhow", - "indexmap", - "serde", - "serde_derive", - "serde_json", - "spdx", - "wasm-encoder 0.41.2", - "wasmparser 0.121.2", -] - -[[package]] -name = "wasmparser" -version = "0.118.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f1154f1ab868e2a01d9834a805faca7bf8b50d041b4ca714d005d0dab1c50c" -dependencies = [ - "indexmap", - "semver", -] - -[[package]] -name = "wasmparser" -version = "0.121.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" -dependencies = [ - "bitflags 2.4.2", - "indexmap", - "semver", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" - -[[package]] -name = "wit-bindgen" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "bitflags 2.4.2", - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "anyhow", - "wit-component", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "anyhow", - "heck", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.16.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=efcc759#efcc7592cf3277bcb9be1034e48569c6d822b322" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", - "wit-component", -] - -[[package]] -name = "wit-component" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a35a2a9992898c9d27f1664001860595a4bc99d32dd3599d547412e17d7e2" -dependencies = [ - "anyhow", - "bitflags 2.4.2", - "indexmap", - "log 0.4.20", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder 0.38.1", - "wasm-metadata", - "wasmparser 0.118.2", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "316b36a9f0005f5aa4b03c39bc3728d045df136f8c13a73b7db4510dec725e08" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log 0.4.20", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", -] diff --git a/lccp/lccp/Cargo.toml b/lccp/lccp/Cargo.toml deleted file mode 100644 index 0ee0e48..0000000 --- a/lccp/lccp/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "lccp" -version = "0.1.0" -edition = "2021" - -[dependencies] -anyhow = "1.0" -bincode = "1.3.3" -kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.0" } -multipart = "0.18.0" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "21a46c7" } -llm_interface = { git = "https://github.com/kinode-dao/llm/", branch = "interface" } - -[lib] -crate-type = ["cdylib"] - -[package.metadata.component] -package = "kinode:process" diff --git a/lccp/lccp/src/lib.rs b/lccp/lccp/src/lib.rs deleted file mode 100644 index a8e2df8..0000000 --- a/lccp/lccp/src/lib.rs +++ /dev/null @@ -1,177 +0,0 @@ -use anyhow::Context; -use llm_interface::lccp::{ - ChatRequest, ChatResponse, ChatStreamingResponse, EmbeddingRequest, EmbeddingResponse, - LLMRequest, LLMResponse, -}; -use kinode_process_lib::{ - await_message, call_init, get_blob, - http::{HttpClientAction, OutgoingHttpRequest}, - println, Address, LazyLoadBlob, ProcessId, Request, Response, -}; -use serde_json::json; -use std::{collections::HashMap, vec}; - -// TODO: Zen: This should be in a config -const URL: &str = "http://127.0.0.1:3000"; - -const CHAT_CONTEXT_NON_STREAMING: u8 = 0; -const CHAT_CONTEXT_STREAMING: u8 = 1; -const EMBEDDING_CONTEXT: u8 = 2; - -wit_bindgen::generate!({ - path: "wit", - world: "process", - exports: { - world: Component, - }, -}); - -fn handle_response(context: &[u8]) -> anyhow::Result<()> { - match context[0] { - CHAT_CONTEXT_NON_STREAMING => handle_chat_response_non_streaming()?, - // CHAT_CONTEXT_STREAMING => handle_chat_response_streaming()?, - EMBEDDING_CONTEXT => handle_embedding_response()?, - _ => {} - } - - Ok(()) -} - -fn handle_embedding_response() -> anyhow::Result<()> { - let bytes = get_blob().context("Couldn't get blob")?; - let output = serde_json::from_slice::(bytes.bytes.as_slice())?; - let response = LLMResponse::Embedding(output); - let _ = Response::new() - .body(serde_json::to_vec(&response).expect("Failed to serialize response for embedding")) - .send(); - Ok(()) -} - -fn handle_chat_response_non_streaming() -> anyhow::Result<()> { - let bytes = get_blob().context("Couldn't get blob")?; - let response = serde_json::from_slice::(bytes.bytes.as_slice())?; - let response = LLMResponse::Chat(response); - let _ = Response::new() - .body(serde_json::to_vec(&response)?) - .send()?; - Ok(()) -} - -fn _handle_chat_response_streaming() -> anyhow::Result<()> { - let mut acc = String::new(); - if let Some(bytes) = get_blob() { - println!("lccp: length of received bytes: {}", bytes.bytes.len()); - let response_str = String::from_utf8(bytes.bytes.clone()).expect("Invalid UTF-8"); - acc.push_str(&response_str); - - let acc_clone = acc.clone(); - for chunk in acc_clone.split("\n\n").filter(|e| e.starts_with("data: ")) { - let json_str = &chunk[6..]; - if let Ok(response) = serde_json::from_str::(json_str) { - let llm_response = LLMResponse::ChatStreaming(response); - // println!("lccp: sending response: {:?}", llm_response); - Response::new() - .body(serde_json::to_vec(&llm_response)?) - .send()?; - // Remove the string from acc - acc = acc.replace(chunk, ""); - } - } - // if stop { - // break; - // } - } - Ok(()) -} - -fn handle_request(body: &[u8]) -> anyhow::Result<()> { - let request = LLMRequest::parse(body)?; - match &request { - LLMRequest::Embedding(embedding_params) => handle_embedding_request(embedding_params)?, - LLMRequest::Chat(chat_params) => handle_chat_request(chat_params)?, - } - Ok(()) -} -fn send_request( - params: &T, - endpoint: &str, - context: u8, -) -> anyhow::Result<()> { - let outgoing_request = OutgoingHttpRequest { - method: "POST".to_string(), - version: None, - url: format!("{}/{}", URL, endpoint), - headers: HashMap::from_iter(vec![( - "Content-Type".to_string(), - "application/json".to_string(), - )]), - }; - let body_bytes = json!(HttpClientAction::Http(outgoing_request)) - .to_string() - .as_bytes() - .to_vec(); - let content = serde_json::to_string(params).expect("Failed to serialize params"); - Request::new() - .target(Address::new( - "our", - ProcessId::new(Some("http_client"), "distro", "sys"), - )) - .body(body_bytes) - .expects_response(30) - .context(vec![context]) - .blob(LazyLoadBlob { - mime: Some("application/json".to_string()), - bytes: content.as_bytes().to_vec(), - }) - .send()?; - Ok(()) -} - - -fn handle_chat_request_non_streaming(chat_params: &ChatRequest) -> anyhow::Result<()> { - send_request(chat_params, "completion", CHAT_CONTEXT_NON_STREAMING) -} - -fn handle_chat_request_streaming(chat_params: &ChatRequest) -> anyhow::Result<()> { - send_request(chat_params, "completion", CHAT_CONTEXT_STREAMING) -} - -fn handle_embedding_request(embedding_params: &EmbeddingRequest) -> anyhow::Result<()> { - send_request(embedding_params, "embedding", EMBEDDING_CONTEXT) -} - -fn handle_chat_request(chat_params: &ChatRequest) -> anyhow::Result<()> { - if chat_params.stream.unwrap_or(false) { - handle_chat_request_streaming(chat_params) - } else { - handle_chat_request_non_streaming(chat_params) - } -} - -fn handle_message() -> anyhow::Result<()> { - let message = await_message()?; - println!("lccp: we received a message"); - if message.is_request() { - let _ = handle_request(message.body()); - } else { - let context = message.context().context("lccp: Failed to get context")?; - let _ = handle_response(context); - } - - Ok(()) -} - -call_init!(init); - -fn init(_our: Address) { - println!("lccp: begin"); - - loop { - match handle_message() { - Ok(()) => {} - Err(e) => { - println!("lccp: error: {:?}", e); - } - }; - } -} diff --git a/lccp/lccp/wasi_snapshot_preview1.wasm b/lccp/lccp/wasi_snapshot_preview1.wasm deleted file mode 100644 index 4ee5bc1b8b76548afb70ad74b32c288434538bba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96761 zcmeFa31DPbc_w;K-BMLaC8?`h-R*X_m#gYFX=6)WRZ=Z-8|YFfY(t10aDo#|blEW{_~&z{QEiAs&-d|Wm)3qBG=p{&RKU^;{Lma&fS0i zIb28hkA3cb{5y2+ocxXA7q@Z#;D6R#G4Dd$FV3L_{A0@(5muAM@hHLC{68O|an&Gi zld`_|66MtY2*|m+EOvj6Z2}b8^8NggO{iOT8ac;*6@==oEX)V;LIR6U@y>%Am&5Wk z2Z|d#3RxTQ$!_s45rMnNR}P-A-PO~v6?diGIUBL8tIkxrts9!HWw(2_+jCcrt##b? zn!DOPk(tg-XLg-*dsB^8$F29;otE3RtSe-N`f|H|s(b8Ab$NM8UaR6G9k<(FUhlQq ztClrsmRxDCwtMZ>R(-SLV#|i@)%KYSX;GFFhx!NAJGs#Y?Q0E=6 ziqjX<`5-FqxU1C_mvG0og8Rw=gYTYQS#GVKV%@}6bqCSK`l_r-f|NKrKTF!vU9XWZ z)G*@pPE~TU;qzD99aL+rc6-&;o;5s}psx0Y7^0+UzrHmxxZYJ>J(Ft9YI{7IUu!Qf ztJQT`9~tmXwYKb9)_}rMzO|AEWHX)WYNNe!O#P_FQe-#k!Bp*R53*o%*TTX|wY9pi z(r&CTy9*1W^=hrP0AgK+c(BF}%BJeetz!^5txkJ&1*}pvCgqCp)UviHJjR}@os;XV z4-vE#6{I~h1tdQ$xx?vJ)m!RYGQGnC8jwtH>OxyMGN6U(8f0q2Y+_4pKWGUN3C-o| z$?n$tV^CGH`(A4WQ#QU8?glX|;?CN2v9+)QdRv2eZ~&56i_0{%Rd@dSF(%j_A8YU4 zs`j96J?^sSVk=TlVvk$0G=JS1@DizBuUqnQX8@Ld%B*d8|K4^6%pIB2}_o1f^f!+x~#9>NqV`9t1N32!{~Kn)A&M!s4c5-)P~ zM+XZepVNkF)MyyAR!>fCRn-^O7)78>P1hIQ`l%_UVQ#9zY3)5+Q`LzL26Wn^;cy)v zQpMdN@W5Wzv7|O>#%JrBG@~lp_LHGvN9=EsPy(4>etsk6_LcX=K*6#FtS^s?X)V(M4 z^ri%)c6R}^Yu!99FKKkB2QN%&@h@M$Xt#G4lz8!&v@Fqws`10)>YkEJR=Rb#*#LCX zcDpUfYw8^Y@+Aq}$+1{3MYcC-BVUWUeVrgdDU~F-8Bh-YVG8{wQ6s1 zL75f{J`1;6yXEuHFqbY1KMO{5YFNIZFte7`HR;M)8I#Wmt$eqtdQ-N9(OWyI%gNEM zjmkT%@mqJNn^t#tt<$bANXFe8k=LCnE&26i7tExwaJJ}emN^O-hekR!khgzuC>+V|5x@TD4!M}0ZI;*a`P}Hnfj>+fU#dR>@Gpp9CMiwLy zE#ReXCl?kL-Rc_FN!PWbBmeRp_UV5S752Hq58!`R`El!1S{#wrkrR;NOUs7A8XQfL^)E3r0|nia(I_oN`2tf zD8_~zaZDu8maH>cK=Y_EDw2FYGHEBB2)nV$VhQh1_i<}ULFL%xC!VnH-i4B7=LTyQ zKi~SJ-~MQee_-5diaxniF?ACS}I?YdOblb|M!X18+d`Izw@|t+JbBh)i+NHn#L!}uTHuVG9I zaSr72tHfE_8naUWC<(_(eUwj#rEsUsu=Qp2^n^13)diz*M3EQ;9&zfQNt=IRgAh z2{Mb^L<=(E;LZ?a5mmlCN|uur9IF7)+NpmL9W}{xi3tkN|@^Iy;Ubc;&{we$MKk}PS^2P z-P17)f7Ly+hw)1hpA@8OGiWwQhX3%5cYXkB)peYRFF{dyH}iD>ovPkp~~zVZH# zy~nM~0NU68{GY!)UXVlh&VTvC2mkhq?|IAL1Vb3tYTV!fAZ^+zJY>o zz4Pt=?f1X@TYoQ!Lk{UX0j9(^TgTQEOo_`m4a&ZqfL-hrhuq8?bDnT;36lzPWrs z68?)(5jFHZ!-&)xo^5D&Fe^eDo>J$2kMs=g1OGxa4Q>P0ONGzIMBBZk$szj$^gcEN zVvjDRqqtJ0CAc3pf}kXcCM3C$>R^2Y4l$3Uo`;9N$s8i78Gvh$)OENuEeA<)21$WFOq1CcFM2NY z>wu)RcwsZ9c+urN@#2vlo9-v0?E>8w^qYWg3VLG26!aX9Dd_cZJV8HrIG;4gDeU69 zIPN4l5?m&7-od0W^YD*aAV|rt$d@KY_oUPn5{g304%xzFv`i)gAy<}{00LCOTq^XR~DeLJ-}klkOu4_ z30MrkI57nn;tF;ESTy<9VU<*SY06hj4ry%JaDJwAsEn;#A2zF3<1XozV z(J5;<^)5Co9yxcDsl1|GOCfpKKjw zCy&^^1cN`{y7OO+1_>8o$GcwaT)5t1hqEHI*dc?Rs9x-_FQfEqNY{i~>{kS9-Ld6L zFW)dpan8GuNrrtSU(oqGMo`1@7B09HQR7E8j>0`{Xh05bLkl+?*+}tqXyFpPjSE-1 z`02RDYj5F7H~j%L5ni|e!0?0VI^M#Sb@Vf1;cn|N{Dr&S!}$1+h{=daI<%E2x2f6IZ=k3NWG1`Jso$Vx5D#kJMnU6S>^b=0QWWh56sTf+kgpCPG2Ix+g@BIPfrf~nV1x-hE>lF3L*8--FR2uuPX z_}M8DK!ofR>(C@bsM$B_2N`EEk7Tzsr^9#M>Ws5(%jv+_u=1YqsVRRFW^Y32Thu-@ zdxM2wus7Tpx(rCcBv+ZVNQ$9z1GV^N7w=}u&V zcoG6B4im~`bePi=WHK^yF|5OcGZ_<-_&2gbO;`H0#|mX8 zBbyAf!f?uyuH&&nSw}xJSmCw~!)JxtJ&f1HBSV3SL1q{UNJ}ZVK8exu8c0ywg-DF9 zf8+xxrYOA~P;t}wM$c$ zPKUJek;J@sZ8|>xxb=_|$IBEs<)O(qlxoX~rQR=<=-4PM0vT0^rM@SLHUi?L_V3^# zQ5H1Gq1P*wJ2nbNNR=B^4lbo$=T$faPLARSD=?Fyepx8!5%QAf;zyJ24Nl09k;AP) zy3fX~NxEsiHl+AL+3iNs)&6_^+9O@*gJ+W_>9R>vit9Qa>B>6#nL)bSIt-t5w|f|6 zTarn%{Dio>Y(rwsKk>wWe8QSc%s=pt|M5ABFu&{poVzZoWBhvki*U(l(Bp+(ktU@6q@e1S`pX{Egv>% zE+583%;lr&gqDwf*1vqVYZ(2@XWNGH>tU+X9-Ij1?cxn4_-iDukCD=0J%P;PkrN>@ zi%|g{Qe-Aq!%fIPn2c|3I>kXSHu>$bz-qb7#QuqE?VBfegDt79UdyhOVsZj&L%!WJZ%s}(mM52Rw-+UL-NyG2 zM9z4>Q+NKHGloA@#%_*l?F@Xohwe@9a&|dmw;!6^n?&tVRr|n_lN?ZcMAgP_k85p5 z)gE)koDtNXKyB2I-v*rtki@C$OWkUCKsyQ5j>HdK&x8Wv)=8ipEOIFvOZb^6+8O-p zEdpNQq>47weP?&khE6W$2S0nH7@Zf&!>cs9Dd>Bi&ZeBvH&_h-qxG=6$j1XgatCe= zL2?^zO}=n5UmJSZ2{k2~Dq`OIkSJlJCTC!yrYP|$d8|RIV&21kVX|#Q@tK1biXH&l zG8D_3B5=j9%JYcuVh38~`BK=NHEfOxVK2?rDqTe3!-x+8b&`MZrd<^KW5u7X#H(6e*lvFzpF7`>=74`WT}e_GVwG z*%u!n|M7@|vmcYQA4$@Jqo*uZwvBH0pxgasx3NM5Q8mXtE)Yy(w}_X)MPY;<8R7pN z)DsCk1#EQt~3qGl0T{Y+*0|fy*xZ z--Wp^Rr_3K=mrhKsiYBv^%{jKKLnLddeZ{|;J_w1z`bi~j~jqP*(<2Qu?i+qC6`)b zT6|z0u>1kPlW<~>Lc%j43NwKF~u?)^It|>o}3l zO=IxYGb8|B@uD$ULEIcrK17^U#)e6H*!p4-E2Hoo3{iC4h##%Ul$;?`k;&lJP-Kqc z)>LF1zBUw@0}>4z^_U@*9<5({vVVvM4x2PZ2b(lShpyv^4p~P(GepO>4#VdU&+K9R zqqqHNi(#ZOfnWQ)IBv;l_}V-F?p<&E+;4Joy+(Ob?_PO2rr`l^nz0_%<>wjJF>z3d(}-qaOjFt3wew$NdfVU@qkRUfo&WZI z8wQL$>DHl>lXDXU6onEbe`}=X7;y&Wk)%v86X!0}*Vz|y*h|MfIk=2J!1eG(itx9{ zV-?gM1JxabgnbKTxr~sO??e2dJi5&7&GOmkEr-$;0|f#F6HJeqcV3H4+ThyM>5N!E z4dP&=zK?UeQv7|5Pa6a9XL5&u$I+#Yd7TqB2Iy5aIl8XnadcTnKQlObgo0_ihT(Jc z?Hlr?p}2S^TaCzIp=KtORro|E)>c&v4ZvKzx*db!Y(;U~GYp^NwtE3_)s$SGgNz_w^HK;K|=M#DnL%=bG6!v2rHi;DCSFJ8WPG0;%l-Ljs_J{ z@*7kL!5^Z+6ki)un2?}ss>$lt9u<1(P>2fIq)COkjz@*Ej(%oP;kFLLr$Vh%Y~wKK z%c8rMBF^$MN{51QoEFOe_gEx$PIx|jvdB$*C7_3}t%oe~&8$7!v-TAA#s-*pf^ZpB zi#WS)(b39H$7MVTmN0EK*jAH*^iKh;Q>rW{!H5zw0R{#xCuw!UCM0`J{i1fY!|FYN zN}ffClwMkdaRL*iVd%gHgl}LB_T-~4NL zWd{~Dz4VX~kKPOCIK8ZLQ?A((dytMNsWT_Ty+}~^(o#=-g^L`(m~}ajK(r_dfqaoZ ztQ+y;+o++O;|!CE1Nm|kx2Ak?_}W<6aCI>H;vF01%NOnZ(XYLgE%S%jq$yw6q`9(n z9dBiOdCKg@SlQb;41Z-mvxni^s9OvpjS18?DyAW1qsp1}Y}BV?8hjgd3;0Q|VH-8t zXQSeb7vszeO7~uw@WKDa4uM>H?kb6q&$acB>7-c?D7(IzS8dtrF;tir{$j9)8QW{i918? zf$6I(UmDMo32^UW2N`YjM8;&2?aJA4)JL>1ga%lGV8PQHAp(ct24!toH1#HhBS2gA0ckSBDCN8aGm=z>QrNh<)3)jSWRk*iay4rsfG>LW~f{%$4NS|Vx$kS7g&{Lpy!ksT)vE&WNZ9*k9JkF#(sm9%j zA1$-)pfVT)h;O618OW@gacjyffEAKiB{`IhGE1v*`n4ysq-Mz`O_{|eO_`CA6L}iYw@?u)?*RYc{n?|; zZ)eYvvm3hJo>S>P&bWg=yc6mj@-+51;uI5|obmDl(s)M!+VEK8NYDr1G8Ay2z&k!f zKL6w%3=moy&ke)?%VZg%y)%uo8gHXrh34yHTs9PQq2*8he!-|!^ zsh(uKC%XXscDbgzKY`10FDAmC5m> zGwRStRAvN*J4|@NI-R60hG&V2Gtx00Iq|V56j82p`Y&|Xp|;IdH`GT(xsJc$2c&fB zz^{+kIHd9ZK?j*&9t9>gZO@B)(@`Kv@nc|6{MeYhaqN$bM}!4M7&Q}r^{lucWY1pWRFKc^4S>>};rs!v2?-v`@SsRZzw|AE*o8bUQqwj^f+wT| zOj&x!8xx*=OFdIh7%n6HquXC1+tCK!$s;zK_Xx;8og&}JOZQ}h=TB<>y0>~Z2a>=xb2$eEu4RC3_v3^;rSw+4qlid&PzJA56oN;ru=hyTS9t#D}v zB@!$oG3Ypj^qI0rlf$z~lf&ye9*388^fQCQW4MV;X=Gk-=n#$|WtxZ^Y1TWHiOkEN z=^>ALy|virRJ$SxIP&7R!ZY?+m_Oj{VQ-#|dw&}O0xu|HY(=nAFPA5R>uthEU24^&sC_E3qk^p@~w`MVxJMq4tm>gnCl`4-8|p?4Yyusb_C!Nj*~W2#Tv+r6Xn z(}uVYc9W4sUYNAsDz(}?^+XDK+AP%JM`6k;%2x^0`dEZMC159YT7H}bRzQfkGhN#> zMi7XindOB@e9F<{U%&R4yQfixm^+&^nY*szF?U%*K*b#0|nfoSg$sxFH+} z<_EARK@Z{NPh0X%W^Ab|I9vszW-vKn<43gg*2Kw&n}@cgYT-q-zJefz!Z?d4xy$m&?hSWRKiL#8o$qEnxH-X$?7N@=` z*{7@|q_n3r78_o|p9M|enAoF(a?}#HOL*?+0RGv^7pThUx#nzpVOBZwa>K6_^9Z>@ zj6;XiAy*ab9jqV<&ZDGtlj+NuF~P<8g3MO`w)b+D3jl+%vXH zs6^&m>b+`702L_Z01x;%Do4S=@a_n_hIHN|Tb+OOiAr=~=d%SY&<~`X@NhCocvA24 z+9dF7;s7-D2>ozOB|)b@-(Mi*6+nBkS(&Xp3Rk5BXs?Q3W2<#p1hA>TSp+UN>F1P% zuegxHNVD?0!V$DlE^7cf>V?WN_vBnG#l}@1@-r!P!D2eSg5d%jp(po}ecPVwBVZ#B zSj35Df8aj``@>zxvI67MVIA1$eTNizVI7HJbx08{aBtHScrUo!TP54FLt39Y!ibcO z=f*i6eK}{|7%)107MV?MwsWLWIDJkZnY2N6>%6mVJDKUhM8pnn&K(Mfi!|Yr*w*1l z8M8Bjhd0s-OlK0;LJ3B@j2_Bxf#f*)&GWI@lScx;D#n6Oy;`yy1P@P4Vgbrsv31*|8iYz2IW-*j^b6zVhm8B|6CHz4x?N z8Te$QrfY(Yn%b*Z$x~ltCGTONzoP5y9Ez`pe_w`jOw6mzs9u&OR0{KO4GcEeRjYV% z^4|^E`xx(M10iNW_eP*@<1Qp`pdj3hgaiaEvHLB86amNtZ}-~>cfTc_5o~q@os9&0 zA4jqKjgdbmuH-}9Bdnv?A!!hngIj~J5P1y|R*J8U2o1JbnnsaNS8=tsNx$~UD$c!4 zY|hcPVoK0>F7J4x<+jC1c}Qty3?JNPImoLkN? z_ddc=OU{DBV$|%by^q7>o8Ih4)$B*P^A)=jgW2cK*C=c~cvWLG`G)1*N3YvG=oWh) zgKn|q60^iDmzW$Ck%hBOD>+CWK3{7`q6djQ6c5t+{Qzk_HS4 zPI8V3-f2&$0wAVjLoOA%YpmZA1lgY0%EBLY@jJ!6!lVU%tgFtMcIqscFI!S-2L25`i^s#Fwc*`VJEL>n+;~iB?v?h<4 z8b&UV%D@;d&w_z4!adA&?tLr-cSo^*i!t!w@@HgCc`Oxg@zlW&VyFkOphk3L3Lr(X z%zRw1B%(g@o6QmxQsj|GaK%X^OBOMTe3qoQxUkILMw^P}F3^XvG#iOL%0{CWxD1k? z)LY8M8_}DePd#kP#f&p-%EhC&H5D$5BqSFxBr|itUyQ@vo?rRelZ(S@&+l+ZF0x5e zF6t&dxhU)CXNFuH-p*n8a&h~IF=g%cW)l-@5GdD4upM5jSbx~J9X{5-C`0NM8GN8# z;V!f^A-MFqgiS_C7sE`d^9VhWfXL|qhy=X9V$xDgV~IrJ-{JN}N($^%zz_CFKz`yt ze=I6&B9O9!O9M?}vjW^9aIyT9T#!hSWGS>bihQ0}5T%UMw<23aeXqqh(|=T}OicBY zf3|8CAH?o!cm%2|8Gt-N$ObsPgT)x7%!l_Vt~a~EIFV^AkaBS@vzQ{WSg=xJ;gu2# zuasEdO2KPGgFGPdyU{X2?agea9&*z2oL)v2FEj`z(9A zox%@KXo38pLk9d~u zT9)E9b{5N`sdq>Ugf3zvqo9&LjSbH|yB$6-^PCCP?lYROT~P|B>+z%2>!Vn-A-7XV zX@Im2DGkWk4=D{)%8XdNuU>2Bu3vlVwa1u4N&}lTl?GiWq%`Pf{Yt}j4a29v?H
    $nQQN-o+@mf$@AI(w)D`i9UPH>M>3ho&DF{XL46HW_wmhJEF_jz?Xxj(%oP*R~GBr>^ZD#?vi1-?bw-|2LJKA3qcw zm8VGhUti;S$5E}g*~-xrDP#U0h~B~zU(ElI0EOp|Tesk1sD})UH%rSKnIw1+>A~EU z57fVm>@C3woVe8)R!?BrL!#pFJowN@5J-u5$pO-L=4~WJ5!@Txk~}X4kJ%}NQ6tEA znjC`}jSV((Q{=FHf~}cQYR(C1y_6mY7n-uHaoZ9Rc(TUfOT%|!;Cq|g#bS6MzqY_H z&A}`mhn|#EwJT^do;!Pg9kn-XLyO|Gj;yzUZoq##xaN?A++m9He$6u7* z^XPs3QPA>p;G1JE4Z^5!ap3Ae8hhEw@`z2GgY4`%l_sOM;-LfnLUT`B11H(J!+>G7?f2v&U zF)a4jz{QT5lOy;8yO!0{@;hOyF5~x+o|Fc=P#+9}EQtBAF*5PpSoe~-V`C1u=RDXt ze&Yiq1?{tRY}`&Dac{f%!{6=l`2zy^-jWKfY2eV{#z_9G zc!h8&K4ieF5v*&5Cgu0|#?@PgDe=1?^Pw+{Q8tgs&oA4~E(l?+qaclE#IrKDS7QA} zF#6wl+&b|m>* zy%0-5#&o2bXT)^8F?d0pO~&xni0}{nN0yGzwwi@a8>xq-QZC3-rm;A+XYkqBCTgg( zY1|qr?Lpj{DlHEC2&uHp!Wjv6>AXFqC6?abrC)n%N|fKf_qgo*>)-v*2jT^boj>xq z4}IVpfAjj^af%i@|N58z@C~2+*q{H_w{dbZd;j~#Klsr9&mC<2oKoE zV}4cXy#XE|x%JBcq$uVi`R?H$vn9Mm%~LzVyN$H35b5l`uMqydkoAkKW36$?J!djG zp694Qn?m{tli$^02;xx~$4CwPd8u$=7Y23=;k7I&_}x`lWw4%gh^B18p&U^zKmVkO zqfW#`mxEgaT^G5z%U8L#dvn+J4#PKsp4r3j8PyiU*aJ*TJ|*|q8GK6br}Nm<;5~NR zI}N@J*#dsjt0_WAu%-y%uuKu6hvi9-r(;;3_ISz`!{RVZXTg)&0olhe_5K|22MCVs z`V8Igd4rSZB6E`@zEKx2%s!BG3=c+|1j&zbT^EjW9cCCS$l5=ITT_-z@U`KdVbsj{ zGTxUwkYqedzuXk0AuVZTOyL+TDlJ~G3x`Gy<2D3RI5aZB*CCLGOpw0efg}SO2;gjq zCH*}qwb-`nOO1cyfh3m%r<9W&tiALucuF0OwT%m9?Uh5FXx3Egu0IBACz_U zvw)gk6zE7P|C5Gtb24TW=S6-{X$m+i5}E?yjyNXr28&lf%S|-)cs`Dr+~nH~g$s>& z{6j^)p}nMO5aWn4o;(q`C5>Zn*o<_);7lC3DKw3#<0-%V;53Q|7GV#l?FgQl4v;=X zkRm4{C%9#gM_68?Vwt$xH3?(d_91d2$%n!)c`*#Z2Dv#in)AOOBLhzq$BS>ayzQw`da=WG*yLjmrGOx$DY>9d$r77*R?d1BJ3a6}&Q-2(&$z z0{^);1(LlgDlA9Tp_iJ@aJU#~+)k44DUc;4g7V}jL3vRQmMWn^fH#M_7HY7v3kr5o z&fH+_!p|<>#E`2h^+u|pbk_J|cu5F9enXD@E)q1U)pSJFasl}PUCfJ6|Z_0#}$?#Wf&hx47*LvSx8*F2701BOQJ=?yT zn*=eNPDQP&0Ayk_qCoZ?L)STxFvuat5Y)Rq{WpB-52@3z!F-ShTNfyt@i@BZ2h*4> zIq43qSKsY<9jt>8W}k|?&j(X_AUC-CNO2yRR`RhhHVrV5Z30LkAET3!O8q)8GlW9( z_Q3zM9%T%M|HEO3`{&;u8_l6@B?lkQ!Q}8vf%Ai#;OZ5pe$0Z%`jfzTX%gR431YqHG7~2vFUB+f$rquPfDEhknwK-iCvM zK_940%0WTwpuW`K!D`Av>GZnhq^ZzDt)jyVK%uzYU~GC+E(FBid743douPsQi&|=F zpH}Lh`Ov`zkzyCTPk$Q$N8Cxo5I^{{fi%8T<@9H>B(jvIEtRGKOISI?+eK=^zw5yx z=jf7Y!l#3UvH=IAqyHn+El>ek@)U4AW>W$81`n^_Mg`m$@q$I|5Oh}-@bIeZ0jJCI z1(a=+qu|?cpsauBG2cmhN9{9DCZ7<&_qfe*F^dz^rT&vsEmgls&RrR27z*?#l$lhv z0U6pwE>r}QEDtcm3QOU=Ozf3Yo_as=Lw6_7r0_-`Wh($0Uw^Y49R5ZE0HJW!?Mdtm z#aSS!x6_tzYb!}r8&zk0INy@(vZ=dlZUMt2>xtj69kNE z1h8B94?J8D;H~fme#nFiAv`4VUNvmx z%jkd4kKD+wxB2K!5?rRW`S>1H_{Q$4f%r}g#P=XPnkoYbNd%^%hdCaLsB*%kgv0=U zQw~soCOAMwA~3_L$M{sq6_oicqfEpv^Kn@Q6V249)TfOyB3vekHAufJ$RuQtI#%*+ zF%kDazmy5214yk9c?ZAri{Ce9QlDh&aM#-ONoV=^2Fp=z575)eZy4Dm+LZd?p=_x6 zN!h}2@fd%x?LGBQ67Ip&r~KyN2rf%Mt6lyAa^BX!rHq`Lz7rgr%Of#?W*F?RVM(T~h8wafoK01oa+54hJ0K<|U~F5HCxT0|RY>aC&- zBEz+PT)d7@!AKqi-K)9TN`v<{W>W<4!D>gS>Jh}B=D2j=N{P`k7VSxb8z*+ zOj@$Y1U|w%$p(P^vgq(kgUN^u5hOW|dajQPf$V=Q!}C~&$ur(6S&YO2^tdkpRz|n} zfEa{#@C*FK$4)-SF<_z}*T0|UFEIXCh7=Dk3b*6pdnFGD=8D1#a9sQY|ARtQCg|)B7k2Qqhf$?L&$Hgchg@f-c z#8n#ExE7cMecPZ05d(`u@(>#Bm((V$Xl=^Iv@Lhd=gnpZ(3gLU`CSCjU;f0`aZk|x>d!y(zkc)EU;gA* zaj*NH(fMDpZ~ZI?ZGK8bh63UUI3}kN{?#GU25G{HyjY5JV4Z2!hr4c8JDCQ!yfrl7y1`*M%MnVS7gO8|B)Yys=D3b6v zf*(+hTyA||e6XHAVlJ5}c#rtm%wE)c)KB*O< zK@ezk;X7$^1}ZJVhU*@TdxIuQ1qm+?@XQ%5a{>z5=u-!iuMu#|%6Sjy7vqxpFYusn zPspSajt2dVeYPjT1V%Q%Vf1V(U9EtgB@Eusl-&a)C0_u<7zp7_sAKif-d8{1V4|2T zfySZv$S)D|wyfSf$!6rSoE8$Ea(wv_D9qup1me`rY=7d5ebDksMP#`GBk5F zKwO?GL;k^zAY+J1y98l&MA@)@AV@J^R4;HE# zfcGXMik)a^lT9VcIIa(y&&oD-M3xWS4OxhtYImncXt=kwum?)g#$JVj6Wl{iEa4ggrT$)Q15V3cMht-n^c#=H^ z7{S2hNTJ`#kz$RrFPp31AE}l6wIPi{Nq_+9loKH)G5r`hCK^9cHtQjH2!a)B>fXD# z#ReBZGS1?Tqlnz4!+P9`mq6!H9-R+fr6EYj=NM2lKywTy!4Yw2g1vyN;`?kG$(Wm) z!N_pi16PwsmQyk!w+f>3ghaBfkjxH;xFZ1!$FX|~(@6I_tuf8*h2S)tVvK-6WHp5j zG)=wrP*)G|ZPvlWNEG>qkh+5fFchWPiqdRFX)q)e3XIVM|76y{zXC&3n(d)LA{t1* zB=sQypElfx1Wjohk$~}gltxSppfpZ^q%?^H#GALIG(BCUeNY+>&LE|c&ag^6I>UIw zbY_fGqMNnTIM|&-;qoAHq0%YF^KBA_!2D@~37X>bfMBfTrv$>W;c3`*C4$-(DoPzIgH+=uS>7jY&wfOXtimKxP z<@@n6cKf4viflvYbr0Q(Gy3AUKYB0mdOumf{rBR_>WQHD$7Jt5FuyKut&e_A?60?1 z*4nG?YHzA{cFnz^g}Y9#Yg=)BWmUT?W0tVu_aKi;%#Vn6q}vs1mN;QqB5LhA>Gr1F z)zhs`dvyh^h=^G0@*O<3V|-WboLuLNu84|L^371xO14&8y;gO3s(z*+Vo`DMOtss( zp}yQYW;AsoGo72x3|YzDkW$8T+p^*%35+e40K^Fq>-MU>^)8@{T2c3&Ru8@sj zTkT`=iC0S&O02b)m#ej9m*rIBD94Ao7!(gnH-#(VmlyNH_@)7T-(EkK#e0C@7qP8~ zXbEw5WZ!bN+nZ{yxt(gS)n1)yR$I$%10crg%k8e)-~dOvy^dR5nNmPon2XWY>e_m5 zNiR|#y1lSHg2PFmQ9?|H=q!Qn1D!I~tT|Dy2t+|EjC70gjCOsq(8rN2nR?{rgE zaZPbcC$7^zzUrjA-wt3aYHq}eN(S5?&P;uOfe@uw-&|paI^Fm54*Ec{hA0y8g zFmgr4ry^t=V0e2-$^J+ra}d#i$dT{#I3i)>$X9mCiht4{#)d(HMV}Wt97un~U?lx- z^osO{GSNR2pq^tH(5+gN{$N6rqTbni{;7?Il)vd{f+Y}1_K${ZVXqbc)=Nma<(sxg z-LSV-H^lrFYK14{rK%FB6++BMeF-hZB9)S8*IjN3s~feheEEvoTWmL8f#J0~)4ldo z!>z5Kq{wZpo`mEdtT})kjF@6R-0r!kwcl&kQ!b_<+8bw~f_c4DA=+4~w%o3t0+Fu? zv33?^Bdt{c57mk7h}d8S#RkPkl&*s-+t)tC{8297VE9TwL34hQ?N(64VqC1zcs@{QkU>o2uXtomO;^3LfuQ>`k4}RKe{{ zRB(KU37G^TbZLEac!P;xwjI(pJ-9dMnaUm6#2p z`U0f?7;uy5>re}Stoyzf{jz_c8Z!`BQ;pe$E{FSJ)qSR5hWmPvnz8;)2P+%{^_-Bx zvHK}>!C8xL)iQ|Il}&({MJE#Py5Ovh?wRCjbrtruyg5s-t39{ZT5&lk02`XF z1RJ)n2{F`wE6l#mRF~l&F}m5y73oXhalctH-y!}6tav^iuv+<*L;>cjJr@=Xoru^U z0yHM^-Gu+3+j=DcPl%O7e0}v4(7ie;*%Ne_)8JyM`eL?Q z)ohP-&#u(k;CEBYt<_Vb9rxt=aZO)mW6WcSv&R z2^Pn+_1u#XXlJLoXIJYJz-qPc+1`$O_qyBdxeX=xWWm(RI=n;fQ~;NiGCFK7S5Ly- zH7ZucIAA4|Q%&eWZ4lhZTD7+bxh6}Di`8hX4xoB&Fvel`o;t){>$IEb!BbSnOH_jk z2HqD{Ek#U@$Y$&9b<*-4aVjo4u_*m*N#o5#l(-(=CkIxo*WGS+iev*~U0K_ENIqU^ zH(JdWx}kq3czKy}fK6dCR!_Rdi!gFo%C`22yY1oCwk{0Q3X^JC!+vWb4y|!))jbom zV_TPjz!k*N)hb|O!`?*0|JUoBwXMs=$~7?sc=AkpeYr6uDJ5QAmU`)Ut=a&QcvBs% zt#{8R8kl6#_|V{qc-^Dcuu(Q5~nFr4}U0rT9BCYmlt82{qa=X1Y&PG?Nt7j!Oc1JOgZWRb4;>S3y zDcNg#^&}CbC_I5HIlwqB25Ey>>6?9__(Ty0X?g zyNg#?BJI=g)4?N{Tt{zy{JNeu|(2xMWc)!Pj$?L%TEhJHIM)#VX| zTzY0>9jJ8emEki${?w}LHijF}8s!xc(s9?jp!8U^K_*~ZSAsl-0HNDCGlaq5Cu&W= z>ZwYqU95H&rvThKN?wib10tZmaep5nX%*Iny)#KJz9f!_D?F9%aID>IcHQ2vb&a9b z1r18Ye(H3qs#_7yqK3UBeqc}&N2AtZPXjZWP+FnU#C zQ|SiSQK=aEV8>vVoa`+QYs_6`U1yjPW`jU%*A>?XJ)@wnPZ|Zu3#W)>F@<4{u}fuo z9=4_j*P!n~GAG2GmqgO6kumH6qYvq=0JjoZe;O38BJ{oiVN}2b$u%W%o@RV_Fk3sY z6oiNrH3E((dBG;-BJYiLpX_}5)}4Vj zl9QZoc3Sp39dAR#1R{D@!n^N|Q+fpr98U1w$K#+ONdb-4=S6E0==+y)?QS|aL&EPK zl51(q`oADG2emAf0km8}vt7=La!`2l`dL)-js5^+$;UjPZW=uI9f+ROhGL`U-s3nI zij6@Ftm8^y2&ixN$s=elj7{IWWdQFfQfT0o!AoI%RSr%{dX##OkCvf!Z_(`>w&36L zT^mNr5b0gY>2_@iTBdj*km{JE{%?RzX8_5DWRdtGe^eU@*J2Zc#6qYE;`+s6F)dCV z1PK3Dl8fTIzi(N8fEH$aAi`>r=b#Dm0;OSy9}$Z~;uKl94H5lEmi5PIX&;f)Jqxu~ zhwY@`7Ps5tkhB+q*T<+*deOPdU@q)3M6H;QQ_qLj!FZ_c#C9Ztm@Yg~2oXZFBft09 zR0~{o$g|>%uGTs(DckGqaxuRf2HUFJJJar*g6v+|=h+KmT9<9Ot1Y)7br@gaNqI_( z7bd31VXEEKYE_)89#8hdma4CJK$i8h82xG!21QRQQl=JY=$vC-yJS^vipyVF8&Le9 zJ?*VF8dMyosEgHFs|_k*0BX^sT#!#zP0fqLw#;=0cmlt9^s#=U-QTS?K0s-nZxYhlJU+h@I6 ziA1*!(wb^DU_7&a!J9k3{+JKVsD@@7&~UW6JODd;N>abjbUgP~GbT3!17endh?M7g|r{M_`^Uvq9g?q#Fj_^?k zPHEF$*+&l2u)k_BVr0+_%J?7>Nl>f8WRh-2#`QYTV8P9>yS0j}5xU1c!sd+9s2yAd zp3vP`#3$R~DsYvJtT((Vqa|=)L&Lr;fR`JZ@L!5WxWyT@5knqhpYSGi?-*=07>^$K z791bG$O^ij#?*EcFM#f(Rp<#8_Jy-ixQYA~m^9=Z;xf_NEn0h^g&w#ZqTnE5P$GV! z4|QV}rpymV7|p4)3W%{K_^nV~36cp5^Xbbnqj+dQ0`uz&N~2JC*2GmotMCX7s-O`B zrb9jsjMq=<49lEXV~?#H|cs%128Im(QowCrEwSPC~Ez{Ce3ardyRHQ zG9EZ#J^QQhN zJNL1%X+7T$3hQ%mk5_rh!aQ8(jd`=RsN+t=ftVI+yS(|B8unO4_ZS;810P|&;OR%Q ziA>PD3HqkJ2cTzdu|LF`fosi;9WdGngY$^_(GBcWCRz2fQ^{jDVVRQEPKG&}6%(yE z<}rbg!U^H47ixhGSy+d=wfPnh0$t8W`T?KP#gv%Q!$@NoW4=pV%-_yIT%;2?ELG$f zFgbpswk4%RNYEfI6cPQH8R5fC1dT-QCRiI6D|TGdDGbTgMzjX?AKu6A;yQAX&cMeB zjn=jh;TY-F15rV`TpT9DPo9tAkA)b1(8vWae4}uf;cG8LAY(Q#daxaza~sVlA){4B zae#~g-l=xvavBkbI2e!hUtut5qX7+v*8=9jx0j7ls+(oFQr%UCH3xyBTk;A?31(j< z0lC@)1Z>|ISwDPMT_4GLzaHj|N78Y5cF<$~1ZT5+*!vQv63=SG6j6nrI((%sJgEIX33rXhoFINLfa4jz3R61kuKVUF6qy8z^ zg&Mw0VFkMyx_(0(?d$s-sq|WpyBc-b_kjA>qU*TXH6(&Bkc{d^)m8&B6xvf12wFi= z1CO(FpS2sc`#KL=xZV)SMtQS0dgLMg1^iaN$T5ocH|-U_9s@gT4s6Ph$VPpmD;ZXS zvH%0a~;F@0Ue7{Uhq1kG-SrwwJ{O*iz@{9q&nQn=txN|>YX=H&Q}V-q;d_eHT^ zexr~Ud`BSo_8H>f(#daVe@45IeitgggAr_$-+VVnem{%$o?$?X`TdllVUaBLkdXY{ z+|UE}F`5JP2(4&;foJ^~7E^)-8&jtI`5d;AhTCdzO(>PpHvtnE@g>brks!tFZpD3v znUv&f`(AO6^(sqeI-rno8g8uwAW2DW*E8F8sW77jr_%1eM&OXzW9zuQZ+NdwNskJG ze5ckuLOIH~JS1{KkLsT~lyFRvNh+q0RH*p8ezLr^gYIJa~+2=z6vFGgH# zLK=Fjo478j)nR7h=$#$v6*gmxVRwhO?_<9efA>pe_T?=|KSZyWdb5Y;kC7Ra!M+g< zr?r!PIdFT(PWGiINrLP;Uo8zKcJ5?fs!YT!ayxgjFL$yp z`_ju;9gv8&lYNPZ`QeR-*~z{Pa#{UU7K6p?WMA%NU+!dIPVHo0?qpx`9G9K!%bn~? z0^&dd=T7!z_ZSz7{4rY{;GL%bn~?q$8T=Oq_T3#7_2Q;I`^ZdGt2Lc#n6oFZ=R3|A}W` z`dN)Ke{-utrmr^>HL=SQ`+ggtL{0t7K44iNN{!;6nNvK#rqQlPP^%-qb~h+946~_@5DJ-jo=lIhmp;{7`vdC zm(N~Lh`O#*?cfhJ@!C;Ys@FTU^`3*Xlv>N7=jf1SPh;0KfxUCJwJJyDA93#B_#}6k z4FgcsmP4#?L$}jiA$L+0mR6QOva3>Gd!I@Hy%RzJdgwyJAoY+%}jU3bI>(fN1 zw|yP>9f(Z-z0+$;nB>t#FtkwLI13%MU!wXa>U!vKvDza_xqH0pfrx$Q#4gYSzIIMyCX3&oxbnB>(e|NJwz?) zLArwH5^}F2q#4WI&<@+ckxC8^billO&%3HUoQf4{PTr?qvaV3 z11GoZ6Oqw24knjGa*L|pT*qv=dPY~OXHf#@aW!0jTDx+1jaC;F!O^?*MQ%gBp7`;e z$yPyA+(*hXT}~13e#$*tYgaoB$34yCG9`7vFeVy0?e&w3Ah4Acx6#5010+|ROVv3m z>wCvJIZd1v2Kc(yOC+J)_9|yw9@D__Z9ZZwMg>+Ei-{|!>Uf2TR})*<4GF9aLYI2; zB=F@Ag-pTg_s&)Bdcxv!IY^wGfRo5D-+;|4;jn;HmuWBauf}HwvUR0iSnC!jbJrR(7X4utaiz z>N=wOJc*8z8Dgt`8ybN0E#!ST>t3=9b$SGF1||^9=k*@XscwXU3zVD;%%**Y5I5Jc zYF#dSbcJ*G$hpq6z$sciwcbn!fUYNt1BGcH3AlZdSdcJiG_V!2&Wpf<2gg%G1oY5L zgb1|sBoQHD(1>6w-zP-ecc1lwVX)c8dfn}G#V9U$vLKE~teuUFfpl=5iv9vfEHj-g zP3Ka4$fFHT;uOQqdbh{t`RR=H`n%<(9P7vL;C7P*2$a(;_e^%dZ(sq(z2OYL4ih_g z1mv{7zoC%Hy1Cq3qgZW}8gr$(J5wq(inT^2Ka(%c%r;81g=W20&5LifKP9Y{g`fE0 zTu%1UU9GM`QuX}Kve_We-OXm7?;j`F&Cc*V8Wxo2(q!i#m;Jj1CGE4t#mr1TKUdEd z=NkEZu90t4#Nrm+m52wdyY4K(DahkEyV(rS=3J0B*^Jc5<)Nc^-s%NCvGsg)ZnjaK z%Ve9)Y$dYQzy|k}_fH%>Z+9*b*r-=?^?H7`p3mkh_FYe9U^6%svTs1y#$4TKilt^fH(Q)(6hR-2MrCOAg1gCPf+LFZQp{#E0gV)RTw&Mk z8&o(?*mo|ZjN zPe0!~`l-SLGG8jcymDkcmpM}H${&)8UTD+PFT;m+UV`0q>z%rL%RAVAlebll~rOa`{|trk<;T&hj(a%E*N;(XB}> zFAoRo>#o?WX6I%y%|f+Qn9a}TE6L7NKxr-;klX?!O1lG2+~^--p_t9qO2ulko|$#? zK@5X31*$CdMsgXWU}Ztz~B* zmP@6|?t3p$Z`nB&w+m=uq1x-~9i-UIG_p`fsx#R_ex|bL-D(D&I_viplP9-QYK3~K zF;jADrRGd6ldo4ME*)NY&chJ4bDniKUgvgDZ&gQCa5qjWkZl;tk&CXQzUpjuIPPkkkkKWjEK3^zg zAP$<%T%($)WhEwo>i%9i|X^$Xq!_Wkr;EjDJFrP(>RP%0Jbjmm-EQ}4DI zbgO(n{j02$bDPDP>RhAHEJ1%PRxZDAj*@G&i<;wRb0%|}^Ly@ z$eXPkJaxfiG<(Y${C(5Ts=2~kvjNg++ZMyJV;kv;GjU&3K zZ$%aBxlA@wo13lW=H`mCrOK79EjsG6ZPY0T1@)6HP#aX&3q0YS=9Oti74rF6Fu}rX z)t$@d@}-`X|rZ zP&QBK3|DwA*Y_Z>_vU6{(au%zU$L3Z)@Liut>!Zg#eib!V%U!>_zlT^H3U?VI-vl7=o&&1W;E!c1`{S2=RY#2%?eZu{xO zbUk0p&lWSaLdk8E@{se_T(T}{^Uz({zo4pf&~`Gj*-{DWPbTM9o^|2ucx$qfI(Xjz z^E0!VLUpcQ%$Kq*jw`ABz$NPq@rQmTz}!J%6Sl*CG#6R%<9bCOfxqJ zofiV4TFO8GY9PX#7r(T$m^AZo76PVAyVNH>qCOu%;k#tEGD2nHxFCZ$)6=)>d#ThtIpqp|!fY*HC_;rUxlk@D**Hznmao?GXp)anXBY3+yguVunLG&!N-%$P*{1_AziGRFI1b=xfvHe z^d`hdW#(lUOe*YQmceBCPv6v6Gu7ED3|{zViq(8^t}^?Ii)uJ8gKW~}FR%KVce4<6 z`C1+JY_nc;OO^b^V+J$jV@6(wF$0C6S#{k^k->#}u~N8jIZn)EXMKuQ15i#H{3$b&6SFk=Uli4Ytx=`vpzPJ9f9~b^lE%~v=6bFLcUpO z6bew}=knQFqw?GfceQWYdp78OP@nmdJ2N|1E#zx6c{unBmFMlz0ni1h;~+lQY@C?e zf^@a@y4LH!UajV;CHOLmvvavp9xmBR`32{#3U{*acu0?_l)G(rPF3SzJI`*J>3bnadXojZCvztmP0j&dgSB zQt-L=u!aZU%?W8nLx|n-+$}m%xDE{P;v!;QwWd3Z$V9&G!i2B9a9p;;z)^Pr?Y$_e zJpsJ=p$nM}N>amnfH7pYt--OhsR`W83U5t-a4*sY0Rt zW4LKHqzwcJerzJRCDBOB_GNp+4?C@si@ok0yZDq}u%Z2gx<4+9c@J2d+b6j0{&Afsj;ElXT*k^$$g+EEmtSQbA$0aM?wbeZ3vdaIV<7d4#FIL-} zr)qw#I8)2d%*@QrG@8{)bwoFa&T8+FnqRiKrI#-#-yaIT1wyup1PN2mtG7Gu^fbQL z+=2GmskV9uG4YP&5Nz^lFfz>aUw~L}5zc~9U2>~bnyQsLrwnUleWm7h8bkn3qjBX0 zCb7v2d;B{o zd1tudyGg_6*<)f%eSu2p`iQ&)-n;JUWETRov2eEKE;r7MXx}7A_nsurn_W<6pPwC; zH#m9u^efdRH_g3jOg{C_ufO*KxIKN9#YKqYdKNsb4zsi5ma3KeEtGBIUM(2vTppzvg6QWE(TpTA}h&7m>+z9=wG-M3^G{4_OpsdN3sCGL_egrAtHz z{ca&pT@kLBLWa~pOW3Xaw767BDcQmXUl0=F;AVrK4iV=f=c-n(yiUC8DGctS{6FZu zI$LiPkknVG!bqQ+tGr&^xJB=Ul`21Fn_oksHkT;0sRD94kU&wW%{Ac%{TcD(Otz2# zwS|=dsSCZlSt`!X=JMH66(PSjh^>?`4RJQ(N|+bcXW-~toGCQsFm$(2Y|dtj&1U6| zVk@`!phogRgA5rhqtzNR4f9YdbFN#T%Y*AqFE5{7na<4?O2zCBbuCFC?B6oT}m8O&|vXP;JZ8nw(!ZYBq_uL%XK zRH(c~yhW;;8I>2LW(%4xz6CWs{Sx`BQ2v8QD%&(;nfz>_fQZ;ky;hs8!ax1iryr&n z5cv$ec{#U$>?th7w>|wZA-$|V0~4}Qgfp`aKjzz?ewd0#;eoMPpRHwGXiLq?JDz@+ z;3&!0+*-cTV5TP=$?tsnVQN-OStR3R=Ss7sLM@lAyi5FBuDi`5A=$ig{FC`gCaD%C zb~oVLomiPK=(Ja!Vghl6sg^$otzc1?x5uOoZled5k1HJDH@zH_0Thmr!TYqnZz$qd^Yw?C-{81~{Wybf($s6< zjXC6F!z=m=;sGv=S+3$4cwk{FApsxp!-chF>>Ar@B^y3hczS#XEXfs%5Xt38U&>cA z8Q9(Vd`)X*S!5#NG4d6%rF>>Kk2vhiFNz=C0+%6AUQy-v>ck$imY3CGp}51v6`I{gLTjP^w|5%d`)8nvpJ*seC~E@RMq9mR2Ta z4lWWT1Ax+Js%|cubt@kfw?3%`^U|Y=77J9%>m{(Qnb~IT|Lg2rRucxIFzk`Gx)Dop zTj;XIrkJbg17z7n-F6X@F^Ui`R9y6ddcR*Du-_z#L}&`Gf=N#1%$dwE=Rf~%+$gw} z-d0caS1=zBb)lSDh-DCKAgNL+xRWxXSYcEOam;IRdW6CZcLxid>Pm#?*f85%9|k?; z)7UO~gYV^XtNwI>*EA!U);bYT7~Hcy5waZTJa{Nwi%Ytbk@t#IBk2s-3_)%463~Nz z8$8O@Ru1R9#m)Ia`NxLKA1lQSBmsMphVGaKl#-A|9RtPO z$(qk6>OuEF@F8CV++36uytQ0hkva2PG z>d-vvqG3EbCOI~}4w8!_f@B+}Wmx7(<+RD?pY=$r^vTtBlj@mf;u^zr8b|58U7wGJ I69ee|7j++#Z~y=R diff --git a/lccp/lccp/wit/kinode.wit b/lccp/lccp/wit/kinode.wit deleted file mode 100644 index caef605..0000000 --- a/lccp/lccp/wit/kinode.wit +++ /dev/null @@ -1,198 +0,0 @@ -package kinode:process@0.7.0; - -interface standard { - // - // System types: - // - - // JSON is passed over WASM boundary as a string. - type json = string; - - type node-id = string; - - // Context, like a message body, is a protocol-defined serialized byte - // array. It is used when building a Request to save information that - // will not be part of a Response, in order to more easily handle - // ("contextualize") that Response. - type context = list; - - record process-id { - process-name: string, - package-name: string, - publisher-node: node-id, - } - - record address { - node: node-id, - process: process-id, - } - - record lazy-load-blob { - mime: option, - bytes: list, - } - - record request { - // set in order to inherit lazy-load-blob from parent message, and if - // expects-response is none, direct response to source of parent. - // also carries forward certain aspects of parent message in kernel, - // see documentation for formal spec and examples. - inherit: bool, - // if some, request expects a response in the given number of seconds - expects-response: option, - body: list, - metadata: option, - capabilities: list, - // to grab lazy-load-blob, use get_blob() - } - - record response { - inherit: bool, - body: list, - metadata: option, - capabilities: list, - // to grab lazy-load-blob, use get_blob() - } - - // A message can be a request or a response. within a response, there is - // a result which surfaces any error that happened because of a request. - // A successful response will contain the context of the request it - // matches, if any was set. - variant message { - request(request), - response(tuple>), - } - - record capability { - issuer: address, - params: json, - } - - // On-exit is a setting that determines what happens when a process - // panics, completes, or otherwise "ends". NOTE: requests should have - // expects-response set to false, will always be set to that by kernel. - variant on-exit { - none, - restart, - requests(list>>), - } - - // Network errors come from trying to send a message to another node. - // A message can fail by timing out, or by the node being entirely - // unreachable (offline). In either case, the message is not delivered - // and the process that sent it receives that message along with any - // assigned context and/or lazy-load-blob, and is free to handle it as it - // sees fit. Note that if the message is a response, the process can - // issue a response again, and it will be directed to the same (remote) - // request as the original. - record send-error { - kind: send-error-kind, - message: message, - lazy-load-blob: option, - } - - enum send-error-kind { - offline, - timeout, - } - - enum spawn-error { - name-taken, - no-file-at-path, - // TODO more here? - } - - // - // System utils: - // - - print-to-terminal: func(verbosity: u8, message: string); - - // - // Process management: - // - - set-on-exit: func(on-exit: on-exit); - - get-on-exit: func() -> on-exit; - - get-state: func() -> option>; - - set-state: func(bytes: list); - - clear-state: func(); - - spawn: func( - name: option, - wasm-path: string, // must be located within package's drive - on-exit: on-exit, - request-capabilities: list, - // note that we are restricting granting to just messaging the - // newly spawned process - grant-capabilities: list, - public: bool - ) -> result; - - // - // Capabilities management: - // - - // Saves the capabilities to persisted process state. - save-capabilities: func(caps: list); - - // Deletes the capabilities from persisted process state. - drop-capabilities: func(caps: list); - - // Gets all capabilities from persisted process state. - our-capabilities: func() -> list; - - // - // Message I/O: - // - - // Ingest next message when it arrives along with its source. - // Almost all long-running processes will call this in a loop. - receive: func() -> - result, tuple>>; - - // Gets lazy-load-blob, if any, of the message we most recently received. - get-blob: func() -> option; - - // Send message(s) to target(s). - send-request: func( - target: address, - request: request, - context: option, - lazy-load-blob: option - ); - - send-requests: func( - requests: list, - option>> - ); - - send-response: func( - response: response, - lazy-load-blob: option - ); - - // Send a single request, then block (internally) until its response. The - // type returned is Message but will always contain Response. - send-and-await-response: func( - target: address, - request: request, - lazy-load-blob: option - ) -> result, send-error>; -} - -world lib { - import standard; -} - -world process { - include lib; - - export init: func(our: string); -} diff --git a/lccp/metadata.json b/lccp/metadata.json deleted file mode 100644 index 6dbb697..0000000 --- a/lccp/metadata.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "lccp", - "description": "", - "image": "", - "properties": { - "package_name": "llm", - "current_version": "0.1.0", - "publisher": "kinode", - "mirrors": [], - "code_hashes": { - "0.1.0": "" - } - }, - "external_url": "", - "animation_url": "" -} diff --git a/lccp/pkg/lccp.wasm b/lccp/pkg/lccp.wasm deleted file mode 100644 index c221d47b7e2ac12e45c99b89014eec57b7d9b6b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725654 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 z 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°pIRNzlGSJWbImHLcgrmP(nt5+P4v;;; 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%0A_x&sGS_uJ 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 NdiPn9bfqc$?(fN&vjcdPJLuLAio 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 - - record process-id { - process-name: string, - package-name: string, - publisher-node: node-id, - } - - record address { - node: node-id, - process: process-id, - } - - record lazy-load-blob { - mime: option, - bytes: list, - } - - record request { - // set in order to inherit lazy-load-blob from parent message, and if - // expects-response is none, direct response to source of parent. - // also carries forward certain aspects of parent message in kernel, - // see documentation for formal spec and examples. - inherit: bool, - // if some, request expects a response in the given number of seconds - expects-response: option, - body: list, - metadata: option, - capabilities: list, - // to grab lazy-load-blob, use get_blob() - } - - record response { - inherit: bool, - body: list, - metadata: option, - capabilities: list, - // to grab lazy-load-blob, use get_blob() - } - - // A message can be a request or a response. within a response, there is - // a result which surfaces any error that happened because of a request. - // A successful response will contain the context of the request it - // matches, if any was set. - variant message { - request(request), - response(tuple>), - } - - record capability { - issuer: address, - params: json, - } - - // On-exit is a setting that determines what happens when a process - // panics, completes, or otherwise "ends". NOTE: requests should have - // expects-response set to false, will always be set to that by kernel. - variant on-exit { - none, - restart, - requests(list>>), - } - - // Network errors come from trying to send a message to another node. - // A message can fail by timing out, or by the node being entirely - // unreachable (offline). In either case, the message is not delivered - // and the process that sent it receives that message along with any - // assigned context and/or lazy-load-blob, and is free to handle it as it - // sees fit. Note that if the message is a response, the process can - // issue a response again, and it will be directed to the same (remote) - // request as the original. - record send-error { - kind: send-error-kind, - message: message, - lazy-load-blob: option, - } - - enum send-error-kind { - offline, - timeout, - } - - enum spawn-error { - name-taken, - no-file-at-path, - // TODO more here? - } - - // - // System utils: - // - - print-to-terminal: func(verbosity: u8, message: string); - - // - // Process management: - // - - set-on-exit: func(on-exit: on-exit); - - get-on-exit: func() -> on-exit; - - get-state: func() -> option>; - - set-state: func(bytes: list); - - clear-state: func(); - - spawn: func( - name: option, - wasm-path: string, // must be located within package's drive - on-exit: on-exit, - request-capabilities: list, - // note that we are restricting granting to just messaging the - // newly spawned process - grant-capabilities: list, - public: bool - ) -> result; - - // - // Capabilities management: - // - - // Saves the capabilities to persisted process state. - save-capabilities: func(caps: list); - - // Deletes the capabilities from persisted process state. - drop-capabilities: func(caps: list); - - // Gets all capabilities from persisted process state. - our-capabilities: func() -> list; - - // - // Message I/O: - // - - // Ingest next message when it arrives along with its source. - // Almost all long-running processes will call this in a loop. - receive: func() -> - result, tuple>>; - - // Gets lazy-load-blob, if any, of the message we most recently received. - get-blob: func() -> option; - - // Send message(s) to target(s). - send-request: func( - target: address, - request: request, - context: option, - lazy-load-blob: option - ); - - send-requests: func( - requests: list, - option>> - ); - - send-response: func( - response: response, - lazy-load-blob: option - ); - - // Send a single request, then block (internally) until its response. The - // type returned is Message but will always contain Response. - send-and-await-response: func( - target: address, - request: request, - lazy-load-blob: option - ) -> result, send-error>; -} - -world lib { - import standard; -} - -world process { - include lib; - - export init: func(our: string); -} diff --git a/openai/openai/src/helpers.rs b/openai/src/helpers.rs similarity index 100% rename from openai/openai/src/helpers.rs rename to openai/src/helpers.rs diff --git a/openai/openai/src/lib.rs b/openai/src/lib.rs similarity index 100% rename from openai/openai/src/lib.rs rename to openai/src/lib.rs diff --git a/openai/openai/src/structs.rs b/openai/src/structs.rs similarity index 100% rename from openai/openai/src/structs.rs rename to openai/src/structs.rs diff --git a/openai/pkg/manifest.json b/pkg/manifest.json similarity index 100% rename from openai/pkg/manifest.json rename to pkg/manifest.json diff --git a/openai/pkg/scripts.json b/pkg/scripts.json similarity index 100% rename from openai/pkg/scripts.json rename to pkg/scripts.json diff --git a/openai/router/Cargo.toml b/router/Cargo.toml similarity index 100% rename from openai/router/Cargo.toml rename to router/Cargo.toml diff --git a/openai/router/src/lib.rs b/router/src/lib.rs similarity index 100% rename from openai/router/src/lib.rs rename to router/src/lib.rs diff --git a/openai/run_job/Cargo.toml b/run_job/Cargo.toml similarity index 100% rename from openai/run_job/Cargo.toml rename to run_job/Cargo.toml diff --git a/openai/run_job/src/lib.rs b/run_job/src/lib.rs similarity index 91% rename from openai/run_job/src/lib.rs rename to run_job/src/lib.rs index bec7ddb..7e0e1d7 100644 --- a/openai/run_job/src/lib.rs +++ b/run_job/src/lib.rs @@ -1,6 +1,6 @@ -use crate::kinode::process::driver::{ClientRequest, ClientResponse, RunJobRequestParams, ToClientRequest, ToClientResponse}; +use crate::kinode::process::driver::{ClientRequest, ClientResponse, RunJobRequestParams, ToClientRequest}; use kinode_process_lib::{ - await_next_message_body, call_init, get_blob, println, Address, OnExit, Request, + await_next_message_body, call_init, get_blob, println, Address, Request, }; wit_bindgen::generate!({ @@ -11,9 +11,7 @@ wit_bindgen::generate!({ }); const PUBLISHER: &str = "nick1udwig.os"; -//const PROCESS_NAME: &str = "driver"; const SCRIPT_NAME: &str = "run_job"; -const ROUTER_PATH: &str = "llm_provider:nick1udwig.os/pkg/router.wasm"; call_init!(init); fn init(our: Address) { From bc10f37b9ea78840111b1b7af9b40a9ef4ad7da3 Mon Sep 17 00:00:00 2001 From: "nick.kino" <79381743+nick1udwig@users.noreply.github.com> Date: Thu, 23 May 2024 13:48:07 -0700 Subject: [PATCH 06/12] Update README.md --- README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a67bc4..e7a4a55 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# LLM +![240523-remote](https://github.com/kinode-dao/llm/assets/79381743/68f4aa27-1499-40bf-9df9-be920a759313)![240523-local](https://github.com/kinode-dao/llm/assets/79381743/7a403479-e4af-41b3-9fbb-d37c67dd20a7)![240523-local](https://github.com/kinode-dao/llm/assets/79381743/0806f949-0736-4e96-9ea9-a01871f2cfd0)# LLM Kinode processes for interacting with & serving LLMs. @@ -88,7 +88,14 @@ kit s $ROUTER_PORT && kit s $DRIVER_PORT && kit s $CLIENT_PORT admin:llm_provider:nick1udwig.os "StartRouter" # Set driver to use router (driver node terminal). +# All drivers must point to the router: both clients and providers. admin:llm_provider:nick1udwig.os {"SetRouter": {"node": "fake.dev"}} + +# Set an OpenAI API provider (driver node terminal). +# NOTE: Replace the `8080` port here with $LLAMAFILE_PORT +m our@openai:llm_provider:nick1udwig.os '{"RegisterOaiProviderEndpoint": {"endpoint": "http://127.0.0.1:8080/v1"}}' + +# Set driver to use router (driver node terminal). admin:llm_provider:nick1udwig.os {"SetLocalDriver": {"model": "llama3-8b", "is_public": true}} # Send jobs from inside Kinode (client node terminal). @@ -101,3 +108,16 @@ kit i driver:llm_provider:nick1udwig.os '{"RunJob": {"model": "llama3-8b", "prom ## Architecture +Clients send Requests to the `driver:llm_provider:nick1udwig.os` process. +If connected to an LLM, e.g. via +``` +m our@openai:llm_provider:nick1udwig.os '{"RegisterOaiProviderEndpoint": {"endpoint": "http://127.0.0.1:8080/v1"}}' +admin:llm_provider:nick1udwig.os {"SetLocalDriver": {"model": "llama3-8b", "is_public": true}} +``` +`driver` will serve the Request locally by passing it to `openai:llm_provider:nick1udwig.os`, which in turn passes it to the registered OpenAI API provider (here, a llamafile server). + +![240523-local](https://github.com/kinode-dao/llm/assets/79381743/5f071ed2-91be-45e1-81d3-0de6a176d4fd) + +If not connected to an LLM, `driver` will contact the `router_node` it has been set to coordinate with and that `router` will forward the Request to a `driver` that has registered as serving the appropriate model. + +![240523-remote](https://github.com/kinode-dao/llm/assets/79381743/8bd2006c-9bae-434b-b2d5-90ceeb99eb4f) From 7b96339ee603f68579da87504825b24bb82fe1cd Mon Sep 17 00:00:00 2001 From: "nick.kino" <79381743+nick1udwig@users.noreply.github.com> Date: Thu, 23 May 2024 13:49:43 -0700 Subject: [PATCH 07/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7a4a55..27ad3b4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![240523-remote](https://github.com/kinode-dao/llm/assets/79381743/68f4aa27-1499-40bf-9df9-be920a759313)![240523-local](https://github.com/kinode-dao/llm/assets/79381743/7a403479-e4af-41b3-9fbb-d37c67dd20a7)![240523-local](https://github.com/kinode-dao/llm/assets/79381743/0806f949-0736-4e96-9ea9-a01871f2cfd0)# LLM +# LLM Kinode processes for interacting with & serving LLMs. From b65f07b7c9bc29b585ad93ca66175e5982d7fb76 Mon Sep 17 00:00:00 2001 From: "nick.kino" <79381743+nick1udwig@users.noreply.github.com> Date: Thu, 23 May 2024 13:52:45 -0700 Subject: [PATCH 08/12] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 27ad3b4..45a2156 100644 --- a/README.md +++ b/README.md @@ -116,8 +116,8 @@ admin:llm_provider:nick1udwig.os {"SetLocalDriver": {"model": "llama3-8b", "is_p ``` `driver` will serve the Request locally by passing it to `openai:llm_provider:nick1udwig.os`, which in turn passes it to the registered OpenAI API provider (here, a llamafile server). -![240523-local](https://github.com/kinode-dao/llm/assets/79381743/5f071ed2-91be-45e1-81d3-0de6a176d4fd) +![240523-local](https://github.com/kinode-dao/llm/assets/79381743/47b1c23c-03db-4076-a61f-5e037c66d848) If not connected to an LLM, `driver` will contact the `router_node` it has been set to coordinate with and that `router` will forward the Request to a `driver` that has registered as serving the appropriate model. -![240523-remote](https://github.com/kinode-dao/llm/assets/79381743/8bd2006c-9bae-434b-b2d5-90ceeb99eb4f) +![240523-remote](https://github.com/kinode-dao/llm/assets/79381743/3f87f855-81db-4c08-ad84-a63827c23b16) From 17cd4cf657cc9dcf18751906b660f6815ded3a3e Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Thu, 23 May 2024 14:17:56 -0700 Subject: [PATCH 09/12] dont discriminate based on model served --- router/src/lib.rs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/router/src/lib.rs b/router/src/lib.rs index 6248018..439e673 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -176,15 +176,21 @@ fn handle_client_request( Response::new() .body(ClientResponse::RunJob(Ok(job_id.clone()))) .send()?; + // TODO: discriminate based on model here and in + // DriverRequest::SetIsAvailable, below + // let num_hosting_model: Vec<(String, String)> = state.available_drivers + // .iter() + // .filter_map(|(node, model)| { + // if &job.model != model { + // None + // } else { + // Some((node.clone(), model.clone())) + // } + // }) + // .collect(); let num_hosting_model: Vec<(String, String)> = state.available_drivers .iter() - .filter_map(|(node, model)| { - if &job.model != model { - None - } else { - Some((node.clone(), model.clone())) - } - }) + .map(|(n, m)| (n.clone(), m.clone())) .collect(); if num_hosting_model.is_empty() { // no available drivers -> add to queue @@ -204,10 +210,10 @@ fn handle_client_request( num_rejections: 0, num_queried: num_hosting_model.len() as u32, }); - for (member, model) in permute(num_hosting_model, &mut state.rng) { - if job.model != model { - continue; - } + for (member, _model) in permute(num_hosting_model, &mut state.rng) { + // if job.model != model { + // continue; + // } let address = Address::new(member.clone(), process_id.clone()); Request::to(address.clone()) .body(RouterRequest::QueryReady) From 05f5289c9fa8619327b4add55d4c4acbea8f130e Mon Sep 17 00:00:00 2001 From: "nick.kino" <79381743+nick1udwig@users.noreply.github.com> Date: Thu, 23 May 2024 14:43:26 -0700 Subject: [PATCH 10/12] Update README.md --- README.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/README.md b/README.md index 45a2156..13ba07f 100644 --- a/README.md +++ b/README.md @@ -121,3 +121,44 @@ admin:llm_provider:nick1udwig.os {"SetLocalDriver": {"model": "llama3-8b", "is_p If not connected to an LLM, `driver` will contact the `router_node` it has been set to coordinate with and that `router` will forward the Request to a `driver` that has registered as serving the appropriate model. ![240523-remote](https://github.com/kinode-dao/llm/assets/79381743/3f87f855-81db-4c08-ad84-a63827c23b16) + +## Future work / extensions + +### On-chain coordination, payment, etc. + +There are multiple ways on-chain compute & data could be used here. +A few examples are: +1. Payment for services rendered, +2. Coordination of router(s) and drivers to improve quality of service by kicking out bad actors, +3. Gating based on on-chain data. + +An example of 2 can be seen in the following repos: +* https://github.com/nick1udwig/provider-dao-contract +* https://github.com/nick1udwig/provider_dao_router +* https://github.com/nick1udwig/comfyui_provider +* https://github.com/nick1udwig/comfyui_client + +### Gate based on arbitrary conditions + +The `router` is the natural place to gate requests based on arbitrary conditions. +Upon receiving a `ClientRequest::RunJob`, execute arbitrary logic to determine if the requestor should be served or not. +This logic might look like: +1. Comparison with an in-memory `Vec` of allowed nodes, +2. Checking if the requestor holds a certain NFT, +3. Checking if the requestor has paid into an escrow contract, +to list a few examples. + +### Chunked/non-final `JobUpdate`s + +Currently, one `JobUpdate` is sent as a result of a request. +That is the final output of the LLM. +Instead, `JobUpdate`s could be sent as they arrive and a job would only be considered complete once `is_final = true`. +This gets around a limitation of the current system which is that the request must be completed within 60s. + +### Queue for driver + +The `driver` currently only allows one outstanding job at a time. + +### Discriminate based on model + +Currently the code the discriminate based on model (i.e. only pass requests specifying a given model to providers serving that specific model) is commented out. From 291f4b536fb963ea7c91de8b0360475a8e774166 Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Thu, 23 May 2024 16:11:58 -0700 Subject: [PATCH 11/12] fix openai process --- Cargo.lock | 188 ++++++---------------------------------------- openai/Cargo.toml | 4 +- openai/src/lib.rs | 5 +- 3 files changed, 28 insertions(+), 169 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e4ea67..19dd6e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,11 +22,11 @@ name = "admin" version = "0.1.0" dependencies = [ "anyhow", - "kinode_process_lib 0.6.1", + "kinode_process_lib", "process_macros", "serde", "serde_json", - "wit-bindgen 0.24.0", + "wit-bindgen", ] [[package]] @@ -679,7 +679,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bincode", - "kinode_process_lib 0.6.1", + "kinode_process_lib", "llm_interface", "process_macros", "rand 0.8.5", @@ -690,7 +690,7 @@ dependencies = [ "thiserror", "url 2.5.0", "uuid", - "wit-bindgen 0.24.0", + "wit-bindgen", ] [[package]] @@ -1137,27 +1137,6 @@ dependencies = [ "sha3-asm", ] -[[package]] -name = "kinode_process_lib" -version = "0.6.0" -source = "git+https://github.com/kinode-dao/process_lib?tag=v0.6.0#ccf9db2493ec1e112f9146994f852b7bb119dbb6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-types", - "alloy-transport", - "anyhow", - "bincode", - "http", - "mime_guess 2.0.4", - "rand 0.8.5", - "serde", - "serde_json", - "thiserror", - "url 2.5.0", - "wit-bindgen 0.17.0", -] - [[package]] name = "kinode_process_lib" version = "0.6.1" @@ -1177,7 +1156,7 @@ dependencies = [ "serde_json", "thiserror", "url 2.5.0", - "wit-bindgen 0.24.0", + "wit-bindgen", ] [[package]] @@ -1420,12 +1399,12 @@ version = "0.1.0" dependencies = [ "anyhow", "bincode", - "kinode_process_lib 0.6.0", + "kinode_process_lib", "llm_interface", "multipart", "serde", "serde_json", - "wit-bindgen 0.17.0", + "wit-bindgen", ] [[package]] @@ -1900,13 +1879,13 @@ version = "0.1.0" dependencies = [ "anyhow", "bincode", - "kinode_process_lib 0.6.1", + "kinode_process_lib", "process_macros", "rand 0.8.5", "rand_pcg 0.3.1", "serde", "serde_json", - "wit-bindgen 0.24.0", + "wit-bindgen", ] [[package]] @@ -1944,11 +1923,11 @@ name = "run_job" version = "0.1.0" dependencies = [ "anyhow", - "kinode_process_lib 0.6.1", + "kinode_process_lib", "process_macros", "serde", "serde_json", - "wit-bindgen 0.24.0", + "wit-bindgen", ] [[package]] @@ -2625,15 +2604,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "wasm-encoder" -version = "0.41.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae" -dependencies = [ - "leb128", -] - [[package]] name = "wasm-encoder" version = "0.202.0" @@ -2643,22 +2613,6 @@ dependencies = [ "leb128", ] -[[package]] -name = "wasm-metadata" -version = "0.10.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ebaa7bd0f9e7a5e5dd29b9a998acf21c4abed74265524dd7e85934597bfb10" -dependencies = [ - "anyhow", - "indexmap", - "serde", - "serde_derive", - "serde_json", - "spdx", - "wasm-encoder 0.41.2", - "wasmparser 0.121.2", -] - [[package]] name = "wasm-metadata" version = "0.202.0" @@ -2671,19 +2625,8 @@ dependencies = [ "serde_derive", "serde_json", "spdx", - "wasm-encoder 0.202.0", - "wasmparser 0.202.0", -] - -[[package]] -name = "wasmparser" -version = "0.121.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" -dependencies = [ - "bitflags 2.5.0", - "indexmap", - "semver 1.0.22", + "wasm-encoder", + "wasmparser", ] [[package]] @@ -2813,15 +2756,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.17.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=21a46c7#21a46c774532da99384f7a1877c1fcfb7a4c72d3" -dependencies = [ - "bitflags 2.5.0", - "wit-bindgen-rust-macro 0.17.0", -] - [[package]] name = "wit-bindgen" version = "0.24.0" @@ -2829,17 +2763,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fb4e7653763780be47e38f479e9aa83c768aa6a3b2ed086dc2826fdbbb7e7f5" dependencies = [ "wit-bindgen-rt", - "wit-bindgen-rust-macro 0.24.0", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.17.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=21a46c7#21a46c774532da99384f7a1877c1fcfb7a4c72d3" -dependencies = [ - "anyhow", - "wit-component 0.20.3", - "wit-parser 0.13.2", + "wit-bindgen-rust-macro", ] [[package]] @@ -2849,7 +2773,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b67e11c950041849a10828c7600ea62a4077c01e8af72e8593253575428f91b" dependencies = [ "anyhow", - "wit-parser 0.202.0", + "wit-parser", ] [[package]] @@ -2861,18 +2785,6 @@ dependencies = [ "bitflags 2.5.0", ] -[[package]] -name = "wit-bindgen-rust" -version = "0.17.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=21a46c7#21a46c774532da99384f7a1877c1fcfb7a4c72d3" -dependencies = [ - "anyhow", - "heck", - "wasm-metadata 0.10.20", - "wit-bindgen-core 0.17.0", - "wit-component 0.20.3", -] - [[package]] name = "wit-bindgen-rust" version = "0.24.0" @@ -2882,23 +2794,9 @@ dependencies = [ "anyhow", "heck", "indexmap", - "wasm-metadata 0.202.0", - "wit-bindgen-core 0.24.0", - "wit-component 0.202.0", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.17.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=21a46c7#21a46c774532da99384f7a1877c1fcfb7a4c72d3" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn 2.0.65", - "wit-bindgen-core 0.17.0", - "wit-bindgen-rust 0.17.0", - "wit-component 0.20.3", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", ] [[package]] @@ -2911,27 +2809,8 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.65", - "wit-bindgen-core 0.24.0", - "wit-bindgen-rust 0.24.0", -] - -[[package]] -name = "wit-component" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4436190e87b4e539807bcdcf5b817e79d2e29e16bc5ddb6445413fe3d1f5716" -dependencies = [ - "anyhow", - "bitflags 2.5.0", - "indexmap", - "log 0.4.21", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder 0.41.2", - "wasm-metadata 0.10.20", - "wasmparser 0.121.2", - "wit-parser 0.13.2", + "wit-bindgen-core", + "wit-bindgen-rust", ] [[package]] @@ -2947,27 +2826,10 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "wasm-encoder 0.202.0", - "wasm-metadata 0.202.0", - "wasmparser 0.202.0", - "wit-parser 0.202.0", -] - -[[package]] -name = "wit-parser" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "316b36a9f0005f5aa4b03c39bc3728d045df136f8c13a73b7db4510dec725e08" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log 0.4.21", - "semver 1.0.22", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", ] [[package]] @@ -2985,7 +2847,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser 0.202.0", + "wasmparser", ] [[package]] diff --git a/openai/Cargo.toml b/openai/Cargo.toml index f906325..584f39d 100644 --- a/openai/Cargo.toml +++ b/openai/Cargo.toml @@ -6,12 +6,12 @@ edition = "2021" [dependencies] anyhow = "1.0" bincode = "1.3.3" -kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.0" } +kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.1" } llm_interface = { git = "https://github.com/kinode-dao/llm/", branch = "hf/interface" } multipart = "0.18.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "21a46c7" } +wit-bindgen = "0.24.0" [lib] crate-type = ["cdylib"] diff --git a/openai/src/lib.rs b/openai/src/lib.rs index 5d1a86a..88ee2cb 100644 --- a/openai/src/lib.rs +++ b/openai/src/lib.rs @@ -22,11 +22,8 @@ const DEFAULT_TIMEOUT_SECONDS: u16 = 30; const OAI_PROVIDER_TIMEOUT_SECONDS: u16 = 60; wit_bindgen::generate!({ - path: "wit", + path: "target/wit", world: "process", - exports: { - world: Component, - }, }); fn handle_response(context: &[u8]) -> anyhow::Result<()> { From ad4d1e8c24fa4c5a4c02a4b151b73064fc8e40b7 Mon Sep 17 00:00:00 2001 From: "nick.kino" <79381743+nick1udwig@users.noreply.github.com> Date: Thu, 23 May 2024 16:15:10 -0700 Subject: [PATCH 12/12] Update README.md --- README.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 13ba07f..326c333 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,6 @@ curl -L -o Meta-Llama-3-8B-Instruct-Q8_0.gguf https://huggingface.co/lmstudio-co # Note the port; below we assume it is 8080. cd $LLAMAFILE_PATH ./llamafile-${LLAMAFILE_VERSION} -m Meta-Llama-3-8B-Instruct-Q8_0.gguf --server --mlock --nobrowser -export LLAMAFILE_PORT=8080 ``` ### Get kit & Kinode core develop (requires 0.8.0). @@ -36,6 +35,7 @@ cargo install --git https://github.com/kinode-dao/kit --branch develop # Get Kinode core develop. export KINODE_PATH=$(realpath ~/kinode) +mkdir -p $KINODE_PATH cd $KINODE_PATH git clone git@github.com:kinode-dao/kinode.git @@ -61,15 +61,25 @@ git checkout hf/llm-provider # * second's driver, # * llamafile, # * back again. +export KINODE_PATH=$(realpath ~/kinode) export ROUTER_PORT=8081 export DRIVER_PORT=8082 export CLIENT_PORT=8083 +# The first fake node to be booted will compile Kinode core, which will take some time. kit f --runtime-path ${KINODE_PATH}/kinode --port $ROUTER_PORT # In a new terminal: +export KINODE_PATH=$(realpath ~/kinode) +export ROUTER_PORT=8081 +export DRIVER_PORT=8082 +export CLIENT_PORT=8083 kit f -r ${KINODE_PATH}/kinode -h /tmp/kinode-fake-node-2 -p $DRIVER_PORT -f fake2.dev # In a third terminal: +export KINODE_PATH=$(realpath ~/kinode) +export ROUTER_PORT=8081 +export DRIVER_PORT=8082 +export CLIENT_PORT=8083 kit f -r ${KINODE_PATH}/kinode -h /tmp/kinode-fake-node-3 -p $CLIENT_PORT -f fake3.dev ``` @@ -78,7 +88,7 @@ kit f -r ${KINODE_PATH}/kinode -h /tmp/kinode-fake-node-3 -p $CLIENT_PORT -f fak ``` cd ${KINODE_PATH}/llm kit b -kit s $ROUTER_PORT && kit s $DRIVER_PORT && kit s $CLIENT_PORT +kit s -p $ROUTER_PORT && kit s -p $DRIVER_PORT && kit s -p $CLIENT_PORT ``` ### Configure routers, drivers, clients. @@ -101,9 +111,6 @@ admin:llm_provider:nick1udwig.os {"SetLocalDriver": {"model": "llama3-8b", "is_p # Send jobs from inside Kinode (client node terminal). admin:llm_provider:nick1udwig.os {"SetRouter": {"node": "fake.dev"}} run_job:llm_provider:nick1udwig.os llama3 How much wood could a woodchuck chuck? Be concise. - -# Send jobs from outside Kinode (unix terminal). -kit i driver:llm_provider:nick1udwig.os '{"RunJob": {"model": "llama3-8b", "prompt": "What is the funniest book in the Bible? Be concise."}}' -p $CLIENT_PORT ``` ## Architecture