Coverage for agentos/llm/factory.py: 30%
23 statements
« prev ^ index » next coverage.py v7.14.3, created at 2026-07-08 20:40 +0800
« prev ^ index » next coverage.py v7.14.3, created at 2026-07-08 20:40 +0800
1"""
2LLM Provider 工厂 — 按名称/配置创建 Provider 实例。
3v1.3.36: DeepSeek + Anthropic 硬注册(纯 httpx 实现,零 SDK 依赖)。
5用法:
6 from agentos.llm.factory import create_provider
8 provider = create_provider("openai", model="gpt-4o", api_key="sk-...")
9 result = provider.chat([Message(...), Message(...)])
10"""
12from __future__ import annotations
14import os
15from typing import Any
17from agentos.llm.base import LLMProvider
19__all__ = ["create_provider"]
21_PROVIDER_REGISTRY: dict[str, tuple[str, str]] = {
22 "openai": ("agentos.llm.openai_provider", "OpenAIProvider"),
23 "deepseek": ("agentos.llm.deepseek_provider", "DeepSeekProvider"),
24 "anthropic": ("agentos.llm.anthropic_provider", "AnthropicProvider"),
25 "ollama": ("agentos.llm.ollama_provider", "OllamaProvider"),
26 "pangu": ("agentos.llm.pangu_provider", "PanguProvider"),
27}
30def create_provider(
31 name: str = "openai",
32 *,
33 model: str = "",
34 api_key: str = "",
35 base_url: str = "",
36 **extra: Any,
37) -> LLMProvider:
38 """
39 创建 LLM Provider 实例。
41 Args:
42 name: 提供商名称 — "openai" / "deepseek" / "anthropic"。
43 model: 模型名称。openai: gpt-4o-mini, deepseek: deepseek-chat, anthropic: claude-sonnet-4-20250514。
44 api_key: API Key。不传则从环境变量读取。
45 base_url: 自定义端点。
47 Returns:
48 LLMProvider 实例。
49 """
50 if name not in _PROVIDER_REGISTRY:
51 raise ValueError(f"Unknown provider: '{name}'. Available: {sorted(_PROVIDER_REGISTRY)}")
53 module_path, class_name = _PROVIDER_REGISTRY[name]
55 import importlib
57 mod = importlib.import_module(module_path)
58 cls = getattr(mod, class_name)
60 # Auto-detect API key from env
61 if not api_key:
62 env_var_map = {
63 "openai": "OPENAI_API_KEY",
64 "deepseek": "DEEPSEEK_API_KEY",
65 "anthropic": "ANTHROPIC_API_KEY",
66 "ollama": "OLLAMA_API_KEY",
67 "pangu": "PANGU_API_KEY",
68 }
69 api_key = os.getenv(env_var_map.get(name, ""), "")
71 # Default models
72 if not model:
73 defaults = {
74 "openai": "gpt-4o-mini",
75 "deepseek": "deepseek-chat",
76 "anthropic": "claude-sonnet-5-20250630",
77 "ollama": "qwen2.5:7b",
78 "pangu": "pangu-4",
79 }
80 model = defaults.get(name, "")
82 kwargs: dict[str, Any] = {}
83 if base_url:
84 kwargs["base_url"] = base_url
85 return cls(model=model, api_key=api_key, **kwargs, **extra)