{"id":31027182,"url":"https://github.com/rizome-dev/go-smolagents","last_synced_at":"2025-09-13T18:57:15.289Z","repository":{"id":289223176,"uuid":"917470961","full_name":"rizome-dev/go-smolagents","owner":"rizome-dev","description":"huggingface/smolagents, but pure go","archived":false,"fork":false,"pushed_at":"2025-07-21T22:51:41.000Z","size":22550,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-22T01:27:10.727Z","etag":null,"topics":["agents","ai","golang","smolagents"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/rizome-dev/smolagentsgo","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rizome-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-16T03:37:53.000Z","updated_at":"2025-07-21T22:51:44.000Z","dependencies_parsed_at":"2025-04-22T07:46:29.406Z","dependency_job_id":"3ea27b0b-cbe6-4e8d-be71-40206c09c23c","html_url":"https://github.com/rizome-dev/go-smolagents","commit_stats":null,"previous_names":["rizome-dev/smolagentsgo","rizome-dev/go-smolagents"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/rizome-dev/go-smolagents","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizome-dev%2Fgo-smolagents","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizome-dev%2Fgo-smolagents/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizome-dev%2Fgo-smolagents/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizome-dev%2Fgo-smolagents/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rizome-dev","download_url":"https://codeload.github.com/rizome-dev/go-smolagents/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizome-dev%2Fgo-smolagents/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275013271,"owners_count":25390481,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-13T02:00:10.085Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","ai","golang","smolagents"],"created_at":"2025-09-13T18:57:13.444Z","updated_at":"2025-09-13T18:57:15.281Z","avatar_url":"https://github.com/rizome-dev.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# go-smolagents\n\n\u003cimg src=\"logo.png\" alt=\"Logo\" width=\"215\" align=\"right\"\u003e\n\n[![GoDoc](https://pkg.go.dev/badge/github.com/rizome-dev/go-smolagents)](https://pkg.go.dev/github.com/rizome-dev/go-smolagents)\n[![Go Report Card](https://goreportcard.com/badge/github.com/rizome-dev/go-smolagents)](https://goreportcard.com/report/github.com/rizome-dev/go-smolagents)\n\n```shell\ngo get github.com/rizome-dev/go-smolagents\n```\n\nbuilt by: [rizome labs](https://rizome.dev)\n\ncontact us: [hi (at) rizome.dev](mailto:hi@rizome.dev)\n\n## Quick Start\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n    \"os\"\n    \"time\"\n\n    \"github.com/rizome-dev/go-smolagents/pkg/agents\"\n    \"github.com/rizome-dev/go-smolagents/pkg/models\"\n)\n\nfunc main() {\n    // Get HuggingFace API token from environment\n    token := os.Getenv(\"HF_TOKEN\")\n    if token == \"\" {\n        log.Fatal(\"Please set HF_TOKEN environment variable\")\n    }\n\n    // Create model with explicit provider\n    model := models.NewInferenceClientModel(\n        \"moonshotai/Kimi-K2-Instruct\",\n        token,\n        map[string]interface{}{\n        },\n    )\n\n    // Create ReactCodeAgent with default options\n    agent, err := agents.NewReactCodeAgent(model, nil, \"\", nil)\n    if err != nil {\n        log.Fatalf(\"Failed to create agent: %v\", err)\n    }\n    defer agent.Close()\n\n    // Run the agent with a longer timeout\n    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)\n    result, err := agent.Run(\u0026agents.RunOptions{\n        Task:    \"What is 5 factorial?\",\n        Context: ctx,\n    })\n    cancel()\n\n    if err != nil {\n        fmt.Printf(\"\\nError: %v\\n\", err)\n        if result != nil {\n            fmt.Printf(\"Status: %s\\n\", result.State)\n            fmt.Printf(\"Steps taken: %d\\n\", result.StepCount)\n        }\n    }\n}\n```\n\n## Usage Guide\n\n```bash\n# Required: Set up at least one model API key\nexport HF_TOKEN=\"your-huggingface-token\"         # For HuggingFace models\nexport OPENAI_API_KEY=\"your-openai-key\"          # For OpenAI models\nexport AWS_REGION=\"us-east-1\"                    # For AWS Bedrock\n\n# Optional: For web search tools\nexport SERP_API_KEY=\"your-serpapi-key\"\nexport SERPER_API_KEY=\"your-serper-key\"\n```\n\n### Creating Agents\n\n#### Basic Agent Creation\n```go\nimport (\n    \"github.com/rizome-dev/go-smolagents/pkg/agents\"\n    \"github.com/rizome-dev/go-smolagents/pkg/models\"\n)\n\n// Using HuggingFace\nmodel := models.NewInferenceClientModel(\n    \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n    os.Getenv(\"HF_TOKEN\"),\n    nil,\n)\n\n// Using OpenAI\nmodel, err := models.CreateModel(\n    models.ModelTypeOpenAIServer,\n    \"gpt-4o\",\n    map[string]interface{}{\n        \"api_key\": os.Getenv(\"OPENAI_API_KEY\"),\n    },\n)\n\n// Create agent\nagent, err := agents.NewReactCodeAgent(model, nil, \"\", nil)\nif err != nil {\n    log.Fatal(err)\n}\ndefer agent.Close() // Always close agents\n```\n\n#### Advanced Configuration\n```go\noptions := \u0026agents.ReactCodeAgentOptions{\n    // Security: Limit packages available in code execution\n    AuthorizedPackages: []string{\"fmt\", \"strings\", \"math\", \"json\", \"time\"},\n    \n    // Execution limits\n    MaxCodeLength: 100000,  // Characters\n    MaxSteps:      15,      // Iterations\n    \n    // Features\n    EnablePlanning:   true,  // Multi-step planning\n    PlanningInterval: 3,     // Steps between re-planning\n    Verbose:          true,  // Detailed logs\n    StreamOutputs:    true,  // Real-time output\n}\n\nagent, err := agents.NewReactCodeAgent(model, nil, systemPrompt, options)\n```\n\n### Running Tasks\n\n```go\n// Basic execution\nresult, err := agent.Run(\u0026agents.RunOptions{\n    Task: \"Write a function to find prime numbers up to 100\",\n})\n\n// With timeout\nctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)\ndefer cancel()\n\nresult, err := agent.Run(\u0026agents.RunOptions{\n    Task:    \"Analyze this data and create visualizations\",\n    Context: ctx,\n})\n\n// Handle results\nif err != nil {\n    log.Printf(\"Error: %v\", err)\n    if result != nil {\n        log.Printf(\"Completed %d steps before failure\", result.StepCount)\n    }\n} else {\n    fmt.Printf(\"Success! Output: %v\\n\", result.Output)\n}\n```\n\n### Working with Tools\n\n#### Built-in Tools\n```go\nimport \"github.com/rizome-dev/go-smolagents/pkg/default_tools\"\n\n// Available tools\ninterpreter := default_tools.NewGoInterpreterTool()  // Execute Go code\nwebSearch := default_tools.NewWebSearchTool()        // Search the web\nwiki := default_tools.NewWikipediaSearchTool()       // Search Wikipedia\nwebpage := default_tools.NewVisitWebpageTool()       // Visit URLs\nfinalAnswer := default_tools.NewFinalAnswerTool()    // Provide final answer\n\n// Create agent with specific tools\nagent, _ := agents.NewReactCodeAgent(\n    model,\n    []tools.Tool{interpreter, webSearch},\n    \"\",\n    nil,\n)\n```\n\n#### Creating Custom Tools\n```go\ntype CustomTool struct {\n    *tools.BaseTool\n}\n\nfunc NewCustomTool() *CustomTool {\n    inputs := map[string]*tools.ToolInput{\n        \"query\": tools.NewToolInput(\"string\", \"The query to process\"),\n    }\n    \n    baseTool := tools.NewBaseTool(\n        \"custom_tool\",\n        \"Description of what this tool does\",\n        inputs,\n        \"string\", // output type\n    )\n    \n    tool := \u0026CustomTool{BaseTool: baseTool}\n    tool.ForwardFunc = tool.execute\n    return tool\n}\n\nfunc (t *CustomTool) execute(args ...interface{}) (interface{}, error) {\n    query := args[0].(string)\n    // Tool logic here\n    return result, nil\n}\n```\n\n### Model Providers\n\n#### OpenAI and Compatible APIs\n```go\n// OpenAI\nmodel, _ := models.CreateModel(models.ModelTypeOpenAIServer, \"gpt-4o\", map[string]interface{}{\n    \"api_key\": os.Getenv(\"OPENAI_API_KEY\"),\n})\n\n// Anthropic via OpenAI-compatible endpoint\nmodel, _ := models.CreateModel(models.ModelTypeOpenAIServer, \"claude-3-opus\", map[string]interface{}{\n    \"api_key\":  os.Getenv(\"ANTHROPIC_API_KEY\"),\n    \"base_url\": \"https://api.anthropic.com/v1\",\n})\n\n// Local models via Ollama\nmodel, _ := models.CreateModel(models.ModelTypeOpenAIServer, \"llama3\", map[string]interface{}{\n    \"base_url\": \"http://localhost:11434/v1\",\n})\n```\n\n#### HuggingFace\n```go\n// Public models\nmodel := models.NewInferenceClientModel(\n    \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n    os.Getenv(\"HF_TOKEN\"),\n    nil,\n)\n\n// Dedicated endpoints\nmodel := models.NewInferenceClientModel(\n    \"your-model-id\",\n    os.Getenv(\"HF_TOKEN\"),\n    map[string]interface{}{\n        \"base_url\": \"https://your-endpoint.endpoints.huggingface.cloud\",\n    },\n)\n```\n\n#### AWS Bedrock\n```go\n// Claude on Bedrock\nmodel, _ := models.CreateModel(models.ModelTypeBedrock, \"anthropic.claude-3-opus\", map[string]interface{}{\n    \"region\": \"us-east-1\",\n})\n\n// Llama on Bedrock\nmodel, _ := models.CreateModel(models.ModelTypeBedrock, \"meta.llama3-70b-instruct\", map[string]interface{}{\n    \"region\": \"us-west-2\",\n})\n```\n\n### Advanced Patterns\n\n#### Error Handling\n```go\nresult, err := agent.Run(\u0026agents.RunOptions{Task: task})\n\nif err != nil {\n    switch {\n    case errors.Is(err, context.DeadlineExceeded):\n        log.Println(\"Task timed out\")\n    case strings.Contains(err.Error(), \"rate limit\"):\n        log.Println(\"Rate limited, retrying...\")\n        time.Sleep(60 * time.Second)\n        // Retry logic\n    default:\n        log.Printf(\"Error: %v\", err)\n    }\n}\n```\n\n#### Concurrent Execution\n```go\nfunc runConcurrentTasks(tasks []string, model models.Model) {\n    var wg sync.WaitGroup\n    results := make(chan Result, len(tasks))\n    \n    for _, task := range tasks {\n        wg.Add(1)\n        go func(t string) {\n            defer wg.Done()\n            \n            agent, _ := agents.NewReactCodeAgent(model, nil, \"\", nil)\n            defer agent.Close()\n            \n            result, err := agent.Run(\u0026agents.RunOptions{Task: t})\n            results \u003c- Result{Output: result, Error: err}\n        }(task)\n    }\n    \n    wg.Wait()\n    close(results)\n}\n```\n\n#### Memory Access\n```go\n// Access conversation history\nmemory := agent.GetMemory()\nmessages := memory.GetMessages()\n\n// Access execution steps\nsteps := memory.GetSteps()\nfor _, step := range steps {\n    fmt.Printf(\"Step: %v\\n\", step)\n}\n\n// Clear memory for fresh start\nmemory.Clear()\n```\n\n#### Multi-Agent Systems\n```go\n// Create specialized agents\ndataAnalyst, _ := agents.NewReactCodeAgent(model, nil, \n    \"You are a data analysis expert.\", nil)\n    \ncodeReviewer, _ := agents.NewReactCodeAgent(model, nil, \n    \"You are a code review expert.\", nil)\n\n// Create managed agents for coordination\nanalyst := agents.NewManagedAgent(\"analyst\", \"Data analysis\", dataAnalyst)\nreviewer := agents.NewManagedAgent(\"reviewer\", \"Code review\", codeReviewer)\n\n// Coordinate between agents\n// ... coordination logic\n```\n\n### Security Best Practices\n\n1. **Sandbox Code Execution**\n   ```go\n   options := \u0026agents.ReactCodeAgentOptions{\n       AuthorizedPackages: []string{\"fmt\", \"math\"}, // Only safe packages\n       MaxCodeLength:      10000,                   // Limit code size\n   }\n   ```\n\n2. **API Key Management**\n   ```go\n   // Always use environment variables\n   apiKey := os.Getenv(\"OPENAI_API_KEY\")\n   if apiKey == \"\" {\n       log.Fatal(\"API key not set\")\n   }\n   ```\n\n3. **Input Validation**\n   ```go\n   if len(task) \u003e 10000 {\n       return fmt.Errorf(\"task too long\")\n   }\n   ```\n\n### Performance Optimization\n\n1. **Reuse Model Instances**\n   ```go\n   // Create model once\n   model := models.NewInferenceClientModel(modelID, token, nil)\n   \n   // Use for multiple agents\n   for _, task := range tasks {\n       agent, _ := agents.NewReactCodeAgent(model, nil, \"\", nil)\n       // Use agent\n       agent.Close()\n   }\n   ```\n\n2. **Context Management**\n   ```go\n   // Set appropriate timeouts\n   ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)\n   defer cancel()\n   ```\n\n3. **Limit Memory Growth**\n   ```go\n   if len(memory.GetMessages()) \u003e 100 {\n       // Summarize and reset\n       memory.Clear()\n   }\n   ```\n\n## License\n\nApache License 2.0 - see [LICENSE](LICENSE) file for details.\n\n## Credits\n\nBased on the original [smolagents](https://github.com/huggingface/smolagents) Python library by HuggingFace.\n\n---\n\n**Built with ❤️  by Rizome Labs, Inc.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frizome-dev%2Fgo-smolagents","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frizome-dev%2Fgo-smolagents","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frizome-dev%2Fgo-smolagents/lists"}