<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jingyi</title>
    <description>The latest articles on DEV Community by Jingyi (@jingyi_li).</description>
    <link>https://dev.to/jingyi_li</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3941405%2F03b814ec-c548-495f-b8a4-3eb34fefcdb7.jpg</url>
      <title>DEV Community: Jingyi</title>
      <link>https://dev.to/jingyi_li</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jingyi_li"/>
    <language>en</language>
    <item>
      <title>While Learning LangChain, I Ended Up With This Realtime Voice Pattern</title>
      <dc:creator>Jingyi</dc:creator>
      <pubDate>Fri, 26 Jun 2026 11:46:09 +0000</pubDate>
      <link>https://dev.to/jingyi_li/while-learning-langchain-i-ended-up-with-this-realtime-voice-pattern-40pe</link>
      <guid>https://dev.to/jingyi_li/while-learning-langchain-i-ended-up-with-this-realtime-voice-pattern-40pe</guid>
      <description>&lt;p&gt;I've recently started learning LangChain while exploring different ways to build voice agents.&lt;/p&gt;

&lt;p&gt;As someone who's still new to LangChain, I tried a few different approaches before landing on one that felt surprisingly clean.&lt;/p&gt;

&lt;p&gt;I don't know whether this is already a common pattern in the LangChain ecosystem, but it worked well enough that I thought it was worth sharing. Hopefully it can also spark some discussion with people who've been building voice agents for longer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;The basic idea is to separate responsibilities instead of letting one framework handle everything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcttb700vsbtafudja441.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcttb700vsbtafudja441.png" alt=" pattern" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LangChain stays responsible for tool selection, tool execution, and response composition.&lt;/li&gt;
&lt;li&gt;A separate realtime runtime handles RTC / RTM, speech input/output, and session lifecycle.&lt;/li&gt;
&lt;li&gt;The two communicate through an OpenAI-compatible endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;When I first started experimenting, I assumed adding realtime voice would require restructuring most of the application.&lt;/p&gt;

&lt;p&gt;Instead, it felt more like adding another interaction layer.&lt;/p&gt;

&lt;p&gt;LangChain continues doing what it already does well—tool orchestration and workflow management—while the realtime runtime focuses on voice-specific concerns.&lt;/p&gt;

&lt;p&gt;That separation made the overall architecture feel much simpler.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern
&lt;/h2&gt;

&lt;p&gt;To better understand the idea, I put together a small recipe that demonstrates this integration pattern.&lt;/p&gt;

&lt;p&gt;The recipe consists of three pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python exposes an OpenAI-compatible endpoint and manages the agent lifecycle.&lt;/li&gt;
&lt;li&gt;Next.js handles the client-side realtime interaction.&lt;/li&gt;
&lt;li&gt;LangChain remains server-side as the orchestration and tool layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not intended to be a complete application or a production-ready project.&lt;/p&gt;

&lt;p&gt;It's simply a pattern that helped me understand how these pieces can fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick note
&lt;/h2&gt;

&lt;p&gt;For transparency, I work at Agora, so I naturally used Agora as the realtime runtime while putting this recipe together.&lt;/p&gt;

&lt;p&gt;That said, I'm much more interested in learning how other people are building voice agents with LangChain.&lt;/p&gt;

&lt;p&gt;If you're using a different stack or have taken a completely different approach, I'd love to hear about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The recipe
&lt;/h2&gt;

&lt;p&gt;If you're curious, here's the recipe:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bluemotional/recipe-agent-langchain" rel="noopener noreferrer"&gt;https://github.com/bluemotional/recipe-agent-langchain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since I'm still learning LangChain myself, I'd really appreciate any feedback or suggestions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;If people find this pattern useful, I'd like to keep expanding it with more recipes, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG&lt;/li&gt;
&lt;li&gt;Internal tools&lt;/li&gt;
&lt;li&gt;Docs Copilot&lt;/li&gt;
&lt;li&gt;MCP integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm also curious to see what other patterns the community has found useful.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>voiceagent</category>
      <category>abotwrotethis</category>
    </item>
    <item>
      <title>Project Spotlight: An Open-Source AI Sports Commentator That Watches the Match Live</title>
      <dc:creator>Jingyi</dc:creator>
      <pubDate>Fri, 26 Jun 2026 01:35:29 +0000</pubDate>
      <link>https://dev.to/jingyi_li/project-spotlight-an-open-source-ai-sports-commentator-that-watches-the-match-live-4pch</link>
      <guid>https://dev.to/jingyi_li/project-spotlight-an-open-source-ai-sports-commentator-that-watches-the-match-live-4pch</guid>
      <description>&lt;p&gt;I recently came across an open-source project called &lt;strong&gt;WorldCupVoice&lt;/strong&gt; and thought it was worth sharing.&lt;/p&gt;

&lt;p&gt;Quick note first: I’m not the creator.&lt;br&gt;&lt;br&gt;
The project is by &lt;strong&gt;zicojiao&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The demo makes the idea click immediately: this is not a post-game recap system. It watches a live match feed and speaks over the action in real time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fendcr9zcnzdfsf62tcus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fendcr9zcnzdfsf62tcus.png" alt="WorldCupVoice" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Project links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/zicojiao/worldcupvoice" rel="noopener noreferrer"&gt;https://github.com/zicojiao/worldcupvoice&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reddit: &lt;a href="https://www.reddit.com/r/OpenAI/comments/1udx8it/i_tried_making_an_ai_world_cup_commentator_it/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/OpenAI/comments/1udx8it/i_tried_making_an_ai_world_cup_commentator_it/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What makes this project interesting is that it is not a “generate a match summary later” system.&lt;/p&gt;

&lt;p&gt;It is a live pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a match feed comes in through RTMP&lt;/li&gt;
&lt;li&gt;Agora converts it into a real-time RTC stream&lt;/li&gt;
&lt;li&gt;the backend samples frames from the live video&lt;/li&gt;
&lt;li&gt;OpenAI generates grounded play-by-play commentary&lt;/li&gt;
&lt;li&gt;TTS turns that into speech&lt;/li&gt;
&lt;li&gt;the generated audio is published back into the same RTC room&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I found especially interesting from reading the README and code is that the project is clearly trying to solve a harder problem than image captioning.&lt;/p&gt;

&lt;p&gt;The prompts appear to push the model toward a live football commentator role by constraining it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comment on visible action rather than narrate loosely&lt;/li&gt;
&lt;li&gt;avoid inventing off-screen goals or fouls&lt;/li&gt;
&lt;li&gt;use player names only when visual evidence is strong enough&lt;/li&gt;
&lt;li&gt;return &lt;code&gt;NO_CALL&lt;/code&gt; when the frame is not readable enough&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another thing I liked was that the project seems to take operational reality seriously.&lt;/p&gt;

&lt;p&gt;It includes explicit &lt;code&gt;Start AI / Stop AI&lt;/code&gt; controls, viewer heartbeat, and a hard session TTL, which makes a lot of sense for a live AI system where cost can keep growing even when nobody is watching.&lt;/p&gt;

&lt;p&gt;The World Cup framing is fun, but the accessibility angle might be even more compelling.&lt;br&gt;&lt;br&gt;
A system like this could potentially add more field-level spatial detail for blind and low-vision fans than traditional commentary often does.&lt;/p&gt;

&lt;p&gt;Again, I’m not the author, so if I’m misreading any implementation detail, happy to be corrected. But as an open-source example of a real-time multimodal media pipeline, this was one of the more interesting projects I’ve come across recently.&lt;/p&gt;

&lt;p&gt;Full credit to zicojiao for the project itself. I’m only sharing it because I found it worth discussing.&lt;/p&gt;

</description>
      <category>abotwrotethis</category>
      <category>ai</category>
      <category>openai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
