Buckets:
| import{s as Ut,n as ot,o as pt}from"../chunks/scheduler.2b22cead.js";import{S as Tt,i as ct,e as T,s as n,c as M,h as rt,a as c,d as e,b as a,f as it,g as i,j as r,k as yt,l as Jt,m as s,n as y,t as U,o,p}from"../chunks/index.1a0e8013.js";import{C as mt,H as J,E as wt}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.05940ba4.js";import{C as tl}from"../chunks/CodeBlock.da090c73.js";function jt(xl){let m,nl,el,al,w,Ml,j,il,C,ql="A financial question-answering environment for RL training. Evaluates LLMs on their ability to answer complex financial questions using tool calls on SEC 10-K filing data.",yl,d,Hl='Based on <a href="https://github.com/snorkel-ai/FinQABenchmark" rel="nofollow">FinQABenchmark</a> from Snorkel AI.',Ul,u,ol,b,Ll="FinQA tests an agent’s ability to:",pl,h,zl="<li>Explore available financial tables for a company</li> <li>Query table metadata and execute SQL queries</li> <li>Perform calculations on extracted data</li> <li>Submit final answers to financial questions</li>",Tl,I,Dl="<strong>Dataset</strong>: 290 questions from SEC 10-K filings across multiple companies (Alphabet, Amazon, Apple, AT&T, etc.)",cl,f,Ol="<strong>Reward</strong>: Binary (1.0 for correct answer, 0.0 for incorrect) using fuzzy numerical matching with 1% tolerance.",rl,A,Pl="<p><strong>Note</strong>: This dataset is for evaluation only. Do not train on it.</p>",Jl,v,ml,$,wl,B,jl,g,Cl,E,dl,k,ul,Q,Kl="The client uses the MCP protocol and is async by default:",bl,G,hl,F,Il,Z,lt="Tools are auto-discovered via MCP. Use <code>await env.list_tools()</code> to see all available tools at runtime.",fl,R,tt="<thead><tr><th>Tool</th> <th>Description</th> <th>Arguments</th></tr></thead> <tbody><tr><td><code>get_descriptions</code></td> <td>Get list of available table names for a company</td> <td><code>company_name: str</code></td></tr> <tr><td><code>get_table_info</code></td> <td>Get table metadata (columns, dtypes, unique values)</td> <td><code>company_name: str, table_name: str</code></td></tr> <tr><td><code>sql_query</code></td> <td>Execute SQL query on a table (requires filters)</td> <td><code>company_name: str, table_name: str, query: str</code></td></tr> <tr><td><code>submit_answer</code></td> <td>Submit final answer (ends episode)</td> <td><code>answer: str</code></td></tr></tbody>",Al,V,vl,N,et="<li><strong>sql_query</strong>: Must include filters (<code>WHERE</code>, <code>HAVING</code>, etc.). <code>SELECT *</code> is not allowed.</li>",$l,W,Bl,Y,st="<thead><tr><th>Variable</th> <th>Default</th> <th>Description</th></tr></thead> <tbody><tr><td><code>FINQA_DATA_PATH</code></td> <td><code>/app/env/data</code></td> <td>Path to data directory</td></tr> <tr><td><code>FINQA_MAX_STEPS</code></td> <td><code>50</code></td> <td>Maximum tool calls per episode</td></tr> <tr><td><code>FINQA_TASK</code></td> <td><code>finqa</code></td> <td>Task name</td></tr></tbody>",gl,_,El,S,nt="Rewards use fuzzy numerical matching:",kl,X,at="<li>Extracts numbers from <code>\\boxed{...}</code> format</li> <li>Handles percentages, fractions, and decimals</li> <li>1% relative tolerance or 0.01 absolute tolerance</li> <li>Returns <code>1.0</code> for correct, <code>0.0</code> for incorrect</li>",Ql,x,Gl,q,Fl,H,Zl,L,Rl,z,Vl,D,Nl,O,Wl,P,Yl,K,Mt='<li><a href="https://huggingface.co/datasets/snorkelai/agent-finance-reasoning" rel="nofollow">HuggingFace Dataset</a></li> <li><a href="https://leaderboard.snorkel.ai/category/snorkelfinance" rel="nofollow">Leaderboard</a></li>',_l,ll,Sl,sl,Xl;return w=new mt({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),j=new J({props:{title:"FinQA Environment",local:"finqa-environment",headingTag:"h1"}}),u=new J({props:{title:"Overview",local:"overview",headingTag:"h2"}}),v=new J({props:{title:"Quick Start",local:"quick-start",headingTag:"h2"}}),$=new J({props:{title:"Using Docker",local:"using-docker",headingTag:"h3"}}),B=new tl({props:{code:"JTIzJTIwQnVpbGQlMjB0aGUlMjBpbWFnZSUyMChmcm9tJTIwT3BlbkVudiUyMHJlcG8lMjByb290KSUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjBmaW5xYS1lbnYlM0FsYXRlc3QlMjAtZiUyMGVudnMlMkZmaW5xYV9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMFJ1biUyMHRoZSUyMHNlcnZlciUwQWRvY2tlciUyMHJ1biUyMC1wJTIwODAwMCUzQTgwMDAlMjBmaW5xYS1lbnYlM0FsYXRlc3QlMEElMEElMjMlMjBUbyUyMHJ1biUyMGV2YWx1YXRpb24lMjBzY3JpcHQlMjAoZXhhbXBsZSUyMG1vZGVsJTIwZ3B0LTUpJTBBQVBJX0JBU0VfVVJMJTNEaHR0cHMlM0ElMkYlMkZhcGkub3BlbmFpLmNvbSUyRnYxJTIwQVBJX0tFWSUzRCUyNE9QRU5BSV9BUElfS0VZJTIwTU9ERUwlM0RncHQtNSUyMHB5dGhvbiUyMGV4YW1wbGVzJTJGZmlucWFfaW5mZXJlbmNlLnB5",highlighted:`<span class="hljs-comment"># Build the image (from OpenEnv repo root)</span> | |
| docker build -t finqa-env:latest -f envs/finqa_env/server/Dockerfile . | |
| <span class="hljs-comment"># Run the server</span> | |
| docker run -p 8000:8000 finqa-env:latest | |
| <span class="hljs-comment"># To run evaluation script (example model gpt-5)</span> | |
| API_BASE_URL=https://api.openai.com/v1 API_KEY=<span class="hljs-variable">$OPENAI_API_KEY</span> MODEL=gpt-5 python examples/finqa_inference.py`,lang:"bash",wrap:!1}}),g=new J({props:{title:"Local Development",local:"local-development",headingTag:"h3"}}),E=new tl({props:{code:"JTIzJTIwSW5zdGFsbCUyMGRlcGVuZGVuY2llcyUwQXV2JTIwcGlwJTIwaW5zdGFsbCUyMHBhbmRhcyUwQSUwQSUyMyUyMERvd25sb2FkJTIwZGF0YSUyMGZyb20lMjBIdWdnaW5nRmFjZSUwQWNkJTIwZW52cyUyRmZpbnFhX2VudiUwQS4lMkZkb3dubG9hZF9kYXRhLnNo",highlighted:`<span class="hljs-comment"># Install dependencies</span> | |
| uv pip install pandas | |
| <span class="hljs-comment"># Download data from HuggingFace</span> | |
| <span class="hljs-built_in">cd</span> envs/finqa_env | |
| ./download_data.sh`,lang:"bash",wrap:!1}}),k=new J({props:{title:"Using the Client",local:"using-the-client",headingTag:"h3"}}),G=new tl({props:{code:"aW1wb3J0JTIwYXN5bmNpbyUwQWZyb20lMjBlbnZzLmZpbnFhX2VudiUyMGltcG9ydCUyMEZpblFBRW52JTJDJTIwQ2FsbFRvb2xBY3Rpb24lMEElMEFhc3luYyUyMGRlZiUyMG1haW4oKSUzQSUwQSUyMCUyMCUyMCUyMGFzeW5jJTIwd2l0aCUyMEZpblFBRW52KGJhc2VfdXJsJTNEJTIyaHR0cCUzQSUyRiUyRmxvY2FsaG9zdCUzQTgwMDAlMjIpJTIwYXMlMjBlbnYlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBSZXNldCUyMHRvJTIwZ2V0JTIwYSUyMHF1ZXN0aW9uJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb2JzJTIwJTNEJTIwYXdhaXQlMjBlbnYucmVzZXQoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHF1ZXN0aW9uJTIwJTNEJTIwb2JzLm1ldGFkYXRhJTVCJTIycXVlc3Rpb24lMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjb21wYW55JTIwJTNEJTIwb2JzLm1ldGFkYXRhJTVCJTIyY29tcGFueSUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50KGYlMjJRdWVzdGlvbiUzQSUyMCU3QnF1ZXN0aW9uJTdEJTIyKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50KGYlMjJDb21wYW55JTNBJTIwJTdCY29tcGFueSU3RCUyMiklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBEaXNjb3ZlciUyMGF2YWlsYWJsZSUyMHRvb2xzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdG9vbHMlMjAlM0QlMjBhd2FpdCUyMGVudi5saXN0X3Rvb2xzKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCglNUJ0Lm5hbWUlMjBmb3IlMjB0JTIwaW4lMjB0b29scyU1RCklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBVc2UlMjB0b29scyUyMHZpYSUyMGNhbGxfdG9vbCUyMChjb252ZW5pZW5jZSUyMG1ldGhvZCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXN1bHQlMjAlM0QlMjBhd2FpdCUyMGVudi5jYWxsX3Rvb2woJTIyZ2V0X2Rlc2NyaXB0aW9ucyUyMiUyQyUyMGNvbXBhbnlfbmFtZSUzRGNvbXBhbnkpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQoZiUyMkF2YWlsYWJsZSUyMHRhYmxlcyUzQSUyMCU3QnJlc3VsdCU3RCUyMiklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBPciUyMHVzZSUyMHN0ZXAoKSUyMHdpdGglMjBDYWxsVG9vbEFjdGlvbiUyMGZvciUyMGZ1bGwlMjBvYnNlcnZhdGlvbiUyMGFjY2VzcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN0ZXBfcmVzdWx0JTIwJTNEJTIwYXdhaXQlMjBlbnYuc3RlcChDYWxsVG9vbEFjdGlvbiglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB0b29sX25hbWUlM0QlMjJzcWxfcXVlcnklMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhcmd1bWVudHMlM0QlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJjb21wYW55X25hbWUlMjIlM0ElMjAlMjJhbHBoYWJldCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRhYmxlX25hbWUlMjIlM0ElMjAlMjJ1c19nYWFwX1NjaGVkdWxlT2ZJbmNvbWVCZWZvcmVJbmNvbWVUYXhEb21lc3RpY0FuZEZvcmVpZ25UYWJsZVRleHRCbG9jayUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnF1ZXJ5JTIyJTNBJTIwJTIyU0VMRUNUJTIwKiUyMEZST00lMjBkYXRhJTIwV0hFUkUlMjB5ZWFyJTIwJTNEJTIwJzIwMjInJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludChmJTIyRG9uZSUzQSUyMCU3QnN0ZXBfcmVzdWx0LmRvbmUlN0QlMkMlMjBSZXdhcmQlM0ElMjAlN0JzdGVwX3Jlc3VsdC5yZXdhcmQlN0QlMjIpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3VibWl0JTIwYW5zd2VyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwYXdhaXQlMjBlbnYuY2FsbF90b29sKCUyMnN1Ym1pdF9hbnN3ZXIlMjIlMkMlMjBhbnN3ZXIlM0QlMjI2LjExOCUyMiklMEElMEFhc3luY2lvLnJ1bihtYWluKCkp",highlighted:`<span class="hljs-keyword">import</span> asyncio | |
| <span class="hljs-keyword">from</span> envs.finqa_env <span class="hljs-keyword">import</span> FinQAEnv, CallToolAction | |
| <span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>(): | |
| <span class="hljs-keyword">async</span> <span class="hljs-keyword">with</span> FinQAEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) <span class="hljs-keyword">as</span> env: | |
| <span class="hljs-comment"># Reset to get a question</span> | |
| obs = <span class="hljs-keyword">await</span> env.reset() | |
| question = obs.metadata[<span class="hljs-string">"question"</span>] | |
| company = obs.metadata[<span class="hljs-string">"company"</span>] | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Question: <span class="hljs-subst">{question}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Company: <span class="hljs-subst">{company}</span>"</span>) | |
| <span class="hljs-comment"># Discover available tools</span> | |
| tools = <span class="hljs-keyword">await</span> env.list_tools() | |
| <span class="hljs-built_in">print</span>([t.name <span class="hljs-keyword">for</span> t <span class="hljs-keyword">in</span> tools]) | |
| <span class="hljs-comment"># Use tools via call_tool (convenience method)</span> | |
| result = <span class="hljs-keyword">await</span> env.call_tool(<span class="hljs-string">"get_descriptions"</span>, company_name=company) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Available tables: <span class="hljs-subst">{result}</span>"</span>) | |
| <span class="hljs-comment"># Or use step() with CallToolAction for full observation access</span> | |
| step_result = <span class="hljs-keyword">await</span> env.step(CallToolAction( | |
| tool_name=<span class="hljs-string">"sql_query"</span>, | |
| arguments={ | |
| <span class="hljs-string">"company_name"</span>: <span class="hljs-string">"alphabet"</span>, | |
| <span class="hljs-string">"table_name"</span>: <span class="hljs-string">"us_gaap_ScheduleOfIncomeBeforeIncomeTaxDomesticAndForeignTableTextBlock"</span>, | |
| <span class="hljs-string">"query"</span>: <span class="hljs-string">"SELECT * FROM data WHERE year = '2022'"</span> | |
| } | |
| )) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Done: <span class="hljs-subst">{step_result.done}</span>, Reward: <span class="hljs-subst">{step_result.reward}</span>"</span>) | |
| <span class="hljs-comment"># Submit answer</span> | |
| result = <span class="hljs-keyword">await</span> env.call_tool(<span class="hljs-string">"submit_answer"</span>, answer=<span class="hljs-string">"6.118"</span>) | |
| asyncio.run(main())`,lang:"python",wrap:!1}}),F=new J({props:{title:"Available Tools",local:"available-tools",headingTag:"h2"}}),V=new J({props:{title:"Tool Constraints",local:"tool-constraints",headingTag:"h3"}}),W=new J({props:{title:"Environment Variables",local:"environment-variables",headingTag:"h2"}}),_=new J({props:{title:"Reward Computation",local:"reward-computation",headingTag:"h2"}}),x=new J({props:{title:"Local Development",local:"local-development",headingTag:"h2"}}),q=new tl({props:{code:"JTIzJTIwRnJvbSUyME9wZW5FbnYlMjByZXBvJTIwcm9vdCUwQWNkJTIwZW52cyUyRmZpbnFhX2VudiUwQSUwQSUyMyUyMFJ1biUyMHNlcnZlciUyMGxvY2FsbHklMEFGSU5RQV9EQVRBX1BBVEglM0QuJTJGZGF0YSUyMHV2aWNvcm4lMjBzZXJ2ZXIuYXBwJTNBYXBwJTIwLS1yZWxvYWQlMjAtLXBvcnQlMjA4MDAwJTBBJTBBJTIzJTIwVGVzdCUyMHdpdGglMjBjdXJsJTBBY3VybCUyMGh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0E4MDAwJTJGaGVhbHRoJTBBY3VybCUyMC1YJTIwUE9TVCUyMGh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0E4MDAwJTJGcmVzZXQ=",highlighted:`<span class="hljs-comment"># From OpenEnv repo root</span> | |
| <span class="hljs-built_in">cd</span> envs/finqa_env | |
| <span class="hljs-comment"># Run server locally</span> | |
| FINQA_DATA_PATH=./data uvicorn server.app:app --reload --port 8000 | |
| <span class="hljs-comment"># Test with curl</span> | |
| curl http://localhost:8000/health | |
| curl -X POST http://localhost:8000/reset`,lang:"bash",wrap:!1}}),H=new J({props:{title:"Integration with RL Frameworks",local:"integration-with-rl-frameworks",headingTag:"h2"}}),L=new J({props:{title:"TRL (GRPO)",local:"trl-grpo",headingTag:"h3"}}),z=new tl({props:{code:"aW1wb3J0JTIwYXN5bmNpbyUwQWZyb20lMjB0cmwlMjBpbXBvcnQlMjBHUlBPVHJhaW5lciUwQWZyb20lMjBlbnZzLmZpbnFhX2VudiUyMGltcG9ydCUyMEZpblFBRW52JTBBJTBBYXN5bmMlMjBkZWYlMjByb2xsb3V0X2Z1bmMocHJvbXB0cyUyQyUyMHRyYWluZXIpJTNBJTBBJTIwJTIwJTIwJTIwYXN5bmMlMjB3aXRoJTIwRmluUUFFbnYoYmFzZV91cmwlM0QlMjJodHRwJTNBJTJGJTJGbG9jYWxob3N0JTNBODAwMCUyMiklMjBhcyUyMGVudiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9icyUyMCUzRCUyMGF3YWl0JTIwZW52LnJlc2V0KCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBZb3VyJTIwYWdlbnQlMjBsb2dpYyUyMGhlcmUlMjB1c2luZyUyMGF3YWl0JTIwZW52LmNhbGxfdG9vbCguLi4pJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwJTdCJTIycmV3YXJkJTIyJTNBJTIwb2JzLnJld2FyZCUyQyUyMCUyMmNvbXBsZXRpb24lMjIlM0ElMjBjb21wbGV0aW9uJTdEJTBBJTBBdHJhaW5lciUyMCUzRCUyMEdSUE9UcmFpbmVyKCUwQSUyMCUyMCUyMCUyMG1vZGVsJTNEbW9kZWwlMkMlMEElMjAlMjAlMjAlMjByb2xsb3V0X2Z1bmMlM0Ryb2xsb3V0X2Z1bmMlMkMlMEElMjAlMjAlMjAlMjAuLi4lMEEp",highlighted:`<span class="hljs-keyword">import</span> asyncio | |
| <span class="hljs-keyword">from</span> trl <span class="hljs-keyword">import</span> GRPOTrainer | |
| <span class="hljs-keyword">from</span> envs.finqa_env <span class="hljs-keyword">import</span> FinQAEnv | |
| <span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">rollout_func</span>(<span class="hljs-params">prompts, trainer</span>): | |
| <span class="hljs-keyword">async</span> <span class="hljs-keyword">with</span> FinQAEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) <span class="hljs-keyword">as</span> env: | |
| obs = <span class="hljs-keyword">await</span> env.reset() | |
| <span class="hljs-comment"># Your agent logic here using await env.call_tool(...)</span> | |
| <span class="hljs-keyword">return</span> {<span class="hljs-string">"reward"</span>: obs.reward, <span class="hljs-string">"completion"</span>: completion} | |
| trainer = GRPOTrainer( | |
| model=model, | |
| rollout_func=rollout_func, | |
| ... | |
| )`,lang:"python",wrap:!1}}),D=new J({props:{title:"Project Structure",local:"project-structure",headingTag:"h2"}}),O=new tl({props:{code:"ZmlucWFfZW52JTJGJTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwX19pbml0X18ucHklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBFeHBvcnRzJTIwRmluUUFFbnYlMkMlMjBDYWxsVG9vbEFjdGlvbiUyQyUyMExpc3RUb29sc0FjdGlvbiUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMG1vZGVscy5weSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEZpblFBU3RhdGUlMjBhbmQlMjB0b29sJTIwbmFtZSUyMGNvbnN0YW50cyUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMGNsaWVudC5weSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME1DUCUyMGNsaWVudCUyMChzdWJjbGFzc2VzJTIwTUNQVG9vbENsaWVudCklMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBweXByb2plY3QudG9tbCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMERlcGVuZGVuY2llcyUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMFJFQURNRS5tZCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFRoaXMlMjBmaWxlJTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwZGF0YSUyRiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEJlbmNobWFyayUyMGRhdGElMjAocnVuJTIwZG93bmxvYWRfZGF0YS5zaCklMEElRTIlOTQlODIlMjAlMjAlMjAlRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBiZW5jaG1hcmtfcXVlc3Rpb25zJTJGJTBBJUUyJTk0JTgyJTIwJTIwJTIwJUUyJTk0JTgyJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJTIwZmlucWEuY3N2JTBBJUUyJTk0JTgyJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJTIwaW5wdXRfY29tcGFuaWVzJTJGJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJTIwJTVCY29tcGFueSUyMGZvbGRlcnMlNUQlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBkb3dubG9hZF9kYXRhLnNoJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwRG93bmxvYWRzJTIwZGF0YSUyMGZyb20lMjBIdWdnaW5nRmFjZSUwQSVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCUyMHNlcnZlciUyRiUwQSUyMCUyMCUyMCUyMCVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMF9faW5pdF9fLnB5JTBBJTIwJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwZmlucWFfZW52aXJvbm1lbnQucHklMjAlMjAlMjMlMjBNQ1BFbnZpcm9ubWVudCUyMHN1YmNsYXNzJTIwd2l0aCUyMCU0MG1jcC50b29sJTIwZGVjb3JhdG9ycyUwQSUyMCUyMCUyMCUyMCVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMHRvb2xzLnB5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwVG9vbCUyMGltcGxlbWVudGF0aW9ucyUwQSUyMCUyMCUyMCUyMCVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMHJld2FyZHMucHklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBSZXdhcmQlMjBjb21wdXRhdGlvbiUwQSUyMCUyMCUyMCUyMCVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMGFwcC5weSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEZhc3RBUEklMjBzZXJ2ZXIlMEElMjAlMjAlMjAlMjAlRTIlOTQlOTQlRTIlOTQlODAlRTIlOTQlODAlMjBEb2NrZXJmaWxl",highlighted:`finqa_env/ | |
| ├── __init__.py <span class="hljs-comment"># Exports FinQAEnv, CallToolAction, ListToolsAction</span> | |
| ├── models.py <span class="hljs-comment"># FinQAState and tool name constants</span> | |
| ├── client.py <span class="hljs-comment"># MCP client (subclasses MCPToolClient)</span> | |
| ├── pyproject.toml <span class="hljs-comment"># Dependencies</span> | |
| ├── README.md <span class="hljs-comment"># This file</span> | |
| ├── data/ <span class="hljs-comment"># Benchmark data (run download_data.sh)</span> | |
| │ ├── benchmark_questions/ | |
| │ │ └── finqa.csv | |
| │ └── input_companies/ | |
| │ └── [company folders] | |
| ├── download_data.sh <span class="hljs-comment"># Downloads data from HuggingFace</span> | |
| └── server/ | |
| ├── __init__.py | |
| ├── finqa_environment.py <span class="hljs-comment"># MCPEnvironment subclass with @mcp.tool decorators</span> | |
| ├── tools.py <span class="hljs-comment"># Tool implementations</span> | |
| ├── rewards.py <span class="hljs-comment"># Reward computation</span> | |
| ├── app.py <span class="hljs-comment"># FastAPI server</span> | |
| └── Dockerfile`,lang:"",wrap:!1}}),P=new J({props:{title:"References",local:"references",headingTag:"h2"}}),ll=new wt({props:{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/finqa.md"}}),{c(){m=T("meta"),nl=n(),el=T("p"),al=n(),M(w.$$.fragment),Ml=n(),M(j.$$.fragment),il=n(),C=T("p"),C.textContent=ql,yl=n(),d=T("p"),d.innerHTML=Hl,Ul=n(),M(u.$$.fragment),ol=n(),b=T("p"),b.textContent=Ll,pl=n(),h=T("ul"),h.innerHTML=zl,Tl=n(),I=T("p"),I.innerHTML=Dl,cl=n(),f=T("p"),f.innerHTML=Ol,rl=n(),A=T("blockquote"),A.innerHTML=Pl,Jl=n(),M(v.$$.fragment),ml=n(),M($.$$.fragment),wl=n(),M(B.$$.fragment),jl=n(),M(g.$$.fragment),Cl=n(),M(E.$$.fragment),dl=n(),M(k.$$.fragment),ul=n(),Q=T("p"),Q.textContent=Kl,bl=n(),M(G.$$.fragment),hl=n(),M(F.$$.fragment),Il=n(),Z=T("p"),Z.innerHTML=lt,fl=n(),R=T("table"),R.innerHTML=tt,Al=n(),M(V.$$.fragment),vl=n(),N=T("ul"),N.innerHTML=et,$l=n(),M(W.$$.fragment),Bl=n(),Y=T("table"),Y.innerHTML=st,gl=n(),M(_.$$.fragment),El=n(),S=T("p"),S.textContent=nt,kl=n(),X=T("ul"),X.innerHTML=at,Ql=n(),M(x.$$.fragment),Gl=n(),M(q.$$.fragment),Fl=n(),M(H.$$.fragment),Zl=n(),M(L.$$.fragment),Rl=n(),M(z.$$.fragment),Vl=n(),M(D.$$.fragment),Nl=n(),M(O.$$.fragment),Wl=n(),M(P.$$.fragment),Yl=n(),K=T("ul"),K.innerHTML=Mt,_l=n(),M(ll.$$.fragment),Sl=n(),sl=T("p"),this.h()},l(l){const t=rt("svelte-u9bgzb",document.head);m=c(t,"META",{name:!0,content:!0}),t.forEach(e),nl=a(l),el=c(l,"P",{}),it(el).forEach(e),al=a(l),i(w.$$.fragment,l),Ml=a(l),i(j.$$.fragment,l),il=a(l),C=c(l,"P",{"data-svelte-h":!0}),r(C)!=="svelte-o6o2bw"&&(C.textContent=ql),yl=a(l),d=c(l,"P",{"data-svelte-h":!0}),r(d)!=="svelte-pd3wdn"&&(d.innerHTML=Hl),Ul=a(l),i(u.$$.fragment,l),ol=a(l),b=c(l,"P",{"data-svelte-h":!0}),r(b)!=="svelte-vchdgl"&&(b.textContent=Ll),pl=a(l),h=c(l,"UL",{"data-svelte-h":!0}),r(h)!=="svelte-ugog92"&&(h.innerHTML=zl),Tl=a(l),I=c(l,"P",{"data-svelte-h":!0}),r(I)!=="svelte-s60cvc"&&(I.innerHTML=Dl),cl=a(l),f=c(l,"P",{"data-svelte-h":!0}),r(f)!=="svelte-fwv5je"&&(f.innerHTML=Ol),rl=a(l),A=c(l,"BLOCKQUOTE",{"data-svelte-h":!0}),r(A)!=="svelte-1kcri8l"&&(A.innerHTML=Pl),Jl=a(l),i(v.$$.fragment,l),ml=a(l),i($.$$.fragment,l),wl=a(l),i(B.$$.fragment,l),jl=a(l),i(g.$$.fragment,l),Cl=a(l),i(E.$$.fragment,l),dl=a(l),i(k.$$.fragment,l),ul=a(l),Q=c(l,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-t746v4"&&(Q.textContent=Kl),bl=a(l),i(G.$$.fragment,l),hl=a(l),i(F.$$.fragment,l),Il=a(l),Z=c(l,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-e4uwen"&&(Z.innerHTML=lt),fl=a(l),R=c(l,"TABLE",{"data-svelte-h":!0}),r(R)!=="svelte-17mdyft"&&(R.innerHTML=tt),Al=a(l),i(V.$$.fragment,l),vl=a(l),N=c(l,"UL",{"data-svelte-h":!0}),r(N)!=="svelte-1qr3xaa"&&(N.innerHTML=et),$l=a(l),i(W.$$.fragment,l),Bl=a(l),Y=c(l,"TABLE",{"data-svelte-h":!0}),r(Y)!=="svelte-1e0z4c7"&&(Y.innerHTML=st),gl=a(l),i(_.$$.fragment,l),El=a(l),S=c(l,"P",{"data-svelte-h":!0}),r(S)!=="svelte-llcbw2"&&(S.textContent=nt),kl=a(l),X=c(l,"UL",{"data-svelte-h":!0}),r(X)!=="svelte-1lqq9l2"&&(X.innerHTML=at),Ql=a(l),i(x.$$.fragment,l),Gl=a(l),i(q.$$.fragment,l),Fl=a(l),i(H.$$.fragment,l),Zl=a(l),i(L.$$.fragment,l),Rl=a(l),i(z.$$.fragment,l),Vl=a(l),i(D.$$.fragment,l),Nl=a(l),i(O.$$.fragment,l),Wl=a(l),i(P.$$.fragment,l),Yl=a(l),K=c(l,"UL",{"data-svelte-h":!0}),r(K)!=="svelte-cdqezx"&&(K.innerHTML=Mt),_l=a(l),i(ll.$$.fragment,l),Sl=a(l),sl=c(l,"P",{}),it(sl).forEach(e),this.h()},h(){yt(m,"name","hf:doc:metadata"),yt(m,"content",Ct)},m(l,t){Jt(document.head,m),s(l,nl,t),s(l,el,t),s(l,al,t),y(w,l,t),s(l,Ml,t),y(j,l,t),s(l,il,t),s(l,C,t),s(l,yl,t),s(l,d,t),s(l,Ul,t),y(u,l,t),s(l,ol,t),s(l,b,t),s(l,pl,t),s(l,h,t),s(l,Tl,t),s(l,I,t),s(l,cl,t),s(l,f,t),s(l,rl,t),s(l,A,t),s(l,Jl,t),y(v,l,t),s(l,ml,t),y($,l,t),s(l,wl,t),y(B,l,t),s(l,jl,t),y(g,l,t),s(l,Cl,t),y(E,l,t),s(l,dl,t),y(k,l,t),s(l,ul,t),s(l,Q,t),s(l,bl,t),y(G,l,t),s(l,hl,t),y(F,l,t),s(l,Il,t),s(l,Z,t),s(l,fl,t),s(l,R,t),s(l,Al,t),y(V,l,t),s(l,vl,t),s(l,N,t),s(l,$l,t),y(W,l,t),s(l,Bl,t),s(l,Y,t),s(l,gl,t),y(_,l,t),s(l,El,t),s(l,S,t),s(l,kl,t),s(l,X,t),s(l,Ql,t),y(x,l,t),s(l,Gl,t),y(q,l,t),s(l,Fl,t),y(H,l,t),s(l,Zl,t),y(L,l,t),s(l,Rl,t),y(z,l,t),s(l,Vl,t),y(D,l,t),s(l,Nl,t),y(O,l,t),s(l,Wl,t),y(P,l,t),s(l,Yl,t),s(l,K,t),s(l,_l,t),y(ll,l,t),s(l,Sl,t),s(l,sl,t),Xl=!0},p:ot,i(l){Xl||(U(w.$$.fragment,l),U(j.$$.fragment,l),U(u.$$.fragment,l),U(v.$$.fragment,l),U($.$$.fragment,l),U(B.$$.fragment,l),U(g.$$.fragment,l),U(E.$$.fragment,l),U(k.$$.fragment,l),U(G.$$.fragment,l),U(F.$$.fragment,l),U(V.$$.fragment,l),U(W.$$.fragment,l),U(_.$$.fragment,l),U(x.$$.fragment,l),U(q.$$.fragment,l),U(H.$$.fragment,l),U(L.$$.fragment,l),U(z.$$.fragment,l),U(D.$$.fragment,l),U(O.$$.fragment,l),U(P.$$.fragment,l),U(ll.$$.fragment,l),Xl=!0)},o(l){o(w.$$.fragment,l),o(j.$$.fragment,l),o(u.$$.fragment,l),o(v.$$.fragment,l),o($.$$.fragment,l),o(B.$$.fragment,l),o(g.$$.fragment,l),o(E.$$.fragment,l),o(k.$$.fragment,l),o(G.$$.fragment,l),o(F.$$.fragment,l),o(V.$$.fragment,l),o(W.$$.fragment,l),o(_.$$.fragment,l),o(x.$$.fragment,l),o(q.$$.fragment,l),o(H.$$.fragment,l),o(L.$$.fragment,l),o(z.$$.fragment,l),o(D.$$.fragment,l),o(O.$$.fragment,l),o(P.$$.fragment,l),o(ll.$$.fragment,l),Xl=!1},d(l){l&&(e(nl),e(el),e(al),e(Ml),e(il),e(C),e(yl),e(d),e(Ul),e(ol),e(b),e(pl),e(h),e(Tl),e(I),e(cl),e(f),e(rl),e(A),e(Jl),e(ml),e(wl),e(jl),e(Cl),e(dl),e(ul),e(Q),e(bl),e(hl),e(Il),e(Z),e(fl),e(R),e(Al),e(vl),e(N),e($l),e(Bl),e(Y),e(gl),e(El),e(S),e(kl),e(X),e(Ql),e(Gl),e(Fl),e(Zl),e(Rl),e(Vl),e(Nl),e(Wl),e(Yl),e(K),e(_l),e(Sl),e(sl)),e(m),p(w,l),p(j,l),p(u,l),p(v,l),p($,l),p(B,l),p(g,l),p(E,l),p(k,l),p(G,l),p(F,l),p(V,l),p(W,l),p(_,l),p(x,l),p(q,l),p(H,l),p(L,l),p(z,l),p(D,l),p(O,l),p(P,l),p(ll,l)}}}const Ct='{"title":"FinQA Environment","local":"finqa-environment","sections":[{"title":"Overview","local":"overview","sections":[],"depth":2},{"title":"Quick Start","local":"quick-start","sections":[{"title":"Using Docker","local":"using-docker","sections":[],"depth":3},{"title":"Local Development","local":"local-development","sections":[],"depth":3},{"title":"Using the Client","local":"using-the-client","sections":[],"depth":3}],"depth":2},{"title":"Available Tools","local":"available-tools","sections":[{"title":"Tool Constraints","local":"tool-constraints","sections":[],"depth":3}],"depth":2},{"title":"Environment Variables","local":"environment-variables","sections":[],"depth":2},{"title":"Reward Computation","local":"reward-computation","sections":[],"depth":2},{"title":"Local Development","local":"local-development","sections":[],"depth":2},{"title":"Integration with RL Frameworks","local":"integration-with-rl-frameworks","sections":[{"title":"TRL (GRPO)","local":"trl-grpo","sections":[],"depth":3}],"depth":2},{"title":"Project Structure","local":"project-structure","sections":[],"depth":2},{"title":"References","local":"references","sections":[],"depth":2}],"depth":1}';function dt(xl){return pt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class ft extends Tt{constructor(m){super(),ct(this,m,dt,jt,Ut,{})}}export{ft as component}; | |
Xet Storage Details
- Size:
- 26.1 kB
- Xet hash:
- 4dd72f0216ea8f29b1e1197a34d613033b36916fb99b5717b3816826edfd367a
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.