Skip to main content

EverAlgo foundation: types, LLM client + providers, prompt validators, testing helpers.

Project description

everalgo-core

Foundation distribution of EverAlgo — data types, LLM client + provider routing, prompt helpers, and testing utilities shared by every other everalgo-* package.

See the umbrella project: EverAlgo monorepo and the architecture document at docs/concepts/architecture.md.

Install

pip install everalgo-core

What this distribution provides

Subpackage What it contains
everalgo.types All shared data types: MemCell, ChatMessage, ConversationItem, Episode, Foresight, AtomicFact, Profile, AgentCase, AgentSkill, RankInput, RankOutput, Candidate, ScoredItem, ParsedContent, RawFile, tool-call types
everalgo.llm LLMClient Protocol, LLMConfig, ChatMessage / ChatResponse / Usage, LLMError, build_client factory
everalgo.llm.format format_atomic_fact_time, format_message_timestamp, format_natural_language_time — timestamp rendering for LLM prompts
everalgo.llm.parse parse_llm_json_object — three-tier robust JSON-object extraction
everalgo.llm.providers.openai_compat OpenAICompatClient — wraps openai.AsyncOpenAI
everalgo.prompts render_prompt — shared template substitution helper
everalgo.testing FakeLLMClient, CallRecord, and assert_*_shape structural assertion helpers

Quick start

from everalgo.llm import LLMConfig, build_client
from everalgo.llm.types import ChatMessage

config = LLMConfig(model="gpt-4o-mini", api_key="sk-...", base_url="https://api.openai.com/v1")
client = build_client(config)

response = await client.chat(
    messages=[ChatMessage(role="user", content="Hello")],
)
print(response.content)

Using FakeLLMClient in tests

import json
from everalgo.llm.types import ChatResponse
from everalgo.testing import FakeLLMClient

# Scripted mode — responses are returned in order
fake = FakeLLMClient(responses=[
    ChatResponse(content=json.dumps({"title": "T", "content": "C"}), model="fake"),
])

# Handler mode — full control over each call
from everalgo.llm.types import ChatMessage as LLMMsg
def handler(messages: list[LLMMsg], **_) -> ChatResponse:
    return ChatResponse(content="ok", model="fake")

fake = FakeLLMClient(handler=handler)
print(fake.call_count)  # 0

LLM utilities

everalgo.llm.format and everalgo.llm.parse provide prompt-rendering helpers used by boundary detection and every extractor.

everalgo.llm.format — timestamp rendering

from everalgo.llm.format import format_atomic_fact_time, format_message_timestamp, format_natural_language_time

# ISO 8601 UTC anchor — used as inline message prefix in prompts
# e.g. "2023-11-14T22:13:20Z"
ts_str = format_message_timestamp(1_700_000_000_000)

# Human-readable label for LLM time-of-day reasoning
# Example output: "November 14, 2023 (Tuesday) at 10:13 PM UTC"
label = format_natural_language_time(1_700_000_000_000, lang="en")

everalgo.llm.parse — robust JSON extraction

from everalgo.llm.parse import parse_llm_json_object

# Three-tier fallback: fence block → direct loads → outermost braces
result = parse_llm_json_object('```json\n{"key": "value"}\n```')
# → {"key": "value"}

parse_llm_json_object(raw: str) -> dict[str, Any] tries each strategy in order and raises ValueError if all three fail.

everalgo._tokenize — token counting

count_tokens(text: str) → int and force_split(text: str, *, max_tokens: int) → list[str] are module-private utilities (used internally by boundary algorithms; not part of the public everalgo.* surface). They use OpenAI o200k_base encoding via tiktoken.

API surface

Symbol Module Role
MemCell everalgo.types Boundary-detected conversation slice; items: list[ConversationItem], timestamp: int
ChatMessage everalgo.types Chat wire type: id, role, content, timestamp, sender_id, sender_name
ConversationItem everalgo.types ChatMessage | ToolCallRequest | ToolCallResult discriminated union
Episode / Foresight / AtomicFact / Profile everalgo.types User-side memory output types
AgentCase / AgentSkill everalgo.types Agent-side memory output types
RankInput / RankOutput / Candidate / ScoredItem everalgo.types Rank I/O contracts
LLMClient everalgo.llm Protocol — chat(messages, *, model=None, ...) → ChatResponse
LLMConfig everalgo.llm model, api_key (SecretStr), base_url, temperature, max_tokens, timeout
build_client everalgo.llm Factory: LLMConfig → LLMClient (returns OpenAICompatClient)
LLMError everalgo.llm Base exception raised by all providers
OpenAICompatClient everalgo.llm.providers.openai_compat Wraps openai.AsyncOpenAI; no retry logic
format_atomic_fact_time everalgo.llm.format Human-readable AtomicFact timestamp label mirroring evercore EventLog (no space before weekday, no UTC suffix)
format_message_timestamp everalgo.llm.format ISO 8601 UTC string from a millisecond timestamp
format_natural_language_time everalgo.llm.format Human-readable timestamp label; lang="en" or "zh"
parse_llm_json_object everalgo.llm.parse Robust JSON-object parser with three-tier fallback
render_prompt everalgo.prompts Template substitution for {placeholder} patterns
FakeLLMClient everalgo.testing In-memory LLMClient double; responses=[...] or handler=callable
CallRecord everalgo.testing Single recorded chat() invocation (for test assertions)
assert_episode_shape everalgo.testing Structural assertion: required Episode fields are non-empty
assert_foresight_shape everalgo.testing Structural assertion for Foresight
assert_atomic_fact_shape everalgo.testing Structural assertion for AtomicFact
assert_profile_shape everalgo.testing Structural assertion for Profile

Related distributions

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

everalgo_core-0.3.0.tar.gz (54.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

everalgo_core-0.3.0-py3-none-any.whl (44.1 kB view details)

Uploaded Python 3

File details

Details for the file everalgo_core-0.3.0.tar.gz.

File metadata

  • Download URL: everalgo_core-0.3.0.tar.gz
  • Upload date:
  • Size: 54.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for everalgo_core-0.3.0.tar.gz
Algorithm Hash digest
SHA256 cd91204a336ad459ae1c03eda97cdb0575534b675523cb775188debacc8f241b
MD5 422b4a58b56be85cca01fe64b770a051
BLAKE2b-256 53d7395c0504b426bf25cd9af60d5bab8f9c3131a6dee53a16b2a5a6a477b6c8

See more details on using hashes here.

File details

Details for the file everalgo_core-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: everalgo_core-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 44.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for everalgo_core-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5a25b784a2d24e28a762fee5751174a68c2eda168c353c33740ca3183069c02b
MD5 513ce295f03c5d8860fcd94c429c57e7
BLAKE2b-256 2b5dad60747004d873b23443412a74449b39640f08c4f6548fd4442641c3ff17

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page