{"repo": "antonyguedes/chaincode-carnival", "files": {"agents/providers/factory.go": {"6b139bb8d92b077af3416d19e2f11b1fef77c59a": {"t": 1785746095.1790385, "n": 2471, "h": "229de256c972c60c", "c": "package providers\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\n// Config represents the raw ENV breakdown for an agent\ntype Config struct {\n\tProvider string\n\tModel string\n\tAPIKey string\n}\n\n// NewProviderFromEnv reads dynamically from the .env environment prefix\n// Examples: prefix=\"REDTEAM\", \"ANALYZER\"\nfunc NewProviderFromEnv(prefix string) (LLMProvider, error) {\n\tproviderEngine := strings.ToLower(os.Getenv(fmt.Sprintf(\"%s_PROVIDER\", prefix)))\n\tmodel := os.Getenv(fmt.Sprintf(\"%s_MODEL\", prefix))\n\tapiKey := os.Getenv(fmt.Sprintf(\"%s_API_KEY\", prefix))\n\n\tif providerEngine == \"\" {\n\t\treturn nil, fmt.Errorf(\"missing %s_PROVIDER in .env\", prefix)\n\t}\n\n\tswitch providerEngine {\n\tcase \"ollama\":\n\t\treturn NewOllamaClient(model), nil\n\tcase \"gemini\":\n\t\tif apiKey == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"%s missing %s_API_KEY for Gemini\", prefix, prefix)\n\t\t}\n\t\treturn NewGeminiClient(model, apiKey), nil\n\tcase \"groq\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Groq\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"Groq\", \"https://api.groq.com/openai/v1/chat/completions\", model, apiKey), nil\n\tcase \"openai\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for OpenAI\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"OpenAI\", \"https://api.openai.com/v1/chat/completions\", model, apiKey), nil\n\tcase \"deepseek\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Deepseek\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"Deepseek\", \"https://api.deepseek.com/chat/completions\", model, apiKey), nil\n\tcase \"mistralai\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Mistral\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"MistralAI\", \"https://api.mistral.ai/v1/chat/completions\", model, apiKey), nil\n\tcase \"openrouter\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for OpenRouter\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"OpenRouter\", \"https://openrouter.ai/api/v1/chat/completions\", model, apiKey), nil\n\tcase \"anthropic\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Anthropic\", prefix, prefix) }\n\t\treturn NewAnthropicClient(model, apiKey), nil\n\tcase \"cohere\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Cohere\", prefix, prefix) }\n\t\treturn NewCohereClient(model, apiKey), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported provider '%s' requested by %s\", providerEngine, prefix)\n\t}\n}\n"}, "6fde13bf77740d1d9a42c7cd2af75bd7d9370996": {"t": 1785759829.1836615, "n": 2471, "h": "229de256c972c60c", "c": "package providers\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\n// Config represents the raw ENV breakdown for an agent\ntype Config struct {\n\tProvider string\n\tModel string\n\tAPIKey string\n}\n\n// NewProviderFromEnv reads dynamically from the .env environment prefix\n// Examples: prefix=\"REDTEAM\", \"ANALYZER\"\nfunc NewProviderFromEnv(prefix string) (LLMProvider, error) {\n\tproviderEngine := strings.ToLower(os.Getenv(fmt.Sprintf(\"%s_PROVIDER\", prefix)))\n\tmodel := os.Getenv(fmt.Sprintf(\"%s_MODEL\", prefix))\n\tapiKey := os.Getenv(fmt.Sprintf(\"%s_API_KEY\", prefix))\n\n\tif providerEngine == \"\" {\n\t\treturn nil, fmt.Errorf(\"missing %s_PROVIDER in .env\", prefix)\n\t}\n\n\tswitch providerEngine {\n\tcase \"ollama\":\n\t\treturn NewOllamaClient(model), nil\n\tcase \"gemini\":\n\t\tif apiKey == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"%s missing %s_API_KEY for Gemini\", prefix, prefix)\n\t\t}\n\t\treturn NewGeminiClient(model, apiKey), nil\n\tcase \"groq\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Groq\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"Groq\", \"https://api.groq.com/openai/v1/chat/completions\", model, apiKey), nil\n\tcase \"openai\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for OpenAI\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"OpenAI\", \"https://api.openai.com/v1/chat/completions\", model, apiKey), nil\n\tcase \"deepseek\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Deepseek\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"Deepseek\", \"https://api.deepseek.com/chat/completions\", model, apiKey), nil\n\tcase \"mistralai\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Mistral\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"MistralAI\", \"https://api.mistral.ai/v1/chat/completions\", model, apiKey), nil\n\tcase \"openrouter\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for OpenRouter\", prefix, prefix) }\n\t\treturn NewOpenAICompatibleClient(\"OpenRouter\", \"https://openrouter.ai/api/v1/chat/completions\", model, apiKey), nil\n\tcase \"anthropic\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Anthropic\", prefix, prefix) }\n\t\treturn NewAnthropicClient(model, apiKey), nil\n\tcase \"cohere\":\n\t\tif apiKey == \"\" { return nil, fmt.Errorf(\"%s missing %s_API_KEY for Cohere\", prefix, prefix) }\n\t\treturn NewCohereClient(model, apiKey), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported provider '%s' requested by %s\", providerEngine, prefix)\n\t}\n}\n"}}}}