{"id":13645344,"url":"https://github.com/buhe/langchain-swift","last_synced_at":"2025-05-16T04:04:11.989Z","repository":{"id":174350718,"uuid":"652112030","full_name":"buhe/langchain-swift","owner":"buhe","description":"🚀 LangChain for Swift. Optimized for iOS, macOS, watchOS (part) and visionOS.(beta)","archived":false,"fork":false,"pushed_at":"2025-03-22T07:20:52.000Z","size":767,"stargazers_count":371,"open_issues_count":24,"forks_count":45,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-12T14:54:53.905Z","etag":null,"topics":["ai","chatgpt","ios","langchain","llm","macos","swift","visionos","watchos"],"latest_commit_sha":null,"homepage":"https://buhe.dev","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/buhe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"custom":["paypal.me/buhe1986"]}},"created_at":"2023-06-11T05:55:45.000Z","updated_at":"2025-04-01T01:47:35.000Z","dependencies_parsed_at":"2023-09-24T09:01:53.476Z","dependency_job_id":"b85b5476-bc23-4331-b5d9-ff6f10ea05f1","html_url":"https://github.com/buhe/langchain-swift","commit_stats":null,"previous_names":["buhe/langchain-swift"],"tags_count":49,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buhe%2Flangchain-swift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buhe%2Flangchain-swift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buhe%2Flangchain-swift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buhe%2Flangchain-swift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/buhe","download_url":"https://codeload.github.com/buhe/langchain-swift/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254464891,"owners_count":22075570,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","chatgpt","ios","langchain","llm","macos","swift","visionos","watchos"],"created_at":"2024-08-02T01:02:33.765Z","updated_at":"2025-05-16T04:04:11.971Z","avatar_url":"https://github.com/buhe.png","language":"Swift","funding_links":["paypal.me/buhe1986"],"categories":["Langchain"],"sub_categories":[],"readme":"![](https://p.ipic.vip/2qqnzz.png)\n# 🐇 LangChain Swift\n[![Swift](https://github.com/buhe/langchain-swift/actions/workflows/swift.yml/badge.svg)](https://github.com/buhe/langchain-swift/actions/workflows/swift.yml) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) ![Swift Package Manager](https://img.shields.io/badge/SwiftPM-compatible-brightgreen.svg) [![Twitter](https://img.shields.io/badge/twitter-@buhe1986-blue.svg?style=flat)](http://twitter.com/buhe1986)\n\n🚀 LangChain for Swift. Optimized for iOS, macOS, watchOS (part) and visionOS.(beta)\n\nThis is a pure client library, no server required\n\n## Setup\n1. Please set up before using this library\n\n```swift\n        LC.initSet([\n            \"NOTION_API_KEY\":\"xx\",\n            \"NOTION_ROOT_NODE_ID\":\"xx\",\n            \"OPENAI_API_KEY\":\"xx\",\n            \"OPENAI_API_BASE\":\"xx\",\n        ])\n```\n\n2. Set some var like OPENAI_API_KEY or OPENAI_API_BASE\n\nSuch as.\n\n```\nOPENAI_API_KEY=sk-xxx\nOPENAI_API_BASE=xxx\nSUPABASE_URL=xxx\nSUPABASE_KEY=xxx\nSERPER_API_KEY=xxx\nHF_API_KEY=xxx\nBAIDU_OCR_AK=xxx\nBAIDU_OCR_SK=xxx\nBAIDU_LLM_AK=xxx\nBAIDU_LLM_SK=xxx\nCHATGLM_API_KEY=xxx\nOPENWEATHER_API_KEY=xxx\nLLAMA2_API_KEY=xxx\nGOOGLEAI_API_KEY=xxx\nLMSTUDIO_URL=xxx\nOLLAMA_URL=xxx\nOLLAMA_MODEL=xxx\nNOTION_API_KEY=xxx\nNOTION_ROOT_NODE_ID=xxx\nBILIBILI_SESSION=xxx\nBILIBILI_JCT=xxx\n```\n\n## Get started\n\n\u003cdetails\u003e\n\u003csummary\u003e🔥 Local Model\u003c/summary\u003e\n \nPlease use 'local' branch, because of dependency on projects.\n[Model here](https://github.com/guinmoon/LLMFarm/blob/main/models.md)\n \n ```\n  .package(url: \"https://github.com/buhe/langchain-swift\", .branch(\"local\"))\n ```\nCode\n\n```swift\n Task {\n            if let modelPath = Bundle.main.path(forResource: \"stablelm-3b-4e1t-Q4_K_M\", ofType: \"txt\") {\n                let local = Local(inference: .GPTNeox_gguf, modelPath: modelPath, useMetal: true)\n                let r = await local.generate(text: \"hi\")\n                print(\"🥰\\(r!.llm_output!)\")\n            } else {\n                print(\"⚠️ loss model\")\n            }\n\n        }\n```\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e💬 Chatbots\u003c/summary\u003e\n    \nCode\n\n```swift\nlet template = \"\"\"\nAssistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful tool that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.\n\n{history}\nHuman: {human_input}\nAssistant:\n\"\"\"\n\nlet prompt = PromptTemplate(input_variables: [\"history\", \"human_input\"], partial_variable: [:], template: template)\n\n\nlet chatgpt_chain = LLMChain(\n    llm: OpenAI(),\n    prompt: prompt,\n    memory: ConversationBufferWindowMemory()\n)\nTask(priority: .background)  {\n    var input = \"I want you to act as a Linux terminal. I will type commands and you will reply with what the terminal should show. I want you to only reply with the terminal output inside one unique code block, and nothing else. Do not write explanations. Do not type commands unless I instruct you to do so. When I need to tell you something in English I will do so by putting text inside curly brackets {like this}. My first command is pwd.\"\n    \n    var res = await chatgpt_chain.predict(args: [\"human_input\": input])\n    print(input)\n    print(\"🌈:\" + res!)\n    input = \"ls ~\"\n    res = await chatgpt_chain.predict(args: [\"human_input\": input])\n    print(input)\n    print(\"🌈:\" + res!)\n}\n```\nLog\n```\nI want you to act as a Linux terminal. I will type commands and you will reply with what the terminal should show. I want you to only reply with the terminal output inside one unique code block, and nothing else. Do not write explanations. Do not type commands unless I instruct you to do so. When I need to tell you something in English I will do so by putting text inside curly brackets {like this}. My first command is pwd.\n🌈:\n/home/user\n\nls ~\n🌈:\nDesktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos\n\n```\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e❓ QA bot\u003c/summary\u003e\n    \nAn [main/Sources/LangChain/vectorstores/supabase/supabase.sql](https://github.com/buhe/langchain-swift/blob/main/Sources/LangChain/vectorstores/supabase/supabase.sql) is required.\n\nref: https://supabase.com/docs/guides/database/extensions/pgvector\n\nCode\n```swift\nTask(priority: .background)  {\n    let loader = TextLoader(file_path: \"state_of_the_union.txt\")\n    let documents = await loader.load()\n    let text_splitter = CharacterTextSplitter(chunk_size: 1000, chunk_overlap: 0)\n\n    let embeddings = OpenAIEmbeddings()\n    let s = Supabase(embeddings: embeddings)\n    for text in documents {\n        let docs = text_splitter.split_text(text: text.page_content)\n        for doc in docs {\n            await s.addText(text: doc)\n        }\n    }\n    \n    let m = await s.similaritySearch(query: \"What did the president say about Ketanji Brown Jackson\", k: 1)\n    print(\"Q🖥️:What did the president say about Ketanji Brown Jackson\")\n    print(\"A🚀:\\(m)\")\n}\n```\nLog\n```\nQ🖥️:What did the president say about Ketanji Brown Jackson\nA🚀:[LangChain.MatchedModel(content: Optional(\"In state after state, new laws have been passed, not only to suppress the vote, but to subvert entire elections. We cannot let this happen. Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence. \"), similarity: 0.8024642)]\n```\n\u003c/details\u003e\n\u003cdetails\u003e\n\n\u003csummary\u003e📄 Retriever\u003c/summary\u003e\n    \nCode\n```swift\nTask(priority: .background)  {\n    let retriever = WikipediaRetriever()\n    let qa = ConversationalRetrievalChain(retriver: retriever, llm: OpenAI())\n    let questions = [\n        \"What is Apify?\",\n        \"When the Monument to the Martyrs of the 1830 Revolution was created?\",\n        \"What is the Abhayagiri Vihāra?\"\n    ]\n    var chat_history:[(String, String)] = []\n\n    for question in questions{\n        let result = await qa.predict(args: [\"question\": question, \"chat_history\": ConversationalRetrievalChain.get_chat_history(chat_history: chat_history)])\n        chat_history.append((question, result!))\n        print(\"⚠️**Question**: \\(question)\")\n        print(\"✅**Answer**: \\(result!)\")\n    }\n}\n```\nLog\n```\n⚠️**Question**: What is Apify?\n✅**Answer**: Apify refers to a web scraping and automation platform.\nread(descriptor:pointer:size:): Connection reset by peer (errno: 54)\n⚠️**Question**: When the Monument to the Martyrs of the 1830 Revolution was created?\n✅**Answer**: The Monument to the Martyrs of the 1830 Revolution was created in 1906.\n⚠️**Question**: What is the Abhayagiri Vihāra?\n✅**Answer**: The term \"Abhayagiri Vihāra\" refers to a Buddhist monastery in ancient Sri Lanka.\n```\n\u003c/details\u003e\n\u003cdetails\u003e\n\n\u003csummary\u003e🤖 Agent\u003c/summary\u003e\n    \nCode\n```swift\nlet agent = initialize_agent(llm: OpenAI(), tools: [WeatherTool()])\nTask(priority: .background)  {\n    let res = await agent.run(args: \"Query the weather of this week\")\n    switch res {\n    case Parsed.str(let str):\n        print(\"🌈:\" + str)\n    default: break\n    }\n}\n```\nLog\n```\n🌈: The weather for this week is sunny.\n```\n\u003c/details\u003e\n\u003cdetails\u003e\n    \n\u003csummary\u003e📡 Router\u003c/summary\u003e\n    \n```swift\nlet physics_template = \"\"\"\nYou are a very smart physics professor. \\\nYou are great at answering questions about physics in a concise and easy to understand manner. \\\nWhen you don't know the answer to a question you admit that you don't know.\n\nHere is a question:\n{input}\n\"\"\"\n\n\nlet math_template = \"\"\"\nYou are a very good mathematician. You are great at answering math questions. \\\nYou are so good because you are able to break down hard problems into their component parts, \\\nanswer the component parts, and then put them together to answer the broader question.\n\nHere is a question:\n{input}\n\"\"\"\n   \nlet prompt_infos = [\n   [\n       \"name\": \"physics\",\n       \"description\": \"Good for answering questions about physics\",\n       \"prompt_template\": physics_template,\n   ],\n   [\n       \"name\": \"math\",\n       \"description\": \"Good for answering math questions\",\n       \"prompt_template\": math_template,\n   ]\n]\n\nlet llm = OpenAI()\n\nvar destination_chains: [String: DefaultChain] = [:]\nfor p_info in prompt_infos {\n   let name = p_info[\"name\"]!\n   let prompt_template = p_info[\"prompt_template\"]!\n   let prompt = PromptTemplate(input_variables: [\"input\"], partial_variable: [:], template: prompt_template)\n   let chain = LLMChain(llm: llm, prompt: prompt, parser: StrOutputParser())\n   destination_chains[name] = chain\n}\nlet default_prompt = PromptTemplate(input_variables: [], partial_variable: [:], template: \"\")\nlet default_chain = LLMChain(llm: llm, prompt: default_prompt, parser: StrOutputParser())\n\nlet destinations = prompt_infos.map{\n   \"\\($0[\"name\"]!): \\($0[\"description\"]!)\"\n}\nlet destinations_str = destinations.joined(separator: \"\\n\")\n\nlet router_template = MultiPromptRouter.formatDestinations(destinations: destinations_str)\nlet router_prompt = PromptTemplate(input_variables: [\"input\"], partial_variable: [:], template: router_template)\n\nlet llmChain = LLMChain(llm: llm, prompt: router_prompt, parser: RouterOutputParser())\n\nlet router_chain = LLMRouterChain(llmChain: llmChain)\n\nlet chain = MultiRouteChain(router_chain: router_chain, destination_chains: destination_chains, default_chain: default_chain)\nTask(priority: .background)  {\n   print(\"💁🏻‍♂️\", await chain.run(args: \"What is black body radiation?\"))\n}\n```\nLog\n```\nrouter text: {\n    \"destination\": \"physics\",\n    \"next_inputs\": \"What is black body radiation?\"\n}\n💁🏻‍♂️ str(\"Black body radiation refers to the electromagnetic radiation emitted by an object that absorbs all incident radiation and reflects or transmits none. It is an idealized concept used in physics to understand the behavior of objects that emit and absorb radiation. \\n\\nAccording to Planck\\'s law, the intensity and spectrum of black body radiation depend on the temperature of the object. As the temperature increases, the peak intensity of the radiation shifts to shorter wavelengths, resulting in a change in color from red to orange, yellow, white, and eventually blue.\\n\\nBlack body radiation is important in various fields of physics, such as astrophysics, where it helps explain the emission of radiation from stars and other celestial bodies. It also plays a crucial role in understanding the behavior of objects at high temperatures, such as in industrial processes or the study of the early universe.\\n\\nHowever, it\\'s worth noting that while I strive to provide accurate and concise explanations, there may be more intricate details or specific mathematical formulations related to black body radiation that I haven\\'t covered.\")\n```\n\u003c/details\u003e\n\n### Parser\n\n\u003cdetails\u003e\n\u003csummary\u003eObjectOutputParser\u003c/summary\u003e\n    \n```swift\nlet demo = Book(title: \"a\", content: \"b\", unit: Unit(num: 1))\n\nvar parser = ObjectOutputParser(demo: demo)\n\nlet llm = OpenAI()\n\nlet t = PromptTemplate(input_variables: [\"query\"], partial_variable:[\"format_instructions\": parser.get_format_instructions()], template: \"Answer the user query.\\n{format_instructions}\\n{query}\\n\")\n\nlet chain = LLMChain(llm: llm, prompt: t, parser: parser, inputKey: \"query\")\nTask(priority: .background)  {\n    let pasred = await chain.run(args: \"The book title is 123 , content is 456 , num of unit is 7\")\n    switch pasred {\n    case Parsed.object(let o): print(\"🚗object: \\(o)\")\n    default: break\n    }\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eEnumOutputParser\u003c/summary\u003e\n\n```swift\n    enum MyEnum: String, CaseIterable  {\n        case value1\n        case value2\n        case value3\n    }\n    for v in MyEnum.allCases {\n        print(v.rawValue)\n    }\n    let llm = OpenAI()\n    let parser = EnumOutputParser\u003cMyEnum\u003e(enumType: MyEnum.self)\n    let i = parser.get_format_instructions()\n    print(\"ins: \\(i)\")\n    let t = PromptTemplate(input_variables: [\"query\"], partial_variable:[\"format_instructions\": parser.get_format_instructions()], template: \"Answer the user query.\\n{format_instructions}\\n{query}\\n\")\n    \n    let chain = LLMChain(llm: llm, prompt: t, parser: parser, inputKey: \"query\")\n    Task(priority: .background)  {\n        let result = await chain.run(args: \"Value is 'value2'\")\n        switch result {\n           case .enumType(let e):\n               print(\"🦙enum: \\(e)\")\n           default:\n               print(\"parse fail. \\(result)\")\n           }\n    }\n```\n\u003c/details\u003e\n\n### Other\n\n\u003cdetails\u003e\n\u003csummary\u003eStream Chat - Must be use ChatOpenAI model \u003c/summary\u003e\n\n```swift\nTask(priority: .background)  {\n    let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)\n    \n    let httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup))\n    \n    defer {\n        // it's important to shutdown the httpClient after all requests are done, even if one failed. See: https://github.com/swift-server/async-http-client\n        try? httpClient.syncShutdown()\n    }\n    let llm = ChatOpenAI(httpClient: httpClient, temperature: 0.8)\n    let answer = await llm.generate(text: \"Hey\")\n    print(\"🥰\")\n    for try await c in answer!.getGeneration()! {\n        if let message = c {\n            print(message)\n        }\n    }\n}\n```\n\u003c/details\u003e\n\n## 🌐 Trusted by\n\u003ca href=\"https://apps.apple.com/us/app/convict-conditioning-pro/id1661449971\"\u003e\n\u003cimg src=\"https://www.buhe.dev/_next/image?url=%2Fassets%2FCC.png\u0026w=256\u0026q=75\" alt=\"Convict Conditioning\" style=\"width:15%\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://apps.apple.com/us/app/investment-for-long-term/id1665352936\"\u003e\n\u003cimg src=\"https://www.buhe.dev/_next/image?url=%2Fassets%2FInvestDash.png\u0026w=256\u0026q=75\" alt=\"Investment For Long Term\" style=\"width:15%\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://apps.apple.com/us/app/ai-summarize-pro/id6450951898\"\u003e\n\u003cimg src=\"https://www.buhe.dev/_next/image?url=%2Fassets%2FAISummary.png\u0026w=256\u0026q=75\" alt=\"AI Summary\" style=\"width:15%\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://apps.apple.com/us/app/ai-pagily/id6452588389\"\u003e\n\u003cimg src=\"https://www.buhe.dev/_next/image?url=%2Fassets%2FPagily.png\u0026w=256\u0026q=75\" alt=\"AI Pagily\" style=\"width:15%\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://apps.apple.com/us/app/b-%E7%AB%99-ai-%E6%80%BB%E7%BB%93/id6455595076\"\u003e\n\u003cimg src=\"https://www.buhe.dev/_next/image?url=%2Fassets%2FBilibiliSummary.png\u0026w=256\u0026q=75\" alt=\"B 站 AI 总结\" style=\"width:15%\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://apps.apple.com/us/app/%E5%B8%AE%E4%BD%A0%E5%86%99%E4%BD%9C%E6%96%87/id6458487704\"\u003e\n\u003cimg src=\"https://www.buhe.dev/_next/image?url=%2Fassets%2FWriter.png\u0026w=256\u0026q=75\" alt=\"帮你写作文\" style=\"width:15%\"\u003e\n\u003c/a\u003e\n\n[Open an issue or PR to add your app.](https://github.com/buhe/langchain-swift/issues/new)\n\n## 🚗 Roadmap\n- LLMs\n    - [x] OpenAI\n    - [x] Hugging Face\n    - [x] Dalle\n    - [x] ChatGLM\n    - [x] ChatOpenAI\n    - [x] Baidu\n    - [x] Llama 2\n    - [x] Gemini\n    - [x] LMStudio API\n    - [x] Ollama API\n    - [x] Local Model\n- Vectorstore\n    - [x] Supabase\n    - [x] SimilaritySearchKit\n- Store\n    - [x] BaseStore\n    - [x] InMemoryStore\n    - [x] FileStore\n- Embedding\n    - [x] OpenAI\n    - [x] Ollama\n    - [ ] Distilbert\n- Chain\n    - [x] Base\n    - [x] LLM\n    - [x] SimpleSequentialChain\n    - [x] SequentialChain\n    - [x] TransformChain\n    - Router\n        - [x] LLMRouterChain\n        - [x] MultiRouteChain\n    - QA\n        - [x] ConversationalRetrievalChain\n- Tools\n    - [x] Dummy\n    - [x] InvalidTool\n    - [x] Serper\n    - [x] JavascriptREPLTool(Via JSC)\n    - [x] GetLocation(Via CoreLocation)\n    - [x] Weather\n    - [x] TTSTool\n- Agent\n    - [x] ZeroShotAgent\n- Memory\n    - [x] BaseMemory\n    - [x] BaseChatMemory\n    - [x] ConversationBufferWindowMemory\n    - [x] ReadOnlySharedMemory\n- Text Splitter\n    - [x] CharacterTextSplitter\n    - [x] RecursiveCharacterTextSplitter\n- Document Loader\n    - [x] TextLoader\n    - [x] YoutubeLoader\n    - [x] HtmlLoader\n    - [x] PDFLoader\n    - [x] BilibilLoader https://nemo2011.github.io/bilibili-api/#/get-credential\n    - [x] ImageOCRLoader\n    - [x] AudioLoader\n    - [x] NotionLoader\n    - [x] RSSLoader\n- OutputParser\n    - [x] MRKLOutputParser\n    - [x] ListOutputParser\n    - [x] SimpleJsonOutputParser\n    - [x] StrOutputParser\n    - [x] RouterOutputParser\n    - [x] ObjectOutputParser\n    - [x] EnumOutputParser\n    - [x] DateOutputParser\n- Prompt\n    - [x] PromptTemplate\n    - [x] MultiPromptRouter\n- Callback\n    - [x] StdOutCallbackHandler \n- LLM Cache\n    - [x] InMemery\n    - [x] File\n- Retriever\n    - [x] WikipediaRetriever\n    - [x] PubmedRetriever\n    - [x] ParentDocumentRetriever\n## 👍 Got Ideas?\nOpen an issue, and let's discuss!\n\nJoin Slack: [https://join.slack.com/t/langchain-mobile/shared_invite/zt-26tzdzb2u-8RnP7hDQz~MWMg8EeIu0lQ\n](https://join.slack.com/t/langchain-mobile/shared_invite/zt-2ajo39zxx-db9e_nbJcADTkGeB33PF7g)\n## 💁 Contributing\nAs an open-source project in a rapidly developing field, we are extremely open to contributions, whether it be in the form of a new feature, improved infrastructure, or better documentation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbuhe%2Flangchain-swift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbuhe%2Flangchain-swift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbuhe%2Flangchain-swift/lists"}