search functionality

This commit is contained in:
2024-12-13 16:55:56 -06:00
parent ca1ab2f16b
commit 81a9d1f315
4 changed files with 219 additions and 17 deletions

151
api/search.go Normal file
View File

@@ -0,0 +1,151 @@
package api
import (
"encoding/json"
"net/http"
)
type ComparableInteger struct {
eq *int `json:"eq,omitempty"`
lt *int `json:"lt,omitempty"`
le *int `json:"le,omitempty"`
gt *int `json:"gt,omitempty"`
ge *int `json:"ge,omitempty"`
}
type ComparableFloat struct {
eq *float64 `json:"eq,omitempty"`
lt *float64 `json:"lt,omitempty"`
le *float64 `json:"le,omitempty"`
gt *float64 `json:"gt,omitempty"`
ge *float64 `json:"ge,omitempty"`
}
type AdvancedSearch struct {
Verified *bool `json:"verified,omitempty"`
ComputeCap *ComparableInteger `json:"compute_cap,omitempty"`
DiskSpace *ComparableInteger `json:"disk_space,omitempty"`
Order []string `json:"order,omitempty"`
Type string `json:"type,omitempty"`
BwNVLink *ComparableInteger `json:"bw_nvlink,omitempty"`
CPUCores *ComparableInteger `json:"cpu_cores,omitempty"`
CPUCoresEffective *ComparableInteger `json:"cpu_cores_effective,omitempty"`
CPURam *ComparableInteger `json:"cpu_ram,omitempty"`
CudaVers *ComparableInteger `json:"cuda_vers,omitempty"`
DirectPortCount *ComparableInteger `json:"direct_port_count,omitempty"`
DiskBw *ComparableFloat `json:"disk_bw,omitempty"`
DLPerf *ComparableFloat `json:"dlperf,omitempty"`
DLPerfUSD *ComparableFloat `json:"dlperf_usd,omitempty"`
DPH *ComparableFloat `json:"dph,omitempty"`
DriverVersion *string `json:"driver_version,omitempty"`
Duration *ComparableFloat `json:"duration,omitempty"`
External *bool `json:"external,omitempty"`
FlopsUSD *ComparableFloat `json:"flops_usd,omitempty"`
GPUMemBw *ComparableFloat `json:"gpu_mem_bw,omitempty"`
GPUName *string `json:"gpu_name,omitempty"`
GPURam *ComparableInteger `json:"gpu_ram,omitempty"`
GPUFrac *ComparableFloat `json:"gpu_frac,omitempty"`
HasAVX *bool `json:"has_avx,omitempty"`
ID *ComparableInteger `json:"id,omitempty"`
InetDown *ComparableFloat `json:"inet_down,omitempty"`
InetDownCost *ComparableFloat `json:"inet_down_cost,omitempty"`
InetUp *ComparableFloat `json:"inet_up,omitempty"`
InetUpCost *ComparableFloat `json:"inet_up_cost,omitempty"`
MachineID *ComparableInteger `json:"machine_id,omitempty"`
MinBid *ComparableFloat `json:"min_bid,omitempty"`
NumGPUs *ComparableInteger `json:"num_gpus,omitempty"`
PCIGen *ComparableInteger `json:"pci_gen,omitempty"`
PCIeBw *ComparableFloat `json:"pcie_bw,omitempty"`
Reliability *ComparableFloat `json:"reliability,omitempty"`
Rentable *bool `json:"rentable,omitempty"`
Rented *bool `json:"rented,omitempty"`
StorageCost *ComparableFloat `json:"storage_cost,omitempty"`
TotalFlops *ComparableFloat `json:"total_flops,omitempty"`
}
func NewSearch() *AdvancedSearch {
return &AdvancedSearch{
Rented: Pointer(false),
}
}
type Offer struct {
IsBid bool `json:"is_bid"`
InetUpBilled *float64 `json:"inet_up_billed"`
InetDownBilled *float64 `json:"inet_down_billed"`
External bool `json:"external"`
Webpage *string `json:"webpage"`
Logo string `json:"logo"`
Rentable bool `json:"rentable"`
ComputeCap int `json:"compute_cap"`
DriverVersion string `json:"driver_version"`
CudaMaxGood int `json:"cuda_max_good"`
MachineID int `json:"machine_id"`
HostingType *string `json:"hosting_type"`
PublicIPAddr string `json:"public_ipaddr"`
Geolocation string `json:"geolocation"`
FlopsPerDPHTotal float64 `json:"flops_per_dphtotal"`
DLPerfPerDPHTotal float64 `json:"dlperf_per_dphtotal"`
Reliability2 float64 `json:"reliability2"`
HostRunTime int `json:"host_run_time"`
HostID int `json:"host_id"`
ID int `json:"id"`
BundleID int `json:"bundle_id"`
NumGPUs int `json:"num_gpus"`
TotalFlops float64 `json:"total_flops"`
MinBid float64 `json:"min_bid"`
DPHBase float64 `json:"dph_base"`
DPHTotal float64 `json:"dph_total"`
GPUName string `json:"gpu_name"`
GPURam int `json:"gpu_ram"`
GPUDisplayActive bool `json:"gpu_display_active"`
GPUMemBw float64 `json:"gpu_mem_bw"`
BwNVLink int `json:"bw_nvlink"`
DirectPortCount int `json:"direct_port_count"`
GPULanes int `json:"gpu_lanes"`
PCIeBw float64 `json:"pcie_bw"`
PCIGen int `json:"pci_gen"`
DLPerf float64 `json:"dlperf"`
CPUName string `json:"cpu_name"`
MoboName string `json:"mobo_name"`
CPURam int `json:"cpu_ram"`
CPUCores int `json:"cpu_cores"`
CPUCoresEffective int `json:"cpu_cores_effective"`
GPUFrac float64 `json:"gpu_frac"`
HasAVX int `json:"has_avx"`
DiskSpace float64 `json:"disk_space"`
DiskName string `json:"disk_name"`
DiskBw float64 `json:"disk_bw"`
InetUp float64 `json:"inet_up"`
InetDown float64 `json:"inet_down"`
StartDate float64 `json:"start_date"`
EndDate *float64 `json:"end_date"`
Duration *float64 `json:"duration"`
StorageCost float64 `json:"storage_cost"`
InetUpCost float64 `json:"inet_up_cost"`
InetDownCost float64 `json:"inet_down_cost"`
StorageTotalCost float64 `json:"storage_total_cost"`
Verification string `json:"verification"`
Score float64 `json:"score"`
Rented bool `json:"rented"`
BundledResults int `json:"bundled_results"`
PendingCount int `json:"pending_count"`
}
type SearchResponse struct {
Offers []Offer `json:"offers"`
}
func (c *Client) Search(search *AdvancedSearch) (*SearchResponse, error) {
resp, err := c.makeRequest(http.MethodPost, "/bundles/", nil)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var result SearchResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return nil, err
}
return &result, nil
}

View File

@@ -97,3 +97,66 @@ type Instance struct {
MachineDirSSHPort int `json:"machine_dir_ssh_port"` MachineDirSSHPort int `json:"machine_dir_ssh_port"`
Ports Ports `json:"ports"` Ports Ports `json:"ports"`
} }
type Offer struct {
IsBid bool `json:"is_bid"`
InetUpBilled *float64 `json:"inet_up_billed"`
InetDownBilled *float64 `json:"inet_down_billed"`
External bool `json:"external"`
Webpage *string `json:"webpage"`
Logo string `json:"logo"`
Rentable bool `json:"rentable"`
ComputeCap int `json:"compute_cap"`
DriverVersion string `json:"driver_version"`
CudaMaxGood int `json:"cuda_max_good"`
MachineID int `json:"machine_id"`
HostingType *string `json:"hosting_type"`
PublicIPAddr string `json:"public_ipaddr"`
Geolocation string `json:"geolocation"`
FlopsPerDPHTotal float64 `json:"flops_per_dphtotal"`
DLPerfPerDPHTotal float64 `json:"dlperf_per_dphtotal"`
Reliability2 float64 `json:"reliability2"`
HostRunTime int `json:"host_run_time"`
HostID int `json:"host_id"`
ID int `json:"id"`
BundleID int `json:"bundle_id"`
NumGPUs int `json:"num_gpus"`
TotalFlops float64 `json:"total_flops"`
MinBid float64 `json:"min_bid"`
DPHBase float64 `json:"dph_base"`
DPHTotal float64 `json:"dph_total"`
GPUName string `json:"gpu_name"`
GPURam int `json:"gpu_ram"`
GPUDisplayActive bool `json:"gpu_display_active"`
GPUMemBw float64 `json:"gpu_mem_bw"`
BwNVLink int `json:"bw_nvlink"`
DirectPortCount int `json:"direct_port_count"`
GPULanes int `json:"gpu_lanes"`
PCIeBw float64 `json:"pcie_bw"`
PCIGen int `json:"pci_gen"`
DLPerf float64 `json:"dlperf"`
CPUName string `json:"cpu_name"`
MoboName string `json:"mobo_name"`
CPURam int `json:"cpu_ram"`
CPUCores int `json:"cpu_cores"`
CPUCoresEffective int `json:"cpu_cores_effective"`
GPUFrac float64 `json:"gpu_frac"`
HasAVX int `json:"has_avx"`
DiskSpace float64 `json:"disk_space"`
DiskName string `json:"disk_name"`
DiskBw float64 `json:"disk_bw"`
InetUp float64 `json:"inet_up"`
InetDown float64 `json:"inet_down"`
StartDate float64 `json:"start_date"`
EndDate *float64 `json:"end_date"`
Duration *float64 `json:"duration"`
StorageCost float64 `json:"storage_cost"`
InetUpCost float64 `json:"inet_up_cost"`
InetDownCost float64 `json:"inet_down_cost"`
StorageTotalCost float64 `json:"storage_total_cost"`
Verification string `json:"verification"`
Score float64 `json:"score"`
Rented bool `json:"rented"`
BundledResults int `json:"bundled_results"`
PendingCount int `json:"pending_count"`
}

5
api/utilities.go Normal file
View File

@@ -0,0 +1,5 @@
package api
func Pointer[T any](d T) *T {
return &d
}

View File

@@ -1,7 +1,6 @@
package main package main
import ( import (
"fmt"
"log" "log"
"os" "os"
@@ -24,20 +23,4 @@ func main() {
// Create client // Create client
client := api.NewClient(apiKey) client := api.NewClient(apiKey)
// Get instances
resp, err := client.GetInstances()
if err != nil {
log.Fatalf("Error getting instances: %v", err)
}
if len(resp.Instances) == 0 {
fmt.Println("No instances found")
return
}
// Print instances
for _, instance := range resp.Instances {
fmt.Printf("Instance %d: %+v\n", instance.ID, instance)
}
} }