1"""

2 Ollama Provider — 本地 LLM 推理，OpenAI 兼容协议。

3 零额外依赖，纯 httpx 实现。支持任意 Ollama 模型（qwen2.5, llama3, gemma, mistral 等）。

4

5 用法:

6 provider = OllamaProvider(model="qwen2.5:7b", base_url="http://localhost:11434/v1")

7"""

8

9 from __future__ import annotations

10

11 from typing import Any

12

13 from agentos.llm.openai_provider import OpenAIProvider

14

15__all__ = ["OllamaProvider"]

16

17 OLLAMA_DEFAULT_BASE = "http://localhost:11434/v1"

18 OLLAMA_DEFAULT_MODEL = "qwen2.5:7b"

19

20

21 class OllamaProvider(OpenAIProvider):

22 """Ollama 本地 LLM Provider — 通过 OpenAI 兼容 API 调用。

23

24 支持所有 Ollama 模型：qwen2.5, llama3.1, gemma2, mistral, deepseek-r1 等。

25

26 环境变量:

27 OLLAMA_API_KEY: API Key（Ollama 默认不需要，可留空）

28 OLLAMA_BASE_URL: Ollama 服务地址，默认 http://localhost:11434/v1

29 """

30

31 def __init__(

32 self,

33 model: str = OLLAMA_DEFAULT_MODEL,

34 api_key: str = "",

35 base_url: str = "",

36 timeout: float = 120.0,

37 ):

38 import os

39

40 resolved_base = base_url or os.getenv("OLLAMA_BASE_URL", OLLAMA_DEFAULT_BASE)

41 resolved_key = api_key or os.getenv("OLLAMA_API_KEY", "ollama")

42

43 super().__init__(

44 model=model,

45 api_key=resolved_key,

46 base_url=resolved_base,

47 )

48 self._timeout = timeout

49

50 @property

51 def provider_name(self) -> str:

52 return "ollama"

53

54 def chat(self, *args: Any, **kwargs: Any):

55 # Override timeout

56 kwargs.setdefault("timeout", self._timeout)

57 return super().chat(*args, **kwargs)

58

59 async def achat(self, *args: Any, **kwargs: Any):

60 kwargs.setdefault("timeout", self._timeout)

61 return await super().achat(*args, **kwargs)