Инициализировать базовый каркас MVP с чат-агентом на Agno и Ollama.
Добавить входную точку CLI, конфигурацию через .env и базовую документацию для быстрого локального запуска.
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
OLLAMA_MODEL_ID=gemma4:31b
|
||||||
|
OLLAMA_HOST=http://localhost:11435
|
||||||
|
OLLAMA_TEMPERATURE=0
|
||||||
|
AGENT_MARKDOWN=false
|
||||||
|
AGENT_DEBUG_MODE=true
|
||||||
|
AGENT_INSTRUCTIONS=You are a helpful assistant. Answer briefly and clearly.
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
# Python cache and bytecode
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# Virtual environments
|
||||||
|
.venv/
|
||||||
|
venv/
|
||||||
|
|
||||||
|
# Environment files
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Build and packaging
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
*.egg-info/
|
||||||
|
|
||||||
|
# Test and tool caches
|
||||||
|
.pytest_cache/
|
||||||
|
.mypy_cache/
|
||||||
|
.ruff_cache/
|
||||||
|
|
||||||
|
# IDE and OS files
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
.DS_Store
|
||||||
|
.cursor
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# Prisma Platform MVP
|
||||||
|
|
||||||
|
Minimal chat agent on Agno + Ollama.
|
||||||
|
|
||||||
|
## Current structure
|
||||||
|
|
||||||
|
```text
|
||||||
|
prisma_platform/
|
||||||
|
├── .env
|
||||||
|
├── .env.example
|
||||||
|
├── requirements.txt
|
||||||
|
└── src/
|
||||||
|
├── __init__.py
|
||||||
|
├── agent_runner.py
|
||||||
|
└── main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m venv .venv
|
||||||
|
source .venv/bin/activate
|
||||||
|
pip install -r requirements.txt
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run
|
||||||
|
|
||||||
|
Interactive chat mode:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m src.main
|
||||||
|
```
|
||||||
|
|
||||||
|
Single message mode:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m src.main --message "Привет, что ты умеешь?"
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
agno
|
||||||
|
python-dotenv
|
||||||
|
ollama
|
||||||
|
socksio
|
||||||
|
openai
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Base package for agent entrypoint.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
from agno.agent import Agent
|
||||||
|
from agno.models.ollama import Ollama
|
||||||
|
|
||||||
|
|
||||||
|
def _env_bool(name: str, default: bool) -> bool:
|
||||||
|
value = os.getenv(name)
|
||||||
|
if value is None:
|
||||||
|
return default
|
||||||
|
return value.strip().lower() in {"1", "true", "yes", "on"}
|
||||||
|
|
||||||
|
|
||||||
|
def _env_float(name: str, default: float) -> float:
|
||||||
|
value = os.getenv(name)
|
||||||
|
if value is None:
|
||||||
|
return default
|
||||||
|
return float(value)
|
||||||
|
|
||||||
|
|
||||||
|
_agent: Agent | None = None
|
||||||
|
|
||||||
|
|
||||||
|
def get_agent() -> Agent:
|
||||||
|
global _agent
|
||||||
|
|
||||||
|
if _agent is not None:
|
||||||
|
return _agent
|
||||||
|
|
||||||
|
model_id = os.getenv("OLLAMA_MODEL_ID", "gemma4:31b")
|
||||||
|
ollama_host = os.getenv("OLLAMA_HOST", "http://localhost:11435")
|
||||||
|
temperature = _env_float("OLLAMA_TEMPERATURE", 0.0)
|
||||||
|
markdown = _env_bool("AGENT_MARKDOWN", False)
|
||||||
|
debug_mode = _env_bool("AGENT_DEBUG_MODE", True)
|
||||||
|
instructions = os.getenv(
|
||||||
|
"AGENT_INSTRUCTIONS",
|
||||||
|
"You are a helpful assistant. Answer briefly and clearly.",
|
||||||
|
)
|
||||||
|
|
||||||
|
llm = Ollama(id=model_id, host=ollama_host, options={"temperature": temperature})
|
||||||
|
_agent = Agent(
|
||||||
|
model=llm,
|
||||||
|
markdown=markdown,
|
||||||
|
instructions=instructions,
|
||||||
|
debug_mode=debug_mode,
|
||||||
|
)
|
||||||
|
return _agent
|
||||||
|
|
||||||
|
|
||||||
|
async def run_agent(message: str) -> str:
|
||||||
|
agent = get_agent()
|
||||||
|
response = await agent.arun(message)
|
||||||
|
return str(response.content)
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
import argparse
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
from src.agent_runner import run_agent
|
||||||
|
|
||||||
|
|
||||||
|
def build_parser() -> argparse.ArgumentParser:
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Run base chat agent.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--message",
|
||||||
|
help="Single message mode. If omitted, starts interactive chat.",
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
async def _main() -> None:
|
||||||
|
load_dotenv()
|
||||||
|
args = build_parser().parse_args()
|
||||||
|
|
||||||
|
if args.message:
|
||||||
|
result = await run_agent(args.message)
|
||||||
|
print(result)
|
||||||
|
return
|
||||||
|
|
||||||
|
print("Chat mode started. Type 'exit' or 'quit' to stop.")
|
||||||
|
while True:
|
||||||
|
user_message = input("you> ").strip()
|
||||||
|
if not user_message:
|
||||||
|
continue
|
||||||
|
if user_message.lower() in {"exit", "quit"}:
|
||||||
|
print("Bye.")
|
||||||
|
break
|
||||||
|
|
||||||
|
result = await run_agent(user_message)
|
||||||
|
print(f"agent> {result}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(_main())
|
||||||
Reference in New Issue
Block a user