Skip to content

Commit 4d05e13

Browse files
authored
feat(model): adding ollama local (#575)
## 📝 Pull Request Template ### 1. Related Issue #270 ### 2. Type of Change (select one) New Feature ### 3. Description Adding option to use local ollama as model provider. ### 4. Testing - [x] I have tested this locally. - [x] I have updated or added relevant tests. ### 5. Checklist - [x] I have read the [Code of Conduct](./CODE_OF_CONDUCT.md) - [x] I have followed the [Contributing Guidelines](./CONTRIBUTING.md) - [x] My changes follow the project's coding style
1 parent 2c0f608 commit 4d05e13

File tree

11 files changed

+60
-3
lines changed

11 files changed

+60
-3
lines changed

frontend/src/assets/png/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export { default as AzurePng } from "./model-providers/azure.png";
3737
export { default as DashScopePng } from "./model-providers/dashscope.png";
3838
export { default as DeepSeekPng } from "./model-providers/deepseek.png";
3939
export { default as GooglePng } from "./model-providers/google.png";
40+
export { default as OllamaPng } from "./model-providers/ollama.png";
4041
export { default as OpenAiPng } from "./model-providers/openai.png";
4142
export { default as OpenAiCompatiblePng } from "./model-providers/openai-compatible.png";
4243
export { default as OpenRouterPng } from "./model-providers/openrouter.png";
1.24 KB
Loading

frontend/src/constants/icons.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
HyperliquidPng,
1111
MexcPng,
1212
OkxPng,
13+
OllamaPng,
1314
OpenAiCompatiblePng,
1415
OpenAiPng,
1516
OpenRouterPng,
@@ -26,6 +27,7 @@ export const MODEL_PROVIDER_ICONS = {
2627
google: GooglePng,
2728
azure: AzurePng,
2829
dashscope: DashScopePng,
30+
ollama: OllamaPng,
2931
};
3032

3133
export const EXCHANGE_ICONS = {

python/configs/config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ models:
5050
dashscope:
5151
config_file: "providers/dashscope.yaml"
5252
api_key_env: "DASHSCOPE_API_KEY"
53+
54+
ollama:
55+
config_file: "providers/ollama.yaml"
5356

5457
# Agent Configuration
5558
agents:
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
name: Ollama
2+
provider_type: Ollama
3+
enabled: true
4+
default_model: qwen3:4b
5+
models:
6+
- id: qwen3:4b
7+
name: qwen3:4b

python/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ dependencies = [
1919
"yfinance>=0.2.65",
2020
"requests>=2.32.5",
2121
"akshare>=1.17.87",
22-
"agno[openai, google, lancedb]>=2.0,<3.0",
22+
"agno[openai, google, lancedb, ollama]>=2.0,<3.0",
2323
"edgartools>=4.12.2",
2424
"sqlalchemy>=2.0.43",
2525
"aiosqlite>=0.19.0",

python/uv.lock

Lines changed: 18 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

python/valuecell/adapters/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
GoogleProvider,
2727
ModelFactory,
2828
ModelProvider,
29+
OllamaProvider,
2930
OpenAICompatibleProvider,
3031
OpenAIProvider,
3132
OpenRouterProvider,
@@ -49,6 +50,7 @@
4950
"SiliconFlowProvider",
5051
"DeepSeekProvider",
5152
"DashScopeProvider",
53+
"OllamaProvider",
5254
# Convenience functions
5355
"create_model",
5456
"create_model_for_agent",

python/valuecell/adapters/models/factory.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,29 @@ def create_embedder(self, model_id: Optional[str] = None, **kwargs):
564564
)
565565

566566

567+
class OllamaProvider(ModelProvider):
568+
"""Ollama model provider"""
569+
570+
def create_model(self, model_id: Optional[str] = None, **kwargs):
571+
"""Create Ollama model via agno"""
572+
try:
573+
from agno.models.ollama import Ollama
574+
except ImportError:
575+
raise ImportError(
576+
"agno package not installed, install with: pip install agno"
577+
)
578+
579+
model_id = model_id or self.config.default_model
580+
581+
logger.info(f"Creating Ollama model: {model_id}")
582+
583+
return Ollama(id=model_id)
584+
585+
def is_available(self) -> bool:
586+
"""Ollama doesn't require API key, just needs host configured"""
587+
return bool(self.config.parameters.get("host"))
588+
589+
567590
class ModelFactory:
568591
"""
569592
Factory for creating model instances with provider abstraction
@@ -585,6 +608,7 @@ class ModelFactory:
585608
"openai-compatible": OpenAICompatibleProvider,
586609
"deepseek": DeepSeekProvider,
587610
"dashscope": DashScopeProvider,
611+
"ollama": OllamaProvider,
588612
}
589613

590614
def __init__(self, config_manager: Optional[ConfigManager] = None):

python/valuecell/config/manager.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ def primary_provider(self) -> str:
135135
"openai",
136136
"openai-compatible",
137137
"azure",
138+
"ollama",
138139
]
139140

140141
for preferred in preferred_order:

0 commit comments

Comments
 (0)