Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c86d6e4e4d | ||
|
|
d488c2be1d | ||
|
|
6d2b043eca | ||
|
|
fa611192c8
|
||
|
|
e69b83694c
|
||
|
|
1781a1dbf5 | ||
|
|
64acdb29b2
|
||
|
|
d148b95534 | ||
|
|
15359e2ae3 |
@@ -15,12 +15,12 @@ jobs:
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
apt update && apt upgrade -y
|
||||
apt install rustc cargo python-is-python3 pip python3-venv python3-virtualenv libmagic-dev git -y
|
||||
virtualenv .venv
|
||||
apt update -qq
|
||||
apt install -y -qq python-is-python3 pip python3-venv libmagic-dev git
|
||||
python -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install --upgrade pip -q
|
||||
pip install -r requirements.txt --prefer-binary -q
|
||||
git config --global user.name "Blog Creator"
|
||||
git config --global user.email "ridgway.infrastructure@gmail.com"
|
||||
git config --global push.autoSetupRemote true
|
||||
|
||||
@@ -17,14 +17,19 @@ journalist draft is chunked, embedded, and stored in a collection; the editor
|
||||
receives the top-N most relevant chunks as context.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import random
|
||||
import re
|
||||
import string
|
||||
from datetime import datetime
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
if TYPE_CHECKING:
|
||||
import chromadb # noqa: F811
|
||||
|
||||
import chromadb
|
||||
from crewai.flow.flow import Flow, listen, start
|
||||
from ollama import Client
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
@@ -85,7 +90,21 @@ class BlogFlow(Flow[BlogFlowState]):
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _get_chroma_client() -> chromadb.HttpClient:
|
||||
def _get_chroma_client() -> "chromadb.HttpClient":
|
||||
# Lazily import chromadb here rather than at module level.
|
||||
# chromadb unconditionally loads hnswlib (a native C++ library
|
||||
# compiled with AVX instructions) even when using HttpClient
|
||||
# to talk to an external ChromaDB server. Deferring the import
|
||||
# avoids "Illegal instruction" (SIGILL) crashes in environments
|
||||
# that lack AVX support (e.g. act, older CI runners).
|
||||
try:
|
||||
import chromadb
|
||||
except ImportError as exc:
|
||||
raise RuntimeError(
|
||||
"chromadb is required for the editor phase but could not be "
|
||||
f"imported: {exc}"
|
||||
) from exc
|
||||
|
||||
chroma_port = int(os.environ["CHROMA_PORT"])
|
||||
return chromadb.HttpClient(host=os.environ["CHROMA_HOST"], port=chroma_port)
|
||||
|
||||
@@ -127,7 +146,7 @@ class BlogFlow(Flow[BlogFlowState]):
|
||||
print(f"Error generating embeddings: {exc}")
|
||||
return []
|
||||
|
||||
def _load_drafts_to_vector_db(self, drafts: list[str]) -> chromadb.Collection:
|
||||
def _load_drafts_to_vector_db(self, drafts: list[str]) -> "chromadb.Collection":
|
||||
"""Load journalist drafts into a new ChromaDB collection and return it."""
|
||||
chroma = self._get_chroma_client()
|
||||
collection_name = (
|
||||
@@ -165,7 +184,7 @@ class BlogFlow(Flow[BlogFlowState]):
|
||||
return collection
|
||||
|
||||
@staticmethod
|
||||
def _query_vector_db(collection: chromadb.Collection, query_text: str) -> str:
|
||||
def _query_vector_db(collection: "chromadb.Collection", query_text: str) -> str:
|
||||
"""Query the ChromaDB collection and return the most relevant
|
||||
document chunks joined as a single string."""
|
||||
ollama_client = BlogFlow._get_ollama_client()
|
||||
|
||||
@@ -42,7 +42,7 @@ class GitRepository:
|
||||
print(f"Cloning failed: {e}")
|
||||
return False
|
||||
|
||||
def fetch(self, remote_name="origin", ref_name="main"):
|
||||
def fetch(self, remote_name="origin", ref_name="master"):
|
||||
"""Fetch updates from a remote repository with authentication"""
|
||||
try:
|
||||
self.repo.remotes[remote_name].fetch(ref_name=ref_name)
|
||||
@@ -51,7 +51,7 @@ class GitRepository:
|
||||
print(f"Fetching failed: {e}")
|
||||
return False
|
||||
|
||||
def pull(self, remote_name="origin", ref_name="main"):
|
||||
def pull(self, remote_name="origin", ref_name="master"):
|
||||
"""Pull updates from a remote repository with authentication"""
|
||||
print("Pulling Latest Updates (if any)")
|
||||
try:
|
||||
@@ -93,8 +93,8 @@ class GitRepository:
|
||||
self.repo.git.checkout(title)
|
||||
self.pull(ref_name=title)
|
||||
else:
|
||||
# New branch, create from main
|
||||
self.repo.git.checkout("-b", title, "origin/main")
|
||||
# New branch, create from master
|
||||
self.repo.git.checkout("-b", title, "origin/master")
|
||||
|
||||
# Ensure destination directory exists
|
||||
dest_dir = f"{self.repo_path}src/content/"
|
||||
|
||||
Reference in New Issue
Block a user