Back to blog
tutoriallangchainai-agents

Give Your LangChain Agent Japanese Financial Data in 5 Minutes

Onkar Dahale

LangChain agents can search Wikipedia, browse the web, run Python. Ask one about Toyota's revenue trend and it either hallucinates a number or says "I don't have access to financial databases."

That's because no LangChain toolkit covers Japanese financial data. The existing financial toolkits focus on US equities. None of them know what a 有価証券報告書 is.

We built langchain-axiora to fix that. 18 tools, a retriever, 4,125 Japanese companies, 10 years of XBRL-parsed EDINET filings. Your agent gets the same data a Japanese equity analyst uses — revenue, net income, ROE, health scores, peer comparisons, and English translations of filing sections.

Install and first agent in under 5 minutes.

LangChain + Axiora: 18 tools, 4,125 companies

Install

uv add langchain-axiora langchain-anthropic langgraph

Set your keys:

export AXIORA_API_KEY="ax_live_..."
export ANTHROPIC_API_KEY="sk-ant-..."

Your First Agent: 6 Lines

from langchain_axiora import AxioraToolkit
from langchain_anthropic import ChatAnthropic
from langgraph.prebuilt import create_react_agent

toolkit = AxioraToolkit()
agent = create_react_agent(ChatAnthropic(model="claude-sonnet-4-20250514"), toolkit.get_tools())

result = agent.invoke({"messages": [{"role": "user", "content": "Compare Toyota and Honda's financials over the last 3 years"}]})

That's it. The agent searches for the companies, fetches financials, and compares them — chaining tool calls automatically.

What the Agent Actually Does

Here's what happens under the hood when you ask "Compare Toyota and Honda's financials over the last 3 years." The agent makes three tool calls:

1. axiora_get_financials → Toyota (7203)

{
  "fiscal_year": 2025,
  "revenue": 48036704000000,
  "net_income": 4789755000000,
  "operating_margin": 9.98,
  "roe": 12.99,
  "num_employees": 383853
}

2. axiora_get_financials → Honda (7267)

{
  "fiscal_year": 2025,
  "revenue": 21688767000000,
  "net_income": 903034000000,
  "operating_margin": 5.59,
  "roe": 7.15,
  "num_employees": 194173
}

3. The agent synthesizes

Toyota's revenue (¥48.0T) is 2.2× Honda's (¥21.7T). The gap widened — Toyota grew revenue 29% from FY2023 to FY2025, Honda grew 28%. But the margin story is sharper: Toyota's operating margin is 9.98% vs Honda's 5.59%, and Toyota's ROE of 12.99% nearly doubles Honda's 7.15%.

Real numbers. From audited EDINET filings. Not hallucinated.

18 Tools

Every tool the agent can call:

ToolWhat it does
axiora_search_companiesFind companies by name (JP/EN) or code
axiora_get_companyCompany details — sector, listing, fiscal year end
axiora_get_financialsRevenue, income, assets, equity, ratios per year
axiora_get_growthYoY growth rates and 3/5-year CAGRs
axiora_get_rankingRank companies by any metric
axiora_get_sector_overviewSector stats and company counts
axiora_compare_companiesSide-by-side financials for 2–5 companies
axiora_screen_companiesFilter by sector, revenue, ROE, PE ratio
axiora_get_health_scoreFinancial health score (0–100) with breakdown
axiora_get_health_rankingRank by health score
axiora_get_peersFind similar companies by sector and revenue
axiora_get_timeseriesChart-ready time series for any metric
axiora_list_filingsBrowse filings by company or type
axiora_get_translationsEnglish translations of filing sections
axiora_search_translationsFull-text search across translated filings
axiora_get_filing_calendarFiling volume by day
axiora_search_companies_batchBulk lookup (up to 10 at once)
axiora_get_coverageData coverage stats

18 tools — because Japanese financial analysis isn't just balance sheets. It's fiscal years ending in March, three accounting standards (J-GAAP, IFRS, US-GAAP), and filings in Japanese that your LLM can't read without translations.

Use Only the Tools You Need

18 tools can be noisy for a simple agent. Pass selected_tools to keep it focused:

toolkit = AxioraToolkit(
    selected_tools=[
        "axiora_search_companies",
        "axiora_get_financials",
        "axiora_compare_companies",
    ],
)

Three tools. The agent still answers "Compare Toyota and Honda" — it just can't screen or rank. Pass a name that doesn't exist and you get a ValueError with the valid list — no silent failures.

Real Use Case: Find Undervalued Japanese Companies

Here's a prompt that chains multiple tools:

result = agent.invoke({"messages": [{"role": "user", "content": """
Find Japanese companies with ROE above 15%.
For the top 3, get their health scores and compare their financials.
"""}]})

The agent:

  1. Calls axiora_screen_companies with min_roe=15 — finds Tokio Marine (ROE 20.65%), Fast Retailing (19.73%), Recruit Holdings (25.08%)
  2. Calls axiora_get_health_score for each
  3. Calls axiora_compare_companies to put them side by side
  4. Synthesizes: which one has the best combination of profitability and financial health

Four tool calls, chained automatically. You wrote zero screening logic.

Retriever: RAG Over Japanese Filings

Not every use case needs an agent. If you're building RAG over Japanese filings, AxioraRetriever searches English translations and returns LangChain Document objects:

from langchain_axiora import AxioraRetriever

retriever = AxioraRetriever(section="risk_factors", k=5)
docs = retriever.invoke("semiconductor supply chain risk")

Each document has page_content (the translated text) and metadata (company name, doc ID, section). Plug it into any chain:

from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

llm = ChatAnthropic(model="claude-sonnet-4-20250514")
prompt = ChatPromptTemplate.from_template(
    "Based on these Japanese filing excerpts:\n{context}\n\nAnswer: {question}"
)
chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm

result = chain.invoke("What semiconductor risks do Japanese manufacturers report?")

Five companies' risk factors, retrieved and synthesized. No XBRL, no Japanese language skills required.

Use Individual Tools Without the Toolkit

If you don't need an agent or a retriever, use tools directly:

from langchain_axiora import GetFinancialsTool

tool = GetFinancialsTool()  # reads AXIORA_API_KEY from env
result = tool.invoke({"code": "7203", "years": 3})

Every tool accepts api_key= directly or reads AXIORA_API_KEY from the environment. No wrapper object needed.

Error Handling

All tools set handle_tool_error=True. When the API returns an error, the agent gets a helpful message instead of crashing:

Axiora API error 404. Company not found. Use axiora_search_companies to find the correct code.

The agent reads this, calls axiora_search_companies, gets the right code, and retries. Self-correcting, not crashing. Most LangChain financial toolkits let the agent crash on a bad code — we return a message the LLM can act on.

What's Under the Data

Every number comes from audited EDINET filings (有価証券報告書) — the same source Bloomberg and Refinitiv use for Japanese companies. We parse the XBRL, normalize across three accounting standards, and serve it as typed JSON.

4,125 listed companies. Up to 10 years of history. Updated within 30 minutes of filing.

Get Started

uv add langchain-axiora