Observed since 20 Oct, 21:25 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agenkit
The foundation layer for AI agents
Build production-ready AI agent systems.
Agenkit is a lightweight, cross-language toolkit for building distributed AI agents that scale from prototype to production without rewriting your code.
Building production AI agent systems is hard:
Agenkit provides the production infrastructure you need:
Prototype → Production
┌─────────────────────────────────────────────┐
│ Your Agents (Python for development) │
└──────────────┬──────────────────────────────┘
│
│ Same Interface
↓
┌─────────────────────────────────────────────┐
│ Agenkit Toolkit │
│ • Automatic retries & circuit breakers │
│ • Distributed tracing & metrics │
│ • Cross-language support (Python ↔ Go) │
│ • Multiple transports (HTTP/gRPC/WS) │
└─────────────────────────────────────────────┘
Key Insight: Write your agents once in Python. Deploy them in Go for up to 18x lower framework/transport overhead in our benchmarks (see Performance below) — the LLM call itself still dominates wall-clock time. Same interface, zero rewrites.
Create a simple agent:
from agenkit import Agent, Message
class MyAgent(Agent):
@property
def name(self) -> str:
return "my-agent"
async def process(self, message: Message) -> Message:
return Message(
role="agent",
content=f"Processed: {message.content}"
)
# Use it
agent = MyAgent()
response = await agent.process(Message(role="user", content="Hello!"))
from agenkit.middleware import RetryConfig, RetryDecorator, CircuitBreakerDecorator
# Wrap with resilience
production_agent = RetryDecorator(
CircuitBreakerDecorator(agent),
RetryConfig(max_retries=3),
)
# Now handles failures automatically
response = await production_agent.process(message)
# Run locally
python my_agent.py
# Deploy with Docker
docker-compose up
# Scale with Kubernetes
kubectl apply -f deploy/kubernetes/
class Agent:
name: str # Unique identifier
async def process(msg) -> Message # Process messages
That's it. Everything else is optional.
from agenkit.middleware import (
CircuitBreakerConfig,
CircuitBreakerDecorator,
RetryConfig,
RetryDecorator,
TimeoutConfig,
TimeoutDecorator,
)
# Start simple
agent = MyAgent()
# Add retry logic
agent = RetryDecorator(agent, RetryConfig(max_retries=3))
# Add circuit breaker
agent = CircuitBreakerDecorator(agent, CircuitBreakerConfig(failure_threshold=5))
# Add timeouts (timeout_ms for clarity)
agent = TimeoutDecorator(agent, TimeoutConfig(timeout_ms=30000))
# Stack as many as you need
Every middleware is <100 lines. Easy to understand, modify, or replace.
Write once. Deploy anywhere. Nine language implementations (Python is the
reference; all nine share the same Agent/Message/Tool core and most of
the 18 core patterns — C#, Java, and Scala are missing AgentsAsTools; see
Status for the exact per-language spec-conformance breakdown):
# Python - Prototype quickly with ML ecosystem
class MyAgent(Agent):
async def process(self, message):
return process_with_python_libs(message)
// TypeScript - Full-stack with browser support
class MyAgent implements Agent {
async process(message: Message): Promise<Message> {
return processWithTypeScriptLibs(message);
}
}
// Go - Production scale (up to 18x lower transport overhead vs Python in our benchmarks)
type MyAgent struct{}
func (a *MyAgent) Process(ctx context.Context, msg *Message) (*Message, error) {
return processWithGoLibs(msg)
}
// C++ - Maximum performance with zero-overhead abstractions
class MyAgent : public Agent {
public:
Message process(const Message& msg) override {
return process_with_cpp_libs(msg);
}
};
// Rust - Memory safety + performance (up to 20x lower transport overhead vs Python in our benchmarks)
struct MyAgent;
impl Agent for MyAgent {
async fn process(&self, message: Message) -> Result<Message, AgentError> {
process_with_rust_libs(message).await
}
}
// Zig - Systems programming with safety (up to 22x lower transport overhead vs Python in our benchmarks)
const MyAgent = struct {
pub fn process(self: *MyAgent, message: Message) !Message {
return processWithZigLibs(message);
}
};
Same interface across all languages. Python, Go, and Rust are the most complete; C#, Java, and Scala are newer and still filling in advanced subsystems (skills, some adapters). Choose the right tool for each service.
from agenkit.observability import TracingMiddleware, init_tracing
# Enable tracing
init_tracing("my-service")
# Wrap agent
traced_agent = TracingMiddleware(agent)
# Every operation now traced in Jaeger
View traces: http://localhost:16686
# Inspect agent state during debugging or production
result = agent.introspect()
print(f"Agent: {result.agent_name}")
print(f"Capabilities: {result.capabilities}")
print(f"Internal state: {result.internal_state}")
print(f"Memory: {result.memory_state}")
# Use for monitoring
def check_agent_health(agent):
result = agent.introspect()
return result.internal_state.get("error_count", 0) < 10
# Use for testing
def test_agent_state():
result1 = agent.introspect()
await agent.process(message)
result2 = agent.introspect()
assert result2.internal_state["msg_count"] > result1.internal_state["msg_count"]
Introspection ≠ Reflection:
from agenkit.adapters.python import GRPCServer, LocalAgent
from agenkit.adapters.python.http_server import HTTPAgentServer
# Same agent, different transports
await HTTPAgentServer(agent, port=8080).start() # REST API
await GRPCServer(agent, "localhost:50051").start() # High performance
await LocalAgent(agent, endpoint="ws://127.0.0.1:8765").start() # Bidirectional streaming
Choose the right protocol for each use case.
# Python
pip install agenkit
# Go
go get github.com/scttfrdmn/agenkit-go
# TypeScript/Node.js
npm install @agenkit/core
# C++
# Clone and build (CMake required)
git clone https://github.com/scttfrdmn/agenkit.git
cd agenkit/agenkit-cpp && mkdir build && cd build && cmake .. && make
# Rust
cargo add agenkit
# Zig
# Clone and build (Zig 0.12+ required)
git clone https://github.com/scttfrdmn/agenkit.git
cd agenkit/agenkit-zig && zig build
# Install only what you need
pip install agenkit[openai] # OpenAI (GPT-4, GPT-3.5)
pip install agenkit[anthropic] # Anthropic (Claude 3.5)
pip install agenkit[aws] # AWS Bedrock
pip install agenkit[google] # Google Gemini
pip install agenkit[ollama] # Ollama (local models)
# Multiple providers
pip install agenkit[openai,anthropic]
# All providers
pip install agenkit[all-providers]
# With Redis memory backend
pip install agenkit[redis]
# Everything (for development)
pip install agenkit[all]
See INSTALLATION.md for complete installation guide.
Transport Overhead: <1% of total time in realistic LLM workloads
Language Performance (framework/transport overhead, not general application performance):
These figures — and the "18x"/"20x"/"22x" multipliers mentioned earlier in
this README for Go/Rust/Zig — were measured in November 2025 against Python
3.14.0 and Go 1.21–1.22 on Apple Silicon (see benchmarks/BASELINES.md).
Both the Go toolchain and several dependency versions have since moved, so
the exact multiplier should not be read as current; the qualitative
conclusion that transport/framework overhead is a small fraction of a
100–1000ms LLM call has held across every measurement to date. See
COMPATIBILITY.md for the
full caveat and how to regenerate current numbers.
Scale:
See benchmarks/BASELINES.md for detailed performance data.
┌─────────────────────────────────────────┐
│ Your Application (Agents + Logic) │
└──────────────┬──────────────────────────┘
│
┌──────────────┴──────────────────────────┐
│ Optional Middleware Layer │
│ (Add only what you need) │
│ • Retry • Caching │
│ • Timeout • Batching │
│ • Circuit Breaker │
└──────────────┬──────────────────────────┘
│
┌──────────────┴──────────────────────────┐
│ Optional Transport Layer │
│ • HTTP • gRPC • WebSocket │
└──────────────┬──────────────────────────┘
│
┌──────────────┴──────────────────────────┐
│ Core Interface (Required) │
│ • Agent • Message • Tool │
└─────────────────────────────────────────┘
Design Philosophy: Start simple. Add complexity only when you need it.
Total time investment: ~6 hours from zero to production deployment with pattern mastery.
We provide 27+ examples covering common use cases:
Getting Started:
Production Features:
Advanced:
We welcome contributions! See our Contributing Guide.
# Clone repository
git clone https://github.com/scttfrdmn/agenkit.git
cd agenkit
# Install dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Run type checking
mypy agenkit/
Apache License 2.0 - See LICENSE for details.
v0.89.0 — 9 language implementations, Python reference (see the root VERSION
file for the current number — this line will drift again if hand-maintained)
The shared core is the Agent/Message/Tool interface plus 18 named
patterns (listed below). The "Patterns implemented" column is a
spec-presence conformance score from spec-conformance.json
(scripts/parity/spec_conformance.py, #909/#913) — for each of the 18
patterns named in specs/patterns/*.yaml, does a source file implementing
it actually exist in that language, checked by filename/class-name (with an
alias table for legitimate naming divergence, e.g. Python's
memory.py/MemoryHierarchy vs. C#'s MemoryAugmentedAgent.cs) rather than
by counting classes. This replaced an earlier raw class-count column
(feature-manifest.json's patterns count) that answered a different,
noisier question — it could not distinguish "no implementation exists" from
"the implementation has an unconventional class name," and undercounted
C#/Java/Scala for months due to a scanner bug (#918) before this metric
existed. feature-manifest.json remains as a secondary, diagnostic
class-count signal; it is no longer this table's source. The "Tests" column
is the test count from the parity report; "Depth" reflects how many advanced
subsystems (memory, skills, reasoning memory, full adapter set) are
implemented.
| Language | Patterns implemented | LLM Adapters | Tests | Depth |
|---|---|---|---|---|
| Python | 18/18 | 7 | 2229 | Reference — all subsystems |
| Go | 18/18 | 7 (+vLLM, SGLang) | 1341 | Complete — incl. reasoning memory, skills |
| TypeScript | 18/18 | 7 | 976 | Broad — no skills / reasoning memory |
| Rust | 18/18 | 6 | 1352 | Complete — incl. skills |
| C++ | 18/18 | 5 | 1133 | Broad — safety/ not yet implemented |
| Zig | 18/18 | 8 | 671 | Broad — no skills |
| C# (.NET) | 17/18 (missing AgentsAsTools) | 2 (+mock) | 272 | Newer — no skills |
| Java | 17/18 (missing AgentsAsTools) | 2 (+mock) | 358 | Newer — no skills |
| Scala | 17/18 (missing AgentsAsTools) | mock only | 363 | Newest — LLM adapters are stubs |
18 Core Patterns documented in the Agent Patterns Book: AgentsAsTools, Autonomous, Collaborative, Conversational, Fallback, HumanInLoop, MemoryHierarchy, MultiAgent, Orchestration, Parallel, Planning, ReAct, ReasoningWithTools, Reflection, Router, Sequential, Supervisor, Task.
Six languages (Python, Go, TypeScript, Rust, C++, Zig) implement all 18; C#, Java, and Scala implement 17 of 18 (missing AgentsAsTools).
Usage (v0.86–v0.87) — unified Usage struct across
all 9 language cores, plus Bedrock prompt-cache token countsAgentSkill, SkillRegistry, SkillEnabledAgent (Python, Go, Rust)v0.88.0 is intentionally skipped — reserved for the observability milestone (#715). See
CHANGELOG.md for the full release history.
Ready to build production AI agents? Visit agenkit.dev or get started in 5 minutes →
Patterns are at full parity across languages; test-count parity varies — the
secondary languages have fewer tests than the Python reference. Counts are
regenerated via scripts/test-parity.sh (and surfaced by the Parity Validation
CI workflow). Relative to Python's 2229 tests:
| Language | Tests | vs Python |
|---|---|---|
| Rust | 1352 | 61% |
| Go | 1330 | 60% |
| C++ | 1133 | 51% |
| TypeScript | 976 | 44% |
| Zig | 671 | 30% |
| Java | 358 | 16% |
| Scala | 363 | 16% |
| C# | 272 | 12% |
Counts are regenerated via scripts/test-parity.sh.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
aiohttpEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | aiohttp>=3.9.0 | runtime |
aioquicEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | aioquic>=1.0.0 | runtime |
grpcioEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | grpcio>=1.60.0 | runtime |
httpxEnvironment{
"extras": "http2",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | httpx[http2]>=0.27.0 | runtime |
numpyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | numpy>=1.24.0 | runtime |
opentelemetry-apiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-api>=1.20.0 | runtime |
opentelemetry-exporter-otlpEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-exporter-otlp>=1.20.0 | runtime |
opentelemetry-exporter-prometheusEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-exporter-prometheus>=0.41b0 | runtime |
opentelemetry-instrumentation-system-metricsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-instrumentation-system-metrics>=0.41b0 | runtime |
opentelemetry-sdkEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-sdk>=1.20.0 | runtime |
protobufEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | protobuf>=4.25.0 | runtime |
pytest-covEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=7.0.0 | runtime |
pytest-xdistEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-xdist>=3.8.0 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0 | runtime |
scikit-learnEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | scikit-learn>=1.3.0 | runtime |
scipyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | scipy>=1.11.0 | runtime |
websocketsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | websockets>=12.0 | runtime |
anthropicEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | anthropic>=0.40.0; extra == "all" | runtime |
boto3Environment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | boto3>=1.34.0; extra == "all" | runtime |
botocoreEnvironment{
"extras": "crt",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | botocore[crt]>=1.34.0; extra == "all" | runtime |
google-genaiEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | google-genai>=0.3.0; extra == "all" | runtime |
litellmEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.50.0; extra == "all" | runtime |
ollamaEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | ollama>=0.1.0; extra == "all" | runtime |
openaiEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | openai>=1.50.0; extra == "all" | runtime |
redisEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | redis>=4.5.0; extra == "all" | runtime |
anthropicEnvironment{
"extras": "",
"marker": "extra == \"all-providers\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | anthropic>=0.40.0; extra == "all-providers" | runtime |
boto3Environment{
"extras": "",
"marker": "extra == \"all-providers\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | boto3>=1.34.0; extra == "all-providers" | runtime |
botocoreEnvironment{
"extras": "crt",
"marker": "extra == \"all-providers\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | botocore[crt]>=1.34.0; extra == "all-providers" | runtime |
google-genaiEnvironment{
"extras": "",
"marker": "extra == \"all-providers\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | google-genai>=0.3.0; extra == "all-providers" | runtime |
litellmEnvironment{
"extras": "",
"marker": "extra == \"all-providers\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.50.0; extra == "all-providers" | runtime |
ollamaEnvironment{
"extras": "",
"marker": "extra == \"all-providers\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | ollama>=0.1.0; extra == "all-providers" | runtime |
openaiEnvironment{
"extras": "",
"marker": "extra == \"all-providers\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | openai>=1.50.0; extra == "all-providers" | runtime |
anthropicEnvironment{
"extras": "",
"marker": "extra == \"anthropic\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | anthropic>=0.40.0; extra == "anthropic" | runtime |
boto3Environment{
"extras": "",
"marker": "extra == \"aws\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | boto3>=1.34.0; extra == "aws" | runtime |
botocoreEnvironment{
"extras": "crt",
"marker": "extra == \"aws\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | botocore[crt]>=1.34.0; extra == "aws" | runtime |
pytest-benchmarkEnvironment{
"extras": "",
"marker": "extra == \"benchmarks\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-benchmark>=4.0.0; extra == "benchmarks" | runtime |
banditEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | bandit>=1.7.5; extra == "dev" | runtime |
grpcio-toolsEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | grpcio-tools>=1.60.0; extra == "dev" | runtime |
hypothesisEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | hypothesis>=6.0.0; extra == "dev" | runtime |
jinja2Environment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | jinja2>=3.1.0; extra == "dev" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.5.0; extra == "dev" | runtime |
pylintEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pylint>=3.0.0; extra == "dev" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio>=0.21.0; extra == "dev" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=4.1.0; extra == "dev" | runtime |
pytest-timeoutEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-timeout>=2.2.0; extra == "dev" | runtime |
pytest-xdistEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-xdist>=3.5.0; extra == "dev" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.4.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | ruff==0.16.2; extra == "dev" | runtime |
google-genaiEnvironment{
"extras": "",
"marker": "extra == \"google\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | google-genai>=0.3.0; extra == "google" | runtime |
litellmEnvironment{
"extras": "",
"marker": "extra == \"litellm\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.50.0; extra == "litellm" | runtime |
anthropicEnvironment{
"extras": "",
"marker": "extra == \"llm\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | anthropic>=0.40.0; extra == "llm" | runtime |
boto3Environment{
"extras": "",
"marker": "extra == \"llm\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | boto3>=1.34.0; extra == "llm" | runtime |
google-genaiEnvironment{
"extras": "",
"marker": "extra == \"llm\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | google-genai>=0.3.0; extra == "llm" | runtime |
litellmEnvironment{
"extras": "",
"marker": "extra == \"llm\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.50.0; extra == "llm" | runtime |
ollamaEnvironment{
"extras": "",
"marker": "extra == \"llm\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | ollama>=0.1.0; extra == "llm" | runtime |
openaiEnvironment{
"extras": "",
"marker": "extra == \"llm\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | openai>=1.50.0; extra == "llm" | runtime |
ollamaEnvironment{
"extras": "",
"marker": "extra == \"ollama\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | ollama>=0.1.0; extra == "ollama" | runtime |
openaiEnvironment{
"extras": "",
"marker": "extra == \"openai\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | openai>=1.50.0; extra == "openai" | runtime |
redisEnvironment{
"extras": "",
"marker": "extra == \"redis\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | redis>=4.5.0; extra == "redis" | runtime |
boto3Environment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | boto3>=1.34.0; extra == "test" | runtime |
botocoreEnvironment{
"extras": "crt",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | botocore[crt]>=1.34.0; extra == "test" | runtime |
hypothesisEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | hypothesis>=6.0.0; extra == "test" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio>=0.21.0; extra == "test" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=4.1.0; extra == "test" | runtime |
pytest-timeoutEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-timeout>=2.2.0; extra == "test" | runtime |
pytest-xdistEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest-xdist>=3.5.0; extra == "test" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.12",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.4.0; extra == "test" | runtime |
bdist_wheel · 513.78 KB · Python py3
sdist · 389.17 KB · Python source
Observed since 20 Oct, 21:25 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:a64232e722355d4d84de0554d116dedc40d96c092ba4591c5909766c81c4a6ae