{"id":48274913,"url":"https://github.com/idiap/sdialog","last_synced_at":"2026-04-04T22:25:40.024Z","repository":{"id":297011730,"uuid":"988252213","full_name":"idiap/sdialog","owner":"idiap","description":"Synthetic Dialog Generation and Analysis with LLMs","archived":false,"fork":false,"pushed_at":"2026-03-13T16:16:11.000Z","size":379164,"stargazers_count":126,"open_issues_count":16,"forks_count":24,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-03-13T21:40:43.549Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/idiap.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-05-22T09:22:16.000Z","updated_at":"2026-03-13T16:16:16.000Z","dependencies_parsed_at":"2025-06-03T21:56:18.743Z","dependency_job_id":"c39e30f6-194b-4c29-8033-8706d785bda9","html_url":"https://github.com/idiap/sdialog","commit_stats":null,"previous_names":["idiap/sdialog"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/idiap/sdialog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiap%2Fsdialog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiap%2Fsdialog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiap%2Fsdialog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiap%2Fsdialog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/idiap","download_url":"https://codeload.github.com/idiap/sdialog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiap%2Fsdialog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31416764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2026-04-04T22:25:39.356Z","updated_at":"2026-04-04T22:25:39.999Z","avatar_url":"https://github.com/idiap.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca href=\"https://sdialog.github.io/\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/idiap/sdialog/master/docs/_static/logo-banner.png\" alt=\"SDialog Logo\" title=\"SDialog\" height=\"150\" /\u003e\u003c/a\u003e\n\n[![Documentation Status](https://app.readthedocs.org/projects/sdialog/badge/?version=latest)](https://sdialog.readthedocs.io)\n[![CI](https://img.shields.io/github/actions/workflow/status/idiap/sdialog/ci.yml?label=CI)](https://github.com/idiap/sdialog/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/idiap/sdialog/graph/badge.svg?token=2210USI8I0)](https://app.codecov.io/gh/idiap/sdialog?displayType=list)\n[![Demo](https://img.shields.io/badge/Demo-YouTube-red?logo=youtube)](https://www.youtube.com/watch?v=oG_jJuU255I)\n[![PyPI version](https://badge.fury.io/py/sdialog.svg)](https://badge.fury.io/py/sdialog)\n[![Downloads](https://static.pepy.tech/badge/sdialog)](https://pepy.tech/project/sdialog)\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/idiap/sdialog/)\n\nQuick links: [Website](https://sdialog.github.io/) • [GitHub](https://github.com/idiap/sdialog) • [Docs](https://sdialog.readthedocs.io) • [API](https://sdialog.readthedocs.io/en/latest/api/sdialog.html) • [Paper](https://aclanthology.org/2026.eacl-demo.23/) • [Demo (video)](demo.md) • [Tutorials](https://github.com/idiap/sdialog/tree/main/tutorials) • [Datasets (HF)](https://huggingface.co/datasets/sdialog) • [Issues](https://github.com/idiap/sdialog/issues)\n\n---\nSDialog is an MIT-licensed open-source toolkit for building, simulating, and evaluating LLM-based conversational agents end-to-end. It aims to bridge **agent construction → user simulation → dialog generation → evaluation** in a single reproducible workflow, so you can generate reliable, controllable dialog systems or data at scale.\n\nIt standardizes a Dialog schema and offers persona‑driven multi‑agent simulation with LLMs, composable orchestration, built‑in metrics, and mechanistic interpretability.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/idiap/sdialog/master/docs/_static/sdialog-modules.png\" alt=\"SDialog Logo\" title=\"SDialog\" height=\"650\" /\u003e\n\u003c/p\u003e\n\n## ✨ Key features\n- Standard dialog schema with JSON import/export _(aiming to standardize dialog dataset formats [with your help 🙏](#project-vision--community-call))_\n- Persona‑driven multi‑agent simulation with contexts, tools, and thoughts\n- Composable orchestration for precise control over behavior and flow\n- Built‑in evaluation (metrics + LLM‑as‑judge) for comparison and iteration\n- Native mechanistic interpretability (inspect and steer activations)\n- Easy creation of user-defined components by inheriting from base classes (personas, metrics, orchestrators, etc.)\n- Interoperability across OpenAI, Hugging Face, Ollama, AWS Bedrock, Google GenAI, Anthropic, and more.\n\nIf you are building conversational systems, benchmarking dialog models, producing synthetic training corpora, simulating diverse users to test or probe conversational systems, or analyzing internal model behavior, SDialog provides an end‑to‑end workflow.\n\n\n## ⚡ Installation\n\n```bash\npip install sdialog\n```\n\nAlternatively, a ready-to-use Apptainer image (.sif) with SDialog and all dependencies is available on Hugging Face and can be downloaded [here](https://huggingface.co/datasets/sdialog/apptainer/resolve/main/sdialog.sif).\n\n```bash\napptainer exec --nv sdialog.sif python3 -c \"import sdialog; print(sdialog.__version__)\"\n```\n\n\u003e [!NOTE]\n\u003e This Apptainer image also has the Ollama server preinstalled.\n\n\n## 🏁 Quickstart tour\n\nHere's a short, hands‑on example: a support agent helps a customer disputing a double charge. We add a small refund rule and two simple tools, generate three dialogs for evaluation, then serve the agent on port 1333 for Open WebUI or any OpenAI‑compatible client.\n\n```python\nimport sdialog\nfrom sdialog import Context\nfrom sdialog.agents import Agent\nfrom sdialog.personas import SupportAgent, Customer\nfrom sdialog.orchestrators import SimpleReflexOrchestrator\n\n# First, let's set our preferred default backend:model and parameters\nsdialog.config.llm(\"openai:gpt-4.1\", temperature=1, api_key=\"YOUR_KEY\")  # or export OPENAI_API_KEY=YOUR_KEY\n# sdialog.config.llm(\"ollama:qwen3:14b\")  # etc.\n\n# Let's define our personas (use built-ins like in this example, or create your own!)\nsupport_persona = SupportAgent(name=\"Ava\", politeness=\"high\", communication_style=\"friendly\")\ncustomer_persona = Customer(name=\"Riley\", issue=\"double charge\", desired_outcome=\"refund\")\n\n# (Optional) Let's define two mock tools (just plain Python functions) for our support agent\ndef verify_account(user_id):\n    \"\"\"Verify user account by user id.\"\"\"\n    return {\"user_id\": user_id, \"verified\": True}\ndef refund(amount):\n    \"\"\"Process a refund for the given amount.\"\"\"\n    return {\"status\": \"refunded\", \"amount\": amount}\n\n# (Optional) Let's also include a small rule-based orchestrator for our support agent\nreact_refund = SimpleReflexOrchestrator(\n  condition=lambda utt: \"refund\" in utt.lower(),\n  instruction=\"Follow refund policy; verify account, apologize, refund.\",\n)\n\n# Now, let's create the agents!\nsupport_agent = Agent(\n  persona=support_persona,\n  think=True,  # Let's also enable thinking mode\n  tools=[verify_account, refund],\n  name=\"Support\"\n)\nsimulated_customer = Agent(\n  persona=customer_persona,\n  first_utterance=\"Hi!\",\n  name=\"Customer\"\n)\n\n# Since we have one orchestrator, let's attach it to our target agent\nsupport_agent = support_agent | react_refund\n\n# Let's generate 3 dialogs between them! (we can evaluate them later)\n# (Optional) Let's also define a concrete conversational context for the agents in these dialogs\nweb_chat = Context(location=\"chat\", environment=\"web\", circumstances=\"billing\")\nfor ix in range(3):\n  dialog = simulated_customer.dialog_with(support_agent, context=web_chat)  # Generate the dialog\n  dialog.to_file(f\"dialog_{ix}.json\")  # Save it\n  dialog.print(all=True)  # And pretty print it with all its events (thoughts, orchestration, etc.)\n\n# Finally, let's serve our support agent to interact with real users (OpenAI-compatible API)\n#    Point Open WebUI or any OpenAI-compatible client to: http://localhost:1333\nsupport_agent.serve(port=1333)\n```\n\u003e [!TIP]\n\u003e - Choose your [LLMs and backends freely](https://sdialog.readthedocs.io/en/latest/sdialog/index.html#configuration-layer).\n\u003e - Personas and context can be [automatically generated](https://sdialog.readthedocs.io/en/latest/sdialog/index.html#attribute-generators) (e.g. generate different customer profiles!).\n\n\u003e [!NOTE]\n\u003e - See [\"agents with tools and thoughts\" tutorial](https://github.com/idiap/sdialog/blob/main/tutorials/00_overview/7.agents_with_tools_and_thoughts.ipynb) for a more complete example.\n\u003e - See [Serving Agents via REST API](https://sdialog.readthedocs.io/en/latest/sdialog/index.html#serving-agents) for more details on server options.\n\n### 🧪 Testing remote systems with simulated users\n\n\u003cdetails\u003e\n\u003csummary\u003eProbe OpenAI‑compatible deployed systems with controllable simulated users and capture dialogs for evaluation.\u003c/summary\u003e\n\nYou can also use SDialog as a controllable test harness for any OpenAI‑compatible system such as **vLLM**-based ones by role‑playing realistic or adversarial users against your deployed system:\n\n* Black‑box functional checks (Does the system follow instructions? Handle edge cases?)\n* Persona / use‑case coverage (Different goals, emotions, domains)\n* Regression testing (Run the same persona batch each release; diff dialogs)\n* Safety / robustness probing (Angry, confused, or noisy users)\n* Automated evaluation (Pipe generated dialogs directly into evaluators - See Evaluation section below)\n\nCore idea: wrap your system as an `Agent` using `openai:` as the prefix of your model name string, talk to it with simulated user `Agent`s, and capture `Dialog`s you can save, diff, and score.\n\nBelow is a minimal example where our simulated customer interacts once with your hypothetical remote endpoint:\n\n```python\n# Our remote system (your conversational backend exposing an OpenAI-compatible API)\nsystem = Agent(\n  model=\"openai:your/model\",  # Model name exposed by your server\n  openai_api_base=\"http://your-endpoint.com:8000/v1\",  # Base URL of the service\n  openai_api_key=\"EMPTY\",  # Or a real key if required\n  name=\"System\"\n)\n\n# Let's make our simulated customer talk with the system\ndialog = simulated_customer.dialog_with(system)\ndialog.to_file(\"dialog_0.json\")\n```\n\u003c/details\u003e\n\n### 💾 Loading and saving dialogs\n\n\u003cdetails\u003e\n\u003csummary\u003eImport, export, and transform dialogs from JSON, text, CSV, or Hugging Face datasets.\u003c/summary\u003e\n\nDialogs are rich objects with helper methods (filter, slice, transform, etc.) that can be easily exported and loaded using different methods:\n\n```python\nfrom sdialog import Dialog\n\n# Load from JSON (generated by SDialog using `to_file()`)\ndialog = Dialog.from_file(\"dialog_0.json\")\n\n# Load from HuggingFace Hub datasets\ndialogs = Dialog.from_huggingface(\"sdialog/Primock-57\")\n\n# Create from plain text files or strings - perfect for converting existing datasets!\ndialog_from_txt = Dialog.from_str(\"\"\"\nAlice: Hello there! How are you today?\nBob: I'm doing great, thanks for asking.\nAlice: That's wonderful to hear!\n\"\"\")\n# Or, equivalently if the content is in a txt file\ndialog_from_txt = Dialog.from_file(\"conversation.txt\")\n\n# Load from CSV files with custom column names\ndialog_from_csv = Dialog.from_file(\"conversation.csv\",\n                                   csv_speaker_col=\"speaker\",\n                                   csv_text_col=\"value\",)\n\n# All Dialog objects have rich manipulation methods\ndialog.filter(\"Alice\").rename_speaker(\"Alice\", \"Customer\").upper().to_file(\"processed.json\")\navg_words_turn = sum(len(turn) for turn in dialog) / len(dialog)\n```\n\nSee [Dialog section](https://sdialog.readthedocs.io/en/latest/sdialog/index.html#dialog) in the documentation for more information.\n\u003c/details\u003e\n\n## 📊 Evaluate and compare\n\n\u003cdetails\u003e\n\u003csummary\u003eScore dialogs with built‑in metrics and LLM judges, and compare datasets with aggregators and plots.\u003c/summary\u003e\n\nDialogs can be evaluated using the different components available inside the `sdialog.evaluation` module.\nUse [built‑in metrics](https://sdialog.readthedocs.io/en/latest/api/sdialog.html#module-sdialog.evaluation)—conversational features, readability, embedding-based, LLM-as-judge, flow-based, functional correctness (30+ metrics across six categories)—or easily create new ones, then aggregate and compare datasets (sets of dialogs) via `Comparator`.\n\n```python\nfrom sdialog import Dialog\nfrom sdialog.evaluation import LLMJudgeYesNo, ToolSequenceValidator\nfrom sdialog.evaluation import FrequencyEvaluator, Comparator\n\n# Two quick checks: did the agent ask for verification, and did it call tools in order?\njudge_verify = LLMJudgeYesNo(\n  \"Did the support agent try to verify the customer?\",\n  reason=True,\n)\ntool_seq = ToolSequenceValidator([\"verify_account\", \"refund\"])\n\ncomparator = Comparator([\n  FrequencyEvaluator(judge_verify, name=\"Asked for verification\"),\n  FrequencyEvaluator(tool_seq, name=\"Correct tool order\"),\n])\n\nresults = comparator({\n  \"model-A\": Dialog.from_folder(\"output/model-A\"),\n  \"model-B\": Dialog.from_folder(\"output/model-B\"),\n})\ncomparator.plot()\n```\n\u003c/details\u003e\n\n\u003e [!TIP]\n\u003e See [evaluation tutorial](https://github.com/idiap/sdialog/blob/main/tutorials/00_overview/5.evaluation.ipynb).\n\n## 🧠 Mechanistic interpretability\n\n\u003cdetails\u003e\n\u003csummary\u003eCapture per‑token activations and steer models via Inspectors for analysis and interventions.\u003c/summary\u003e\n\nAttach Inspectors to capture per‑token activations and optionally steer (add/ablate directions) to analyze or intervene in model behavior.\n\n```python\nimport sdialog\nfrom sdialog.interpretability import Inspector\nfrom sdialog.agents import Agent\n\nsdialog.config.llm(\"huggingface:meta-llama/Llama-3.2-3B-Instruct\")\n\nagent = Agent(name=\"Bob\")\ninspector = Inspector(target=\"model.layers.15\")\nagent = agent | inspector\n\nagent(\"How are you?\")\nagent(\"Cool!\")\n\n# Let's get the last response's first token activation vector!\nact = inspector[-1][0].act # [response index][token index]\n```\n\nSteering intervention (subtracting a direction):\n```python\nimport torch\nanger_direction = torch.load(\"anger_direction.pt\")  # A direction vector (e.g., PCA / difference-in-mean vector)\nagent_steered = agent | inspector - anger_direction  # Ablate the anger direction from the target activations\n\nagent_steered(\"You are an extremely upset assistant\")  # Agent \"can't get angry anymore\" :)\n```\n\u003c/details\u003e\n\n\u003e [!TIP]\n\u003e See [the tutorial](https://github.com/idiap/sdialog/blob/main/tutorials/00_overview/6.agent%2Binspector_refusal.ipynb) on using SDialog to remove the refusal capability from LLaMA 3.2.\n\n\n## 🔊 Audio generation\n\n\u003cdetails\u003e\n\u003csummary\u003eConvert text dialogs to audio conversations with speech synthesis, voice assignment, and acoustic simulation.\u003c/summary\u003e\n\nSDialog can transform text dialogs into audio conversations with a simple one-line command. The audio module supports:\n\n* **Text-to-Speech (TTS)**: Kokoro and HuggingFace models (with planned support for better TTS like IndexTTS and API-based TTS like OpenAI)\n* **Voice databases**: Automatic or manual voice assignment based on persona attributes (age, gender, language)\n* **Acoustic simulation**: Room acoustics simulation for realistic spatial audio\n* **Microphone simulation**: Professional microphones simulation from brands like Shure, Sennheiser, and Sony\n* **Multiple formats**: Export to WAV, MP3, or FLAC with custom sampling rates\n* **Multi-stage pipeline**: Step 1 (tts and concatenate utterances) and Step 2/3 (position based timeline generation and room acoustics)\n\nGenerate audio from any dialog easily with just a few lines of code:\n\nInstall dependencies (see [the documentation](https://sdialog.readthedocs.io/en/latest/sdialog/index.html#setup-and-installation) for complete setup instructions):\n\n```bash\napt-get install sox ffmpeg espeak-ng\npip install sdialog[audio]\n```\n\nThen, simply:\n\n```python\nfrom sdialog import Dialog\n\ndialog = Dialog.from_file(\"my_dialog.json\")\n\n# Convert to audio with default settings (HuggingFace TTS - single speaker)\naudio_dialog = dialog.to_audio(perform_room_acoustics=True)\nprint(audio_dialog.display())\n\n# Or customize the audio generation\naudio_dialog = dialog.to_audio(\n  perform_room_acoustics=True,\n  audio_file_format=\"mp3\",\n  re_sampling_rate=16000,\n)\nprint(audio_dialog.display())\n```\n\n\u003c/details\u003e\n\n\u003e [!TIP]\n\u003e See the [Audio Generation documentation](https://sdialog.readthedocs.io/en/latest/sdialog/index.html#audio-generation) for more details. For usage examples including acoustic simulation, room generation, and voice databases, check out the [audio tutorials](https://github.com/idiap/sdialog/tree/main/tutorials/01_audio).\n\n\n## 📖 Documentation and tutorials\n\n- [EACL 2026 paper](https://aclanthology.org/2026.eacl-demo.23/) ([ArXiv version](https://arxiv.org/abs/2506.10622))\n- [Demo (video)](demo.md)\n- [Tutorials](https://github.com/idiap/sdialog/tree/main/tutorials)\n- [API reference](https://sdialog.readthedocs.io/en/latest/api/sdialog.html)\n- [Documentation](https://sdialog.readthedocs.io)\n- Documentation for **AI coding assistants** like Copilot is also available at `https://sdialog.readthedocs.io/en/latest/llm.txt` following the [llm.txt specification](https://llmstxt.org/). In your Copilot chat, simply use:\n  ```\n  #fetch https://sdialog.readthedocs.io/en/latest/llm.txt\n\n  Your prompt goes here...(e.g. Write a python script using sdialog to have an agent for\n  criminal investigation, define its persona, tools, orchestration...)\n  ```\n\n\n## 🌍 Project Vision \u0026 Community Call\n\nTo accelerate open, rigorous, and reproducible conversational AI research, SDialog invites the community to collaborate and help shape the future of open dialog generation.\n\n### 🤝 How You Can Help\n\n- **🗂️ Dataset Standardization**: Help convert existing dialog datasets to SDialog format. Currently, each dataset stores dialogs in different formats, making cross-dataset analysis and model evaluation challenging. **Converted datasets are made available as Hugging Face datasets** in the [SDialog organization](https://huggingface.co/datasets/sdialog/) for easy access and integration.\n- **🔧 Component Development**: Create new personas, orchestrators, evaluators, generators, or backend integrations\n- **📊 Evaluation \u0026 Benchmarks**: Design new metrics, evaluation frameworks, or comparative studies\n- **🧠 Interpretability Research**: Develop new analysis tools, steering methods, or mechanistic insights\n- **📖 Documentation \u0026 Tutorials**: Improve guides, add examples, or create educational content\n- **🐛 Issues \u0026 Discussions**: Report bugs, request features, or share research ideas and use cases\n\n\u003e [!NOTE]\n\u003e **Example**: Check out [Primock-57](https://huggingface.co/datasets/sdialog/Primock-57), a sample dataset already available in SDialog format on Hugging Face.\n\u003e \n\u003e If you have a dialog dataset you'd like to convert to SDialog format, need help with the conversion process, or want to contribute in any other way, please [open an issue](https://github.com/idiap/sdialog/issues) or reach out to us. We're happy to help and collaborate!\n\n\n## 💪 Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). We welcome issues, feature requests, and pull requests. If you want to **contribute to the project**, please open an [issue](https://github.com/idiap/sdialog/issues) or submit a PR, and help us make SDialog better 👍.\nIf you find SDialog useful, please consider starring ⭐ the GitHub repository to support the project and increase its visibility 😄.\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. All-contributors list:\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://sergioburdisso.github.io/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/12646542?v=4?s=100\" width=\"100px;\" alt=\"Sergio Burdisso\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSergio Burdisso\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=sergioburdisso\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-sergioburdisso\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/idiap/sdialog/commits?author=sergioburdisso\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#tutorial-sergioburdisso\" title=\"Tutorials\"\u003e✅\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://linkedin.com/in/yanis-labrak-8a7412145/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/19389475?v=4?s=100\" width=\"100px;\" alt=\"Labrak Yanis\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLabrak Yanis\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=qanastek\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-qanastek\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/SevKod\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/123748182?v=4?s=100\" width=\"100px;\" alt=\"Séverin\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSéverin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=SevKod\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-SevKod\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#tutorial-SevKod\" title=\"Tutorials\"\u003e✅\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://www.ricardmarxer.com\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/15324?v=4?s=100\" width=\"100px;\" alt=\"Ricard Marxer\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRicard Marxer\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=rikrd\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-rikrd\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/thschaaf\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/42753790?v=4?s=100\" width=\"100px;\" alt=\"Thomas Schaaf\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThomas Schaaf\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-thschaaf\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/idiap/sdialog/commits?author=thschaaf\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/enderzhangpro\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/41446535?v=4?s=100\" width=\"100px;\" alt=\"David Liu\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDavid Liu\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=enderzhangpro\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ahassoo1\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/46629954?v=4?s=100\" width=\"100px;\" alt=\"ahassoo1\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eahassoo1\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-ahassoo1\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/idiap/sdialog/commits?author=ahassoo1\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://www.cyrta.com\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/83173?v=4?s=100\" width=\"100px;\" alt=\"Pawel Cyrta\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePawel Cyrta\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=cyrta\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-cyrta\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/Amyyyyeah\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/122391422?v=4?s=100\" width=\"100px;\" alt=\"ABCDEFGHIJKL\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eABCDEFGHIJKL\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=Amyyyyeah\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://blog.leonesfrancos.com/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/91928331?v=4?s=100\" width=\"100px;\" alt=\"Fernando Leon Franco\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFernando Leon Franco\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/idiap/sdialog/commits?author=Seikened\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-Seikened\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.idiap.ch/~evillatoro/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/49253959?v=4?s=100\" width=\"100px;\" alt=\"Esaú Villatoro-Tello, Ph. D.\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEsaú Villatoro-Tello, Ph. D.\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-villatoroe\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/idiap/sdialog/commits?author=villatoroe\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\n## 📚 Citation\n\nIf you use SDialog in academic work, please consider citing [our paper](https://aclanthology.org/2026.eacl-demo.23/), published at EACL 2026:\n\n```bibtex\n@misc{burdisso2025sdialogpythontoolkitendtoend,\n  title         = {SDialog: A Python Toolkit for End-to-End Agent Building, User Simulation, Dialog Generation, and Evaluation},\n  author        = {Sergio Burdisso and Séverin Baroudi and Yanis Labrak and David Grunert and Pawel Cyrta and Yiyang Chen and Srikanth Madikeri and Thomas Schaaf and Esaú Villatoro-Tello and Ahmed Hassoon and Ricard Marxer and Petr Motlicek},\n  year          = {2025},\n  eprint        = {2506.10622},\n  archivePrefix = {arXiv},\n  primaryClass  = {cs.AI},\n  url           = {https://arxiv.org/abs/2506.10622},\n}\n```\n\u003c!-- ```bibtex\n@inproceedings{burdisso-etal-2026-sdialog,\n    title = \"{SD}ialog: A Python Toolkit for End-to-End Agent Building, User Simulation, Dialog Generation, and Evaluation\",\n    author = {Burdisso, Sergio and Baroudi, S{\\'e}verin and Labrak, Yanis and Gr{\\\"u}nert, David and Cyrta, Pawel and Chen, Yiyang and Madikeri, Srikanth and Villatoro-tello, Esa{\\'u} and Marxer, Ricard and Motlicek, Petr},\n    editor = \"Croce, Danilo and Leidner, Jochen and Moosavi, Nafise Sadat\",\n    booktitle = \"Proceedings of the 19th Conference of the {E}uropean Chapter of the {A}ssociation for {C}omputational {L}inguistics (Volume 3: System Demonstrations)\",\n    month = mar,\n    year = \"2026\",\n    address = \"Rabat, Marocco\",\n    publisher = \"Association for Computational Linguistics\",\n    url = \"https://aclanthology.org/2026.eacl-demo.23/\",\n    doi = \"10.18653/v1/2026.eacl-demo.23\",\n    pages = \"320--340\",\n    ISBN = \"979-8-89176-382-1\"\n}\n``` --\u003e\n\n## 🙏 Acknowledgments\n\nThis work was mainly supported by the European Union Horizon 2020 project [ELOQUENCE](https://eloquenceai.eu/about/) and received a significant development boost during the **Johns Hopkins University** [JSALT 2025 workshop](https://jsalt2025.fit.vut.cz/), as part of the [\"Play your Part\" research group](https://jsalt2025.fit.vut.cz/play-your-part). We thank all contributors and the open-source community for their valuable feedback and contributions.\n\n## 📝 License\n\n[MIT License](LICENSE)  \nCopyright (c) 2025 Idiap Research Institute\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidiap%2Fsdialog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fidiap%2Fsdialog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidiap%2Fsdialog/lists"}