From eab094047e115c8f3b385ab494fe6b62fabc5b56 Mon Sep 17 00:00:00 2001 From: abhinavgautam01 Date: Sat, 30 May 2026 12:13:50 +0530 Subject: [PATCH] feat: dynamically fetch and embed AI models list (#42) Signed-off-by: abhinavgautam01 --- detection/toolmention/generate.go | 85 ++++ detection/toolmention/models.go | 684 +++++++++++++++++++++++++++ detection/toolmention/toolmention.go | 4 + 3 files changed, 773 insertions(+) create mode 100644 detection/toolmention/generate.go create mode 100644 detection/toolmention/models.go diff --git a/detection/toolmention/generate.go b/detection/toolmention/generate.go new file mode 100644 index 0000000..5f3f5b5 --- /dev/null +++ b/detection/toolmention/generate.go @@ -0,0 +1,85 @@ +//go:build ignore + +package main + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "regexp" + "sort" + "strings" +) + +type OpenRouterResponse struct { + Data []struct { + ID string `json:"id"` + Name string `json:"name"` + } `json:"data"` +} + +func main() { + resp, err := http.Get("https://openrouter.ai/api/v1/models") + if err != nil { + log.Fatalf("failed to fetch models: %v", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatalf("failed to read response: %v", err) + } + + var result OpenRouterResponse + if err := json.Unmarshal(body, &result); err != nil { + log.Fatalf("failed to parse json: %v", err) + } + + var models []string + seen := make(map[string]bool) + + for _, item := range result.Data { + // ID usually looks like "anthropic/claude-3-opus" + idParts := strings.Split(item.ID, "/") + if len(idParts) == 2 { + modelID := idParts[1] + if !seen[modelID] { + models = append(models, modelID) + seen[modelID] = true + } + } + + name := item.Name + nameParts := strings.SplitN(name, ": ", 2) + if len(nameParts) == 2 { + name = nameParts[1] + } + // remove "(free)", "(Fast)", etc. + name = regexp.MustCompile(`\s*\(.*?\)`).ReplaceAllString(name, "") + name = strings.TrimSpace(name) + if name != "" && !seen[name] { + models = append(models, name) + seen[name] = true + } + } + + sort.Strings(models) + + out, err := os.Create("models.go") + if err != nil { + log.Fatalf("failed to create models.go: %v", err) + } + defer out.Close() + + fmt.Fprintln(out, "// Code generated by generate.go; DO NOT EDIT.") + fmt.Fprintln(out, "package toolmention") + fmt.Fprintln(out, "") + fmt.Fprintln(out, "var generatedModels = []string{") + for _, m := range models { + fmt.Fprintf(out, "\t%q,\n", m) + } + fmt.Fprintln(out, "}") +} diff --git a/detection/toolmention/models.go b/detection/toolmention/models.go new file mode 100644 index 0000000..1d85ec3 --- /dev/null +++ b/detection/toolmention/models.go @@ -0,0 +1,684 @@ +// Code generated by generate.go; DO NOT EDIT. +package toolmention + +var generatedModels = []string{ + "Aion-1.0", + "Aion-1.0-Mini", + "Aion-2.0", + "Aion-RP 1.0", + "Anthropic Claude Haiku Latest", + "Anthropic Claude Sonnet Latest", + "Auto Router", + "Body Builder", + "Claude 3 Haiku", + "Claude 3.5 Haiku", + "Claude Haiku 4.5", + "Claude Opus 4", + "Claude Opus 4.1", + "Claude Opus 4.5", + "Claude Opus 4.6", + "Claude Opus 4.7", + "Claude Opus 4.8", + "Claude Opus Latest", + "Claude Sonnet 4", + "Claude Sonnet 4.5", + "Claude Sonnet 4.6", + "CodeLLaMa 7B Instruct Solidity", + "Coder Large", + "Codestral 2508", + "Cogito v2.1 671B", + "Command A", + "Command R", + "Command R+", + "Command R7B", + "Cydonia 24B V4.1", + "DeepSeek V3", + "DeepSeek V3 0324", + "DeepSeek V3.1", + "DeepSeek V3.1 Nex N1", + "DeepSeek V3.1 Terminus", + "DeepSeek V3.2", + "DeepSeek V3.2 Exp", + "DeepSeek V4 Flash", + "DeepSeek V4 Pro", + "Devstral 2 2512", + "Devstral Medium", + "Devstral Small 1.1", + "ERNIE 4.5 21B A3B", + "ERNIE 4.5 21B A3B Thinking", + "ERNIE 4.5 300B A47B", + "ERNIE 4.5 VL 28B A3B", + "ERNIE 4.5 VL 424B A47B", + "Free Models Router", + "GLM 4 32B", + "GLM 4.5", + "GLM 4.5 Air", + "GLM 4.5V", + "GLM 4.6", + "GLM 4.6V", + "GLM 4.7", + "GLM 4.7 Flash", + "GLM 5", + "GLM 5 Turbo", + "GLM 5.1", + "GLM 5V Turbo", + "GPT Audio", + "GPT Audio Mini", + "GPT Chat Latest", + "GPT-3.5 Turbo", + "GPT-3.5 Turbo 16k", + "GPT-3.5 Turbo Instruct", + "GPT-4", + "GPT-4 Turbo", + "GPT-4 Turbo Preview", + "GPT-4.1", + "GPT-4.1 Mini", + "GPT-4.1 Nano", + "GPT-4o", + "GPT-4o Search Preview", + "GPT-4o-mini", + "GPT-4o-mini Search Preview", + "GPT-5", + "GPT-5 Chat", + "GPT-5 Codex", + "GPT-5 Image", + "GPT-5 Image Mini", + "GPT-5 Mini", + "GPT-5 Nano", + "GPT-5 Pro", + "GPT-5.1", + "GPT-5.1 Chat", + "GPT-5.1-Codex", + "GPT-5.1-Codex-Max", + "GPT-5.1-Codex-Mini", + "GPT-5.2", + "GPT-5.2 Chat", + "GPT-5.2 Pro", + "GPT-5.2-Codex", + "GPT-5.3 Chat", + "GPT-5.3-Codex", + "GPT-5.4", + "GPT-5.4 Image 2", + "GPT-5.4 Mini", + "GPT-5.4 Nano", + "GPT-5.4 Pro", + "GPT-5.5", + "GPT-5.5 Pro", + "Gemini 2.0 Flash", + "Gemini 2.0 Flash Lite", + "Gemini 2.5 Flash", + "Gemini 2.5 Flash Lite", + "Gemini 2.5 Flash Lite Preview 09-2025", + "Gemini 2.5 Pro", + "Gemini 2.5 Pro Preview 05-06", + "Gemini 2.5 Pro Preview 06-05", + "Gemini 3 Flash Preview", + "Gemini 3.1 Flash Lite", + "Gemini 3.1 Flash Lite Preview", + "Gemini 3.1 Pro Preview", + "Gemini 3.1 Pro Preview Custom Tools", + "Gemini 3.5 Flash", + "Gemma 2 27B", + "Gemma 3 12B", + "Gemma 3 27B", + "Gemma 3 4B", + "Gemma 3n 4B", + "Gemma 4 26B A4B", + "Gemma 4 31B", + "Google Gemini Flash Latest", + "Google Gemini Pro Latest", + "Granite 4.0 Micro", + "Granite 4.1 8B", + "Grok 4.20", + "Grok 4.20 Multi-Agent", + "Grok 4.3", + "Grok Build 0.1", + "Hermes 2 Pro - Llama-3 8B", + "Hermes 3 405B Instruct", + "Hermes 3 70B Instruct", + "Hermes 4 405B", + "Hermes 4 70B", + "Hunyuan A13B Instruct", + "Hy3 preview", + "INTELLECT-3", + "Inflection 3 Pi", + "Inflection 3 Productivity", + "Jamba Large 1.7", + "KAT-Coder-Pro V2", + "Kimi K2 0711", + "Kimi K2 0905", + "Kimi K2 Thinking", + "Kimi K2.5", + "Kimi K2.6", + "LFM2-24B-A2B", + "LFM2.5-1.2B-Instruct", + "LFM2.5-1.2B-Thinking", + "Laguna M.1", + "Laguna XS.2", + "Ling-2.6-1T", + "Ling-2.6-flash", + "Llama 3 70B Instruct", + "Llama 3 8B Instruct", + "Llama 3 8B Lunaris", + "Llama 3 Euryale 70B v2.1", + "Llama 3.1 70B Hanami x1", + "Llama 3.1 70B Instruct", + "Llama 3.1 8B Instruct", + "Llama 3.1 Euryale 70B v2.2", + "Llama 3.2 11B Vision Instruct", + "Llama 3.2 1B Instruct", + "Llama 3.2 3B Instruct", + "Llama 3.3 70B Instruct", + "Llama 3.3 Euryale 70B", + "Llama 3.3 Nemotron Super 49B V1.5", + "Llama 4 Maverick", + "Llama 4 Scout", + "Llama Guard 3 8B", + "Llama Guard 4 12B", + "Lyria 3 Clip Preview", + "Lyria 3 Pro Preview", + "Maestro Reasoning", + "Magnum v4 72B", + "Mercury 2", + "MiMo-V2-Flash", + "MiMo-V2-Omni", + "MiMo-V2-Pro", + "MiMo-V2.5", + "MiMo-V2.5-Pro", + "MiniMax M1", + "MiniMax M2", + "MiniMax M2-her", + "MiniMax M2.1", + "MiniMax M2.5", + "MiniMax M2.7", + "MiniMax-01", + "Ministral 3 14B 2512", + "Ministral 3 3B 2512", + "Ministral 3 8B 2512", + "Mistral 7B Instruct v0.1", + "Mistral Large", + "Mistral Large 2407", + "Mistral Large 2411", + "Mistral Large 3 2512", + "Mistral Medium 3", + "Mistral Medium 3.1", + "Mistral Medium 3.5", + "Mistral Nemo", + "Mistral Small 3", + "Mistral Small 3.1 24B", + "Mistral Small 3.2 24B", + "Mistral Small 4", + "Mixtral 8x22B Instruct", + "MoonshotAI Kimi Latest", + "Morph V3 Fast", + "Morph V3 Large", + "MythoMax 13B", + "Nano Banana", + "Nano Banana 2", + "Nano Banana Pro", + "Nemotron 3 Nano 30B A3B", + "Nemotron 3 Nano Omni", + "Nemotron 3 Super", + "Nemotron Nano 12B 2 VL", + "Nemotron Nano 9B V2", + "Nova 2 Lite", + "Nova Lite 1.0", + "Nova Micro 1.0", + "Nova Premier 1.0", + "Nova Pro 1.0", + "Olmo 3 32B Think", + "OpenAI GPT Latest", + "OpenAI GPT Mini Latest", + "Owl Alpha", + "Palmyra X5", + "Pareto Code Router", + "Perceptron Mk1", + "Phi 4", + "Phi 4 Mini Instruct", + "Pixtral Large 2411", + "Qwen Plus 0728", + "Qwen-Plus", + "Qwen2.5 72B Instruct", + "Qwen2.5 7B Instruct", + "Qwen2.5 Coder 32B Instruct", + "Qwen2.5 VL 72B Instruct", + "Qwen3 14B", + "Qwen3 235B A22B", + "Qwen3 235B A22B Instruct 2507", + "Qwen3 235B A22B Thinking 2507", + "Qwen3 30B A3B", + "Qwen3 30B A3B Instruct 2507", + "Qwen3 30B A3B Thinking 2507", + "Qwen3 32B", + "Qwen3 8B", + "Qwen3 Coder 30B A3B Instruct", + "Qwen3 Coder 480B A35B", + "Qwen3 Coder Flash", + "Qwen3 Coder Next", + "Qwen3 Coder Plus", + "Qwen3 Max", + "Qwen3 Max Thinking", + "Qwen3 Next 80B A3B Instruct", + "Qwen3 Next 80B A3B Thinking", + "Qwen3 VL 235B A22B Instruct", + "Qwen3 VL 235B A22B Thinking", + "Qwen3 VL 30B A3B Instruct", + "Qwen3 VL 30B A3B Thinking", + "Qwen3 VL 32B Instruct", + "Qwen3 VL 8B Instruct", + "Qwen3 VL 8B Thinking", + "Qwen3.5 397B A17B", + "Qwen3.5 Plus 2026-02-15", + "Qwen3.5 Plus 2026-04-20", + "Qwen3.5-122B-A10B", + "Qwen3.5-27B", + "Qwen3.5-35B-A3B", + "Qwen3.5-9B", + "Qwen3.5-Flash", + "Qwen3.6 27B", + "Qwen3.6 35B A3B", + "Qwen3.6 Flash", + "Qwen3.6 Max Preview", + "Qwen3.6 Plus", + "Qwen3.7 Max", + "R1", + "R1 0528", + "R1 Distill Llama 70B", + "R1 Distill Qwen 32B", + "ReMM SLERP 13B", + "Reka Edge", + "Reka Flash 3", + "Relace Apply 3", + "Relace Search", + "Ring-2.6-1T", + "Rnj 1 Instruct", + "Rocinante 12B", + "Saba", + "Seed 1.6", + "Seed 1.6 Flash", + "Seed-2.0-Lite", + "Seed-2.0-Mini", + "Skyfall 36B V2", + "Solar Pro 3", + "Sonar", + "Sonar Deep Research", + "Sonar Pro", + "Sonar Pro Search", + "Sonar Reasoning Pro", + "Spotlight", + "Step 3.5 Flash", + "Step 3.7 Flash", + "Switchpoint Router", + "Trinity Large Thinking", + "Trinity Mini", + "UI-TARS 7B", + "Uncensored", + "UnslopNemo 12B", + "Virtuoso Large", + "Voxtral Small 24B 2507", + "Weaver", + "WizardLM-2 8x22B", + "aion-1.0", + "aion-1.0-mini", + "aion-2.0", + "aion-rp-llama-3.1-8b", + "auto", + "bodybuilder", + "claude-3-haiku", + "claude-3.5-haiku", + "claude-haiku-4.5", + "claude-haiku-latest", + "claude-opus-4", + "claude-opus-4.1", + "claude-opus-4.5", + "claude-opus-4.6", + "claude-opus-4.6-fast", + "claude-opus-4.7", + "claude-opus-4.7-fast", + "claude-opus-4.8", + "claude-opus-4.8-fast", + "claude-opus-latest", + "claude-sonnet-4", + "claude-sonnet-4.5", + "claude-sonnet-4.6", + "claude-sonnet-latest", + "codellama-7b-instruct-solidity", + "coder-large", + "codestral-2508", + "cogito-v2.1-671b", + "command-a", + "command-r-08-2024", + "command-r-plus-08-2024", + "command-r7b-12-2024", + "cydonia-24b-v4.1", + "deepseek-chat", + "deepseek-chat-v3-0324", + "deepseek-chat-v3.1", + "deepseek-r1", + "deepseek-r1-0528", + "deepseek-r1-distill-llama-70b", + "deepseek-r1-distill-qwen-32b", + "deepseek-v3.1-nex-n1", + "deepseek-v3.1-terminus", + "deepseek-v3.2", + "deepseek-v3.2-exp", + "deepseek-v4-flash", + "deepseek-v4-flash:free", + "deepseek-v4-pro", + "devstral-2512", + "devstral-medium", + "devstral-small", + "dolphin-mistral-24b-venice-edition:free", + "ernie-4.5-21b-a3b", + "ernie-4.5-21b-a3b-thinking", + "ernie-4.5-300b-a47b", + "ernie-4.5-vl-28b-a3b", + "ernie-4.5-vl-424b-a47b", + "free", + "gemini-2.0-flash-001", + "gemini-2.0-flash-lite-001", + "gemini-2.5-flash", + "gemini-2.5-flash-image", + "gemini-2.5-flash-lite", + "gemini-2.5-flash-lite-preview-09-2025", + "gemini-2.5-pro", + "gemini-2.5-pro-preview", + "gemini-2.5-pro-preview-05-06", + "gemini-3-flash-preview", + "gemini-3-pro-image-preview", + "gemini-3.1-flash-image-preview", + "gemini-3.1-flash-lite", + "gemini-3.1-flash-lite-preview", + "gemini-3.1-pro-preview", + "gemini-3.1-pro-preview-customtools", + "gemini-3.5-flash", + "gemini-flash-latest", + "gemini-pro-latest", + "gemma-2-27b-it", + "gemma-3-12b-it", + "gemma-3-27b-it", + "gemma-3-4b-it", + "gemma-3n-e4b-it", + "gemma-4-26b-a4b-it", + "gemma-4-26b-a4b-it:free", + "gemma-4-31b-it", + "gemma-4-31b-it:free", + "glm-4-32b", + "glm-4.5", + "glm-4.5-air", + "glm-4.5-air:free", + "glm-4.5v", + "glm-4.6", + "glm-4.6v", + "glm-4.7", + "glm-4.7-flash", + "glm-5", + "glm-5-turbo", + "glm-5.1", + "glm-5v-turbo", + "gpt-3.5-turbo", + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo-16k", + "gpt-3.5-turbo-instruct", + "gpt-4", + "gpt-4-0314", + "gpt-4-1106-preview", + "gpt-4-turbo", + "gpt-4-turbo-preview", + "gpt-4.1", + "gpt-4.1-mini", + "gpt-4.1-nano", + "gpt-4o", + "gpt-4o-2024-05-13", + "gpt-4o-2024-08-06", + "gpt-4o-2024-11-20", + "gpt-4o-mini", + "gpt-4o-mini-2024-07-18", + "gpt-4o-mini-search-preview", + "gpt-4o-search-preview", + "gpt-5", + "gpt-5-chat", + "gpt-5-codex", + "gpt-5-image", + "gpt-5-image-mini", + "gpt-5-mini", + "gpt-5-nano", + "gpt-5-pro", + "gpt-5.1", + "gpt-5.1-chat", + "gpt-5.1-codex", + "gpt-5.1-codex-max", + "gpt-5.1-codex-mini", + "gpt-5.2", + "gpt-5.2-chat", + "gpt-5.2-codex", + "gpt-5.2-pro", + "gpt-5.3-chat", + "gpt-5.3-codex", + "gpt-5.4", + "gpt-5.4-image-2", + "gpt-5.4-mini", + "gpt-5.4-nano", + "gpt-5.4-pro", + "gpt-5.5", + "gpt-5.5-pro", + "gpt-audio", + "gpt-audio-mini", + "gpt-chat-latest", + "gpt-latest", + "gpt-mini-latest", + "gpt-oss-120b", + "gpt-oss-120b:free", + "gpt-oss-20b", + "gpt-oss-20b:free", + "gpt-oss-safeguard-20b", + "granite-4.0-h-micro", + "granite-4.1-8b", + "grok-4.20", + "grok-4.20-multi-agent", + "grok-4.3", + "grok-build-0.1", + "hermes-2-pro-llama-3-8b", + "hermes-3-llama-3.1-405b", + "hermes-3-llama-3.1-405b:free", + "hermes-3-llama-3.1-70b", + "hermes-4-405b", + "hermes-4-70b", + "hunyuan-a13b-instruct", + "hy3-preview", + "inflection-3-pi", + "inflection-3-productivity", + "intellect-3", + "jamba-large-1.7", + "kat-coder-pro-v2", + "kimi-k2", + "kimi-k2-0905", + "kimi-k2-thinking", + "kimi-k2.5", + "kimi-k2.6", + "kimi-k2.6:free", + "kimi-latest", + "l3-euryale-70b", + "l3-lunaris-8b", + "l3.1-70b-hanami-x1", + "l3.1-euryale-70b", + "l3.3-euryale-70b", + "laguna-m.1:free", + "laguna-xs.2:free", + "lfm-2-24b-a2b", + "lfm-2.5-1.2b-instruct:free", + "lfm-2.5-1.2b-thinking:free", + "ling-2.6-1t", + "ling-2.6-flash", + "llama-3-70b-instruct", + "llama-3-8b-instruct", + "llama-3.1-70b-instruct", + "llama-3.1-8b-instruct", + "llama-3.2-11b-vision-instruct", + "llama-3.2-1b-instruct", + "llama-3.2-3b-instruct", + "llama-3.2-3b-instruct:free", + "llama-3.3-70b-instruct", + "llama-3.3-70b-instruct:free", + "llama-3.3-nemotron-super-49b-v1.5", + "llama-4-maverick", + "llama-4-scout", + "llama-guard-3-8b", + "llama-guard-4-12b", + "lyria-3-clip-preview", + "lyria-3-pro-preview", + "maestro-reasoning", + "magnum-v4-72b", + "mercury-2", + "mimo-v2-flash", + "mimo-v2-omni", + "mimo-v2-pro", + "mimo-v2.5", + "mimo-v2.5-pro", + "minimax-01", + "minimax-m1", + "minimax-m2", + "minimax-m2-her", + "minimax-m2.1", + "minimax-m2.5", + "minimax-m2.5:free", + "minimax-m2.7", + "ministral-14b-2512", + "ministral-3b-2512", + "ministral-8b-2512", + "mistral-7b-instruct-v0.1", + "mistral-large", + "mistral-large-2407", + "mistral-large-2411", + "mistral-large-2512", + "mistral-medium-3", + "mistral-medium-3-5", + "mistral-medium-3.1", + "mistral-nemo", + "mistral-saba", + "mistral-small-24b-instruct-2501", + "mistral-small-2603", + "mistral-small-3.1-24b-instruct", + "mistral-small-3.2-24b-instruct", + "mixtral-8x22b-instruct", + "morph-v3-fast", + "morph-v3-large", + "mythomax-l2-13b", + "nemotron-3-nano-30b-a3b", + "nemotron-3-nano-30b-a3b:free", + "nemotron-3-nano-omni-30b-a3b-reasoning:free", + "nemotron-3-super-120b-a12b", + "nemotron-3-super-120b-a12b:free", + "nemotron-nano-12b-v2-vl:free", + "nemotron-nano-9b-v2", + "nemotron-nano-9b-v2:free", + "nova-2-lite-v1", + "nova-lite-v1", + "nova-micro-v1", + "nova-premier-v1", + "nova-pro-v1", + "o1", + "o1-pro", + "o3", + "o3 Deep Research", + "o3 Mini", + "o3 Mini High", + "o3 Pro", + "o3-deep-research", + "o3-mini", + "o3-mini-high", + "o3-pro", + "o4 Mini", + "o4 Mini Deep Research", + "o4 Mini High", + "o4-mini", + "o4-mini-deep-research", + "o4-mini-high", + "olmo-3-32b-think", + "owl-alpha", + "palmyra-x5", + "pareto-code", + "perceptron-mk1", + "phi-4", + "phi-4-mini-instruct", + "pixtral-large-2411", + "qwen-2.5-72b-instruct", + "qwen-2.5-7b-instruct", + "qwen-2.5-coder-32b-instruct", + "qwen-plus", + "qwen-plus-2025-07-28", + "qwen-plus-2025-07-28:thinking", + "qwen2.5-vl-72b-instruct", + "qwen3-14b", + "qwen3-235b-a22b", + "qwen3-235b-a22b-2507", + "qwen3-235b-a22b-thinking-2507", + "qwen3-30b-a3b", + "qwen3-30b-a3b-instruct-2507", + "qwen3-30b-a3b-thinking-2507", + "qwen3-32b", + "qwen3-8b", + "qwen3-coder", + "qwen3-coder-30b-a3b-instruct", + "qwen3-coder-flash", + "qwen3-coder-next", + "qwen3-coder-plus", + "qwen3-coder:free", + "qwen3-max", + "qwen3-max-thinking", + "qwen3-next-80b-a3b-instruct", + "qwen3-next-80b-a3b-instruct:free", + "qwen3-next-80b-a3b-thinking", + "qwen3-vl-235b-a22b-instruct", + "qwen3-vl-235b-a22b-thinking", + "qwen3-vl-30b-a3b-instruct", + "qwen3-vl-30b-a3b-thinking", + "qwen3-vl-32b-instruct", + "qwen3-vl-8b-instruct", + "qwen3-vl-8b-thinking", + "qwen3.5-122b-a10b", + "qwen3.5-27b", + "qwen3.5-35b-a3b", + "qwen3.5-397b-a17b", + "qwen3.5-9b", + "qwen3.5-flash-02-23", + "qwen3.5-plus-02-15", + "qwen3.5-plus-20260420", + "qwen3.6-27b", + "qwen3.6-35b-a3b", + "qwen3.6-flash", + "qwen3.6-max-preview", + "qwen3.6-plus", + "qwen3.7-max", + "reka-edge", + "reka-flash-3", + "relace-apply-3", + "relace-search", + "remm-slerp-l2-13b", + "ring-2.6-1t", + "rnj-1-instruct", + "rocinante-12b", + "router", + "seed-1.6", + "seed-1.6-flash", + "seed-2.0-lite", + "seed-2.0-mini", + "skyfall-36b-v2", + "solar-pro-3", + "sonar", + "sonar-deep-research", + "sonar-pro", + "sonar-pro-search", + "sonar-reasoning-pro", + "spotlight", + "step-3.5-flash", + "step-3.7-flash", + "trinity-large-thinking", + "trinity-mini", + "ui-tars-1.5-7b", + "unslopnemo-12b", + "virtuoso-large", + "voxtral-small-24b-2507", + "weaver", + "wizardlm-2-8x22b", +} diff --git a/detection/toolmention/toolmention.go b/detection/toolmention/toolmention.go index 1efa707..20c7c9c 100644 --- a/detection/toolmention/toolmention.go +++ b/detection/toolmention/toolmention.go @@ -1,5 +1,7 @@ package toolmention +//go:generate go run generate.go + import ( "fmt" "regexp" @@ -40,6 +42,8 @@ func init() { "Windsurf", } + tools = append(tools, generatedModels...) + for _, name := range tools { escaped := regexp.QuoteMeta(name) pattern := regexp.MustCompile(`(?i)\b` + escaped + `\b`)