mesh_llm_api_server/
discover.rs1use crate::{InviteToken, MeshApiError, MeshNode, MeshNodeBuilder, OwnerKeypair};
2pub use mesh_llm_api_client::{AutoConnectResult, create_auto_client, discover_public_meshes};
3use mesh_llm_api_client::{PublicMesh, PublicMeshQuery};
4
5pub struct AutoNodeResult {
6 pub node: MeshNode,
7 pub selected_mesh: PublicMesh,
8}
9
10pub async fn create_auto_node(
11 owner_keypair: OwnerKeypair,
12 query: PublicMeshQuery,
13) -> Result<AutoNodeResult, MeshApiError> {
14 let mesh = select_public_mesh(query).await?;
15 let node = MeshNodeBuilder::from_public_mesh(owner_keypair, &mesh)?.build()?;
16 Ok(AutoNodeResult {
17 node,
18 selected_mesh: mesh,
19 })
20}
21
22impl MeshNodeBuilder {
23 pub fn from_public_mesh(
24 owner_keypair: OwnerKeypair,
25 mesh: &PublicMesh,
26 ) -> Result<Self, MeshApiError> {
27 let token = mesh
28 .invite_token
29 .parse::<InviteToken>()
30 .map_err(|message| MeshApiError::InvalidInviteToken { message })?;
31 Ok(MeshNode::builder().identity(owner_keypair).join(token))
32 }
33}
34
35async fn select_public_mesh(query: PublicMeshQuery) -> Result<PublicMesh, MeshApiError> {
36 mesh_llm_api_client::select_public_mesh(query).await
37}
38
39#[cfg(test)]
40mod tests {
41 use super::PublicMesh;
42
43 #[test]
44 fn public_mesh_can_build_node_builder() {
45 let mesh = PublicMesh {
46 invite_token: "mesh-test:abc123".to_string(),
47 serving: vec!["Qwen".to_string()],
48 wanted: vec![],
49 on_disk: vec![],
50 total_vram_bytes: 32_000_000_000,
51 node_count: 2,
52 client_count: 1,
53 max_clients: 0,
54 name: Some("mesh-llm".to_string()),
55 region: Some("AU".to_string()),
56 mesh_id: Some("mesh-1".to_string()),
57 publisher_npub: "npub1test".to_string(),
58 published_at: 1,
59 expires_at: Some(2),
60 };
61 let owner_keypair = crate::OwnerKeypair::generate();
62 let builder = crate::MeshNodeBuilder::from_public_mesh(owner_keypair, &mesh);
63 assert!(builder.is_ok());
64 }
65}