Skip to main content

mesh_llm_api_server/
discover.rs

1use 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}