Skip to main content

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 Key shared data types: MemCell, ChatMessage, ConversationItem, user / agent / knowledge memories, ranking contracts, parsed / raw content, modality helpers, 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", "summary": "S"}), 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 / AgentProfilePatch / AgentProfileSignal / AgentProfileUpdate everalgo.types Agent-side memory and config-update 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

Metadata

Release files for everalgo-core 0.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for everalgo-core 0.5.1
File Size Uploaded
everalgo_core-0.5.1.tar.gz 51.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for everalgo-core 0.5.1
File Interpreter ABI Platform
everalgo_core-0.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 92.9 kB

Release files / everalgo_core-0.5.1.tar.gz

Download URL everalgo_core-0.5.1.tar.gz
Size 51.8 kB
Tags Source
SHA-256 checksum
How to use checksums
9a7c9d133d6781dedeaddbd2666f1e4aad35d2e1459c48f0d73be99c4b082674
BLAKE2b-256 checksum
How to use checksums
fa614fb8f64f3a801b1071b45512fbb9cc8e82bcdd9f466c3a13925ffc05bed2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.12.12

Release files / everalgo_core-0.5.1-py3-none-any.whl

Download URL everalgo_core-0.5.1-py3-none-any.whl
Size 41.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
447945a7ab0877074daf679c7b796e528d970891d5e4a9ac158f6d4cb4183f43
BLAKE2b-256 checksum
How to use checksums
3bfc8166caaac374e09ea42bfb34f5eb736ead580ecae2207790c31550c56f4b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.12.12

Release history Release notifications | RSS feed

This release

0.5.1 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page