The production-grade GenAI metaframework built on Pydantic AI.
Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0.
- Why fireflyframework-genai?
- Key Principles
- Architecture at a Glance
- Feature Highlights
- Requirements
- Installation
- 5-Minute Quick Start
- Using in Jupyter Notebooks
- Learn the Framework
- Development
- Contributing
- License
Pydantic AI provides an excellent foundation: type-safe, model-agnostic agents with structured output. But a production GenAI system demands far more than a single agent call. You need to orchestrate multi-step reasoning, validate and retry LLM outputs against schemas, manage conversation memory across turns, observe every call with traces and metrics, run A/B experiments to compare models, and expose the whole thing over REST or message queues β all without coupling your domain logic to infrastructure concerns.
fireflyframework-genai is the production framework built on top of Pydantic AI. It extends the engine with six composable layers β from core configuration through agent management, intelligent reasoning, experimentation, pipeline orchestration, and service exposure β so that every concern has a dedicated, protocol-driven module. You write your business logic; the framework provides the architecture.
What "metaframework" means in practice:
- You keep Pydantic AI's familiar
Agent,Tool, andRunContextAPIs unchanged. - The framework wraps them with lifecycle hooks, registries, delegation routers, memory managers, reasoning patterns, validation loops, DAG pipelines, and exposure endpoints β all optional, all composable, all swappable through Python protocols.
- No vendor lock-in: switch models, swap memory backends, or replace the REST layer without touching your agent code.
-
Protocol-driven contracts β Every extension point is defined as a
@runtime_checkableProtocolor abstract base class. The framework ships eleven protocols (AgentLike,ToolProtocol,GuardProtocol,ReasoningPattern,DelegationStrategy,StepExecutor,CompressionStrategy,MemoryStore,ValidationRule,Chunker,QueueConsumer/QueueProducer) so you can swap or extend any component without modifying framework internals. -
Convention over configuration β Sensible defaults everywhere.
FireflyGenAIConfigis a Pydantic Settings singleton that reads from environment variables prefixed withFIREFLY_GENAI_and.envfiles. One config object governs model defaults, retry counts, token limits, observability endpoints, memory backends, and validation thresholds β override only what you need. -
Layered composition β Six layers with strict top-down dependency flow: Core β Agent β Intelligence β Experimentation β Orchestration β Exposure. Higher layers depend on lower layers but never the reverse, keeping the dependency graph acyclic and each module independently testable.
-
Optional dependencies β Heavy libraries (
fastapi,aiokafka,aio-pika,redis) are declared as pip extras ([rest],[studio],[kafka],[rabbitmq],[redis],[all]). The core framework imports them lazily inside factory functions so that you install only what your deployment requires.
graph TD
subgraph Exposure Layer
REST["REST API<br/><small>create_genai_app Β· SSE streaming<br/>health Β· middleware Β· router</small>"]
QUEUES["Message Queues<br/><small>Kafka Β· RabbitMQ Β· Redis<br/>consumers Β· producers Β· QueueRouter</small>"]
end
subgraph Orchestration Layer
PIPE["Pipeline / DAG Engine<br/><small>DAG Β· DAGNode Β· DAGEdge<br/>PipelineEngine Β· PipelineBuilder<br/>AgentStep Β· ReasoningStep Β· CallableStep<br/>FanOutStep Β· FanInStep</small>"]
end
subgraph Experimentation Layer
EXP["Experiments<br/><small>Experiment Β· Variant<br/>ExperimentRunner Β· VariantComparator<br/>ExperimentTracker</small>"]
LAB["Lab<br/><small>LabSession Β· Benchmark<br/>EvalOrchestrator Β· EvalDataset<br/>ModelComparison</small>"]
end
subgraph Intelligence Layer
REASON["Reasoning Patterns<br/><small>ReAct Β· CoT Β· PlanAndExecute<br/>Reflexion Β· ToT Β· GoalDecomposition<br/>ReasoningPipeline</small>"]
VAL["Validation & QoS<br/><small>OutputReviewer Β· OutputValidator<br/>ConfidenceScorer Β· ConsistencyChecker<br/>GroundingChecker Β· 5 rule types</small>"]
OBS["Observability<br/><small>FireflyTracer Β· FireflyMetrics<br/>FireflyEvents Β· UsageTracker<br/>CostCalculator Β· @traced Β· @metered<br/>configure_exporters</small>"]
EXPL["Explainability<br/><small>TraceRecorder Β· ExplanationGenerator<br/>AuditTrail Β· ReportBuilder</small>"]
end
subgraph Agent Layer
AGT["Agents<br/><small>FireflyAgent Β· AgentRegistry<br/>DelegationRouter Β· AgentLifecycle<br/>@firefly_agent Β· 5 templates</small>"]
TOOLS["Tools<br/><small>BaseTool Β· ToolBuilder Β· ToolKit<br/>5 guards Β· 3 composers<br/>ToolRegistry Β· 9 built-ins</small>"]
PROMPTS["Prompts<br/><small>PromptTemplate Β· PromptRegistry<br/>3 composers Β· PromptValidator<br/>PromptLoader</small>"]
CONTENT["Content<br/><small>TextChunker Β· DocumentSplitter<br/>ImageTiler Β· BatchProcessor<br/>ContextCompressor Β· SlidingWindowManager</small>"]
MEM["Memory<br/><small>MemoryManager Β· ConversationMemory<br/>WorkingMemory Β· TokenEstimator<br/>InMemoryStore Β· FileStore</small>"]
end
subgraph Core Layer
CFG["Config<br/><small>FireflyGenAIConfig<br/>get_config Β· reset_config</small>"]
TYPES["Types & Protocols<br/><small>AgentLike Β· 10 protocols<br/>TypeVars Β· type aliases</small>"]
EXC["Exceptions<br/><small>FireflyGenAIError hierarchy<br/>18 exception classes</small>"]
PLUG["Plugin System<br/><small>PluginDiscovery<br/>3 entry-point groups</small>"]
end
REST --> PIPE
QUEUES --> PIPE
PIPE --> AGT
PIPE --> REASON
PIPE --> VAL
EXP --> AGT
LAB --> EXP
REASON --> AGT
OBS --> AGT
EXPL --> OBS
VAL --> AGT
AGT --> TOOLS
AGT --> PROMPTS
AGT --> CONTENT
AGT --> MEM
AGT --> CFG
TOOLS --> CFG
PROMPTS --> CFG
CONTENT --> CFG
MEM --> CFG
REASON --> CFG
VAL --> CFG
Every extension point is a @runtime_checkable protocol. Implement the protocol to
create your own components; the framework discovers them via duck typing.
classDiagram
class AgentLike {
<<Protocol>>
+run(prompt, **kwargs) Any
}
class ToolProtocol {
<<Protocol>>
+name: str
+description: str
+execute(**kwargs) Any
}
class GuardProtocol {
<<Protocol>>
+check(tool_name, kwargs) GuardResult
}
class ReasoningPattern {
<<Protocol>>
+execute(agent, input, **kwargs) ReasoningResult
}
class StepExecutor {
<<Protocol>>
+execute(context, inputs) Any
}
class DelegationStrategy {
<<Protocol>>
+select(agents, prompt, **kwargs) Any
}
class CompressionStrategy {
<<Protocol>>
+compress(text, max_tokens) str
}
class MemoryStore {
<<Protocol>>
+save(namespace, entry)
+load(namespace) list
+delete(namespace, entry_id)
+clear(namespace)
}
class ValidationRule {
<<Protocol>>
+name: str
+validate(value) ValidationRuleResult
}
class QueueConsumer {
<<Protocol>>
+start()
+stop()
}
class QueueProducer {
<<Protocol>>
+publish(message)
}
AgentLike <|.. FireflyAgent
AgentLike <|.. pydantic_ai.Agent
ToolProtocol <|.. BaseTool
ToolProtocol <|.. SequentialComposer
ToolProtocol <|.. FallbackComposer
ToolProtocol <|.. ConditionalComposer
GuardProtocol <|.. ValidationGuard
GuardProtocol <|.. RateLimitGuard
GuardProtocol <|.. ApprovalGuard
GuardProtocol <|.. SandboxGuard
GuardProtocol <|.. CompositeGuard
ReasoningPattern <|.. AbstractReasoningPattern
ReasoningPattern <|.. ReasoningPipeline
StepExecutor <|.. AgentStep
StepExecutor <|.. ReasoningStep
StepExecutor <|.. CallableStep
StepExecutor <|.. FanOutStep
StepExecutor <|.. FanInStep
DelegationStrategy <|.. RoundRobinStrategy
DelegationStrategy <|.. CapabilityStrategy
CompressionStrategy <|.. TruncationStrategy
CompressionStrategy <|.. SummarizationStrategy
CompressionStrategy <|.. MapReduceStrategy
MemoryStore <|.. InMemoryStore
MemoryStore <|.. FileStore
ValidationRule <|.. RegexRule
ValidationRule <|.. FormatRule
ValidationRule <|.. RangeRule
ValidationRule <|.. EnumRule
ValidationRule <|.. CustomRule
QueueConsumer <|.. KafkaAgentConsumer
QueueConsumer <|.. RabbitMQAgentConsumer
QueueConsumer <|.. RedisAgentConsumer
QueueProducer <|.. KafkaAgentProducer
QueueProducer <|.. RabbitMQAgentProducer
QueueProducer <|.. RedisAgentProducer
-
Agents β
FireflyAgentwrapspydantic_ai.Agentwith metadata, lifecycle hooks, and automatic registration.AgentRegistryprovides singleton name-based discovery.DelegationRouterroutes prompts across agent pools viaRoundRobinStrategyorCapabilityStrategy. The@firefly_agentdecorator defines an agent in one statement. Five template factories (create_summarizer_agent,create_classifier_agent,create_extractor_agent,create_conversational_agent,create_router_agent) cover common use cases out of the box. -
Tools β
ToolProtocol(duck-typed) andBaseTool(inheritance) let you choose your extensibility style.ToolBuilderprovides a fluent API for building tools without subclassing. Five guard types (ValidationGuard,RateLimitGuard,ApprovalGuard,SandboxGuard,CompositeGuard) intercept calls before execution. Three composition patterns (SequentialComposer,FallbackComposer,ConditionalComposer) build higher-order tools.ToolKitgroups tools for bulk registration. Nine built-in tools (calculator, datetime, filesystem, HTTP, JSON, search, shell, text, database) are ready to attach to any agent. -
Prompts β
PromptTemplaterenders Jinja2 templates with variable validation and token estimation.PromptRegistrymaps names to versioned templates. Three composers (SequentialComposer,ConditionalComposer,MergeComposer) combine templates at render time.PromptValidatorenforces token limits and required sections.PromptLoaderloads templates from strings, files, or entire directories. -
Reasoning β Six pluggable patterns implement
AbstractReasoningPattern's template-method loop (_reasonβ_actβ_observeβ_should_continue): ReAct (observe-think-act), Chain of Thought (step-by-step), Plan-and-Execute (goal β plan β steps with optional replanning), Reflexion (execute β critique β retry), Tree of Thoughts (branch β evaluate β select), and Goal Decomposition (goal β phases β tasks). All produce structuredReasoningResultwithReasoningTrace. Prompts are slot-overridable.OutputReviewercan validate final outputs.ReasoningPipelinechains patterns sequentially. -
Content β
TextChunkersplits by tokens, sentences, or paragraphs with configurable overlap.DocumentSplitterdetects page breaks and section separators.ImageTilercomputes tile coordinates for VLM processing.BatchProcessorruns chunks through an agent concurrently with a semaphore.ContextCompressordelegates to pluggable strategies (TruncationStrategy,SummarizationStrategy,MapReduceStrategy).SlidingWindowManagermaintains a rolling token-budgeted context window. -
Memory β
ConversationMemorystores per-conversation turn history with token-budget enforcement (newest-first FIFO eviction).WorkingMemoryprovides a scoped key-value scratchpad backed byMemoryStore(InMemoryStoreorFileStore).MemoryManagercomposes both behind a unified API and supportsfork()for isolating working memory in delegated agents or pipeline branches while sharing conversation context. -
Validation β Five composable rules (
RegexRule,FormatRule,RangeRule,EnumRule,CustomRule) feed intoFieldValidatorandOutputValidator.OutputReviewerwraps agent calls with parse-then-validate retry logic: on failure it builds a feedback prompt and retries up to N times. QoS guards (ConfidenceScorer,ConsistencyChecker,GroundingChecker) detect hallucinations and low-quality extractions before they propagate downstream. -
Pipeline β
DAGholdsDAGNodeandDAGEdgeobjects with cycle detection and topological sort.PipelineEngineexecutes nodes level-by-level viaasyncio.gatherfor maximum concurrency, with per-node condition gates, retries, and timeouts.PipelineBuilderoffers a fluent API (add_node/add_edge/chain). Five step types (AgentStep,ReasoningStep,CallableStep,FanOutStep,FanInStep) adapt agents, patterns, and functions to DAG nodes. -
Observability β
FireflyTracercreates OpenTelemetry spans scoped to agents, tools, and reasoning steps.FireflyMetricsrecords tokens (total, prompt, completion), latency, cost, errors, and reasoning depth via the OTel metrics API.FireflyEventsemits structured log records.@tracedand@metereddecorators instrument any function with one line.configure_exporterssets up OTLP or console exporters.UsageTrackerautomatically records token usage, cost estimates, and latency for every agent run, reasoning step, and pipeline execution.CostCalculatorsupports a built-in static price table and optionalgenai-pricesintegration. Budget enforcement logs warnings when configurable thresholds are exceeded. -
Explainability β
TraceRecordercaptures every LLM call, tool invocation, and reasoning step asDecisionRecordobjects.ExplanationGeneratorturns records into human-readable narratives.AuditTrailprovides an append-only, immutable log with JSON export for compliance.ReportBuilderproduces Markdown and JSON reports with statistics. -
Experiments β
Experimentdefines variants with model, temperature, and prompt overrides.ExperimentRunnerexecutes all variants against a dataset.ExperimentTrackerpersists results with optional JSON export.VariantComparatorcomputes latency, output length, and comparison summaries. -
Lab β
LabSessionmanages interactive agent sessions with history.Benchmarkruns agents against standardised inputs and reports p95 latency.EvalOrchestratorscores agent outputs with pluggableScorerfunctions.EvalDatasetloads/saves test cases from JSON.ModelComparisonruns the same prompts across multiple agents for side-by-side analysis. -
Exposure β
create_genai_app()produces a FastAPI application with auto-generatedPOST /agents/{name}/runendpoints, SSE streaming viasse_stream, health/readiness/liveness checks, CORS and request-ID middleware, and multimodal input support. Queue consumers (KafkaAgentConsumer,RabbitMQAgentConsumer,RedisAgentConsumer) route messages to agents. Queue producers (KafkaAgentProducer,RabbitMQAgentProducer,RedisAgentProducer) publish results back.QueueRouterprovides pattern-based message routing across agents. -
Studio β
firefly studiolaunches a browser-based visual IDE for building agent pipelines. Drag and connect Agent, Tool, Reasoning, and Condition nodes on an interactive canvas. The Code tab generates Python code from your graph in real time. An AI assistant (via WebSocket) helps you build pipelines through natural language. Project management persists graphs to disk. Checkpoints enable time-travel debugging. The frontend is a SvelteKit 5 SPA bundled inside the Python package β no Node.js needed. Install withpip install "fireflyframework-genai[studio]".
Runtime:
Core dependencies (installed automatically):
- pydantic-ai
>=1.56.0β Agent engine (model calls, tool dispatch, streaming) - pydantic
>=2.10.0β Data validation and settings - pydantic-settings
>=2.7.0β Environment-based configuration - Jinja2
>=3.1.0β Prompt template engine - OpenTelemetry API
>=1.29.0β Tracing and metrics - OpenTelemetry SDK
>=1.29.0β Telemetry exporters
Optional dependencies (installed via extras):
[rest]β FastAPI>=0.115.0, Uvicorn>=0.34.0, sse-starlette>=2.0.0[kafka]β aiokafka>=0.12.0[rabbitmq]β aio-pika>=9.5.0[redis]β redis-py>=5.2.0[costs]β genai-prices for up-to-date LLM pricing data[queues]β All queue backends (Kafka + RabbitMQ + Redis)[all]β Everything (REST + all queues + costs + security + HTTP)
LLM provider keys (at least one):
OPENAI_API_KEYfor OpenAI modelsANTHROPIC_API_KEYfor Anthropic modelsGEMINI_API_KEYfor Google Gemini modelsGROQ_API_KEYfor Groq models- Or any Pydantic AI-supported provider
The interactive installer detects your platform, checks Python and UV, lets you choose extras, and installs everything with progress indicators and verification.
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.sh | bashWindows (PowerShell):
irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.ps1 | iexBoth installers support non-interactive mode for CI/CD:
# macOS / Linux β install with all extras, no prompts
curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.sh | bash# Windows β install with all extras, no prompts
.\install.ps1 -NonInteractive -Extras allgit clone https://github.com/fireflyframework/fireflyframework-genai.git
cd fireflyframework-genai
uv sync --all-extras # or: pip install -e ".[all]"| Extra | What it adds | When you need it |
|---|---|---|
rest |
FastAPI, Uvicorn, SSE | Exposing agents as REST endpoints |
studio |
FastAPI, Uvicorn, httpx | Visual Studio IDE (firefly studio) |
kafka |
aiokafka | Consuming/producing via Apache Kafka |
rabbitmq |
aio-pika | Consuming/producing via RabbitMQ |
redis |
redis-py | Consuming/producing via Redis Pub/Sub |
queues |
All of the above | Any message queue integration |
postgres |
asyncpg, SQLAlchemy | PostgreSQL memory persistence |
mongodb |
motor, pymongo | MongoDB memory persistence |
security |
PyJWT, cryptography | RBAC, encryption, JWT auth |
http |
httpx | HTTP connection pooling for tools |
costs |
genai-prices | Up-to-date LLM pricing data |
all |
Everything above | Full deployment with all integrations |
python -c "import fireflyframework_genai; print(fireflyframework_genai.__version__)"
# 26.02.07If you installed with [studio], verify the CLI:
firefly --helpmacOS / Linux:
curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/uninstall.sh | bashWindows (PowerShell):
irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/uninstall.ps1 | iexOr manually remove the cloned directory and its virtual environment.
Create a .env file (or set environment variables):
# Provider API key (Pydantic AI reads these automatically)
OPENAI_API_KEY=sk-...
# ANTHROPIC_API_KEY=sk-ant-...
# GEMINI_API_KEY=...
# GROQ_API_KEY=gsk_...
# Framework settings
FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o
FIREFLY_GENAI_DEFAULT_TEMPERATURE=0.3The model string format is "provider:model_name" β e.g. "openai:gpt-4o",
"anthropic:claude-sonnet-4-20250514", "google:gemini-2.0-flash". Pydantic AI resolves
the matching API key from environment variables automatically. For programmatic credential
management (Azure, Bedrock, custom endpoints), pass a Pydantic AI Model object directly
to FireflyAgent(model=...) β see the tutorial.
from fireflyframework_genai.agents import firefly_agent
@firefly_agent(name="assistant", model="openai:gpt-4o")
def assistant_instructions(ctx):
return "You are a helpful conversational assistant."from fireflyframework_genai.tools import firefly_tool
@firefly_tool(name="lookup", description="Look up a term")
async def lookup(query: str) -> str:
return f"Result for {query}"from fireflyframework_genai.agents import FireflyAgent
from fireflyframework_genai.memory import MemoryManager
memory = MemoryManager(max_conversation_tokens=32_000)
agent = FireflyAgent(name="bot", model="openai:gpt-4o", memory=memory)
cid = memory.new_conversation()
result = await agent.run("Hello!", conversation_id=cid)
result = await agent.run("What did I just say?", conversation_id=cid)from fireflyframework_genai.reasoning import ReActPattern
react = ReActPattern(max_steps=5)
result = await react.execute(agent, "What is the weather in London?")
print(result.output)from pydantic import BaseModel
from fireflyframework_genai.validation import OutputReviewer
class Answer(BaseModel):
answer: str
confidence: float
reviewer = OutputReviewer(output_type=Answer, max_retries=2)
result = await reviewer.review(agent, "What is 2+2?")
print(result.output) # Answer(answer="4", confidence=0.99)from fireflyframework_genai.pipeline.builder import PipelineBuilder
from fireflyframework_genai.pipeline.steps import AgentStep, CallableStep
pipeline = (
PipelineBuilder("my-pipeline")
.add_node("classify", AgentStep(classifier_agent))
.add_node("extract", AgentStep(extractor_agent))
.add_node("validate", CallableStep(validate_fn))
.chain("classify", "extract", "validate")
.build()
)
result = await pipeline.run(inputs="Process this document")from fireflyframework_genai.exposure.rest import create_genai_app
app = create_genai_app(title="My GenAI Service")
# uvicorn myapp:app --reloadfrom fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer
consumer = KafkaAgentConsumer("assistant", topic="requests", bootstrap_servers="localhost:9092")
await consumer.start()from fireflyframework_genai.exposure.queues.kafka import KafkaAgentProducer
producer = KafkaAgentProducer(topic="results", bootstrap_servers="localhost:9092")
await producer.publish({"agent": "assistant", "output": "Done processing."})
await producer.close()firefly-genai works seamlessly in Jupyter notebooks and JupyterLab.
Since the framework is async-first, use await directly in notebook cells
(Jupyter provides a running event loop automatically).
# From your clone directory
cd fireflyframework-genai
source .venv/bin/activate # activate the venv created by the installer
pip install ipykernel # install Jupyter kernel support
python -m ipykernel install --user --name fireflygenai --display-name "Firefly GenAI"
jupyter lab # or: jupyter notebookThen select the Firefly GenAI kernel when creating a new notebook.
# Cell 1 β configure
import os
os.environ["OPENAI_API_KEY"] = "sk-..." # or set in .env
os.environ["FIREFLY_GENAI_DEFAULT_MODEL"] = "openai:gpt-4o"# Cell 2 β create an agent
from fireflyframework_genai.agents import FireflyAgent
agent = FireflyAgent(name="notebook-bot", model="openai:gpt-4o")
result = await agent.run("Explain quantum entanglement in two sentences.")
print(result.output)# Cell 3 β use memory for multi-turn conversations
from fireflyframework_genai.memory import MemoryManager
memory = MemoryManager(max_conversation_tokens=32_000)
agent_with_mem = FireflyAgent(name="chat", model="openai:gpt-4o", memory=memory)
cid = memory.new_conversation()
result = await agent_with_mem.run("My name is Alice.", conversation_id=cid)
print(result.output)
result = await agent_with_mem.run("What is my name?", conversation_id=cid)
print(result.output) # Alice# Cell 4 β reasoning patterns
from fireflyframework_genai.reasoning import ReActPattern
react = ReActPattern(max_steps=5)
result = await react.execute(agent, "What are the top 3 uses of Python in 2026?")
print(result.output)# Cell 5 β structured output with validation
from pydantic import BaseModel
from fireflyframework_genai.validation import OutputReviewer
class Summary(BaseModel):
title: str
bullet_points: list[str]
confidence: float
reviewer = OutputReviewer(output_type=Summary, max_retries=2)
result = await reviewer.review(agent, "Summarize the benefits of async Python.")
result.output # displays the structured Summary object in the notebookTip: You do not need
asyncio.run()ornest_asyncioin Jupyter βawaitworks at the top level of any cell because Jupyter runs its own event loop.
docs/tutorial.md is a 20-chapter, hands-on guide that teaches every concept from zero to expert through a real-world Intelligent Document Processing pipeline. Start here if you want to learn the framework thoroughly.
docs/use-case-idp.md is a focused walkthrough of building a 7-phase IDP pipeline that ingests, splits, classifies, extracts, validates, assembles, and explains data from corporate documents β using agents, reasoning, document splitting, content processing, validation, explainability, pipelines, and REST exposure.
Detailed guides for each module:
- Architecture β Design principles and layer diagram
- Agents β Lifecycle, registry, delegation, decorators
- Template Agents β Summarizer, classifier, extractor, conversational, router
- Tools β Protocol, builder, guards, composition, built-ins
- Prompts β Templates, versioning, composition, validation
- Reasoning Patterns β 6 patterns, structured outputs, custom patterns
- Content β Chunking, compression, batch processing
- Memory β Conversation history, working memory, storage backends
- Validation β Rules, QoS guards, output reviewer
- Pipeline β DAG orchestrator, parallel execution, retries
- Observability β Tracing, metrics, events
- Explainability β Decision recording, audit trails, reports
- Experiments β A/B testing, variant comparison
- Lab β Benchmarks, datasets, evaluators
- Exposure REST β FastAPI integration, SSE streaming
- Exposure Queues β Kafka, RabbitMQ, Redis integration
- Studio β Visual IDE, canvas, code generation, AI assistant, CLI
git clone https://github.com/fireflyframework/fireflyframework-genai.git
cd fireflyframework-genai
uv sync --all-extrasuv run pytest # Run 367+ tests
uv run ruff check src/ tests/ # Lint
uv run pyright src/ # Type checkDev dependencies (installed with uv sync):
pytest >=8.3.0,
pytest-asyncio >=0.24.0,
pytest-cov >=6.0.0,
ruff >=0.9.0,
pyright >=1.1.0,
httpx >=0.28.0.
See CONTRIBUTING.md for guidelines.
See CHANGELOG.md for notable changes.
Apache License 2.0. See LICENSE for the full text.