Inspiration
Every bank has the same bottleneck: someone in Strategy needs a loan portfolio breakdown, someone in Digital Innovation wants transaction volumes by channel, someone in Operations needs branch performance metrics — and they all file a ticket to the same overloaded ICT Reporting team. Days pass. Decisions wait.
We looked at this and asked: what if the reports came to you? Not through a BI tool locked behind one team, but through AI agents that hook into your existing data streams — Kafka topics, ClickHouse tables, real-time feeds — and generate reports the moment conditions demand it. No manual triggers. No ticket queue. Agents that don't wait for instructions, but listen to the data and act.
That's IRIS.
What it does
IRIS lets any team member ask a question in plain language — "Show me the loan portfolio by branch with NPL ratios for last quarter" — and get a full professional report with:
- Structured data pulled from ClickHouse Cloud (3,360+ rows of real banking data across loans, deposits, transactions, customers, and branches)
- SVG charts (bar, line, pie) rendered through a dedicated chart sub-pipeline with automated testing and visual verification
- Compliance checks against data governance rules (PII detection, accuracy validation, data quality)
- Human-in-the-loop review — a reviewer must Approve, Request Revision, or Reject before publication
- Full traceability — every report is tracked in ClickHouse and indexed as a knowledge graph in Neo4j (entities, relationships, state transitions)
- Searchable history — find past reports through Neo4j graph queries, ClickHouse SQL, or Graphiti semantic search
The entire flow is event-driven: queries flow through Kafka (Redpanda Cloud), data lives in ClickHouse Cloud, the entity graph lives in Neo4j Aura, and the LLM agents run on z.ai.
How we built it
IRIS is built on Tachikoma, a distributed stream processing framework with composable Hive pipelines and Workflow of Thought (WoT) orchestration.
The pipeline is declared using the Hive WoT fluent builder — 6 agents chained with data edges, a HITL cast point, and a feedback loop:
pipeline.from_input()
.to_agent(query_interpreter) # NL → structured query
.will({"parsed_query": "parsed_query"})
.to_agent(data_fetcher) # ClickHouse Cloud
.will({"data_result": "data_result"})
.to_agent(report_generator) # LLM (z.ai glm-4.5-air)
.will({"report_content": "report_content"})
.to_agent(chart_renderer) # WoT sub-pipeline
.cast("human_review", timeout=300) # HITL pause
.to_agent(publisher) # ClickHouse + Neo4j tracking
.feedback({"revision_notes": "report_content"}, max_iterations=3)
.to_output()
## Where we use Qwen :
Summary: Qwen Everywhere
Layer Qwen Model What it does
Chat qwen3.6-plus Conversational agent, intent routing
Pipeline (7 steps) qwen3.6-plus Tool calling on StatefulRecord
Report generation qwen3.6-plus Structured report with sections + charts
Chart elaboration qwen3.6-plus Plans SVG chart implementation
Compliance review qwen3.6-plus Auto-approve/revise decision
Semantic filing text-embedding-v3 Report → folder matching (cosine similarity)
Graphiti indexing qwen3.6-plus Entity/fact extraction from reports
Graphiti search text-embedding-v3 Query embedding for semantic search
Structured output qwen3.6-plus JSON schema compliance (retry pattern)
## What we learned
## What's next for IRIS — Intelligent Reporting & Insight System
## Where we use Qwen :
Summary: Qwen Everywhere
Layer Qwen Model What it does
Chat qwen3.6-plus Conversational agent, intent routing
Pipeline (7 steps) qwen3.6-plus Tool calling on StatefulRecord
Report generation qwen3.6-plus Structured report with sections + charts
Chart elaboration qwen3.6-plus Plans SVG chart implementation
Compliance review qwen3.6-plus Auto-approve/revise decision
Semantic filing text-embedding-v3 Report → folder matching (cosine similarity)
Graphiti indexing qwen3.6-plus Entity/fact extraction from reports
Graphiti search text-embedding-v3 Query embedding for semantic search
Structured output qwen3.6-plus JSON schema compliance (retry pattern)
