{"id":14064750,"url":"https://github.com/unifyai/unify","last_synced_at":"2025-05-15T08:00:23.345Z","repository":{"id":230435461,"uuid":"777502336","full_name":"unifyai/unify","owner":"unifyai","description":"Notion for AI Observability 📊","archived":false,"fork":false,"pushed_at":"2025-05-09T16:24:35.000Z","size":1934,"stargazers_count":300,"open_issues_count":1,"forks_count":31,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-11T00:32:54.990Z","etag":null,"topics":["ai","claude","gpt","gpt-4","llama2","llm","llm-inference","llms","mixtral","openai","python"],"latest_commit_sha":null,"homepage":"https://unify.ai","language":"Python","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/unifyai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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}},"created_at":"2024-03-26T00:59:24.000Z","updated_at":"2025-05-10T14:17:44.000Z","dependencies_parsed_at":"2024-03-29T18:31:02.139Z","dependency_job_id":"bfd24e6a-c280-4b50-8232-fc6c38cc0d32","html_url":"https://github.com/unifyai/unify","commit_stats":{"total_commits":874,"total_committers":13,"mean_commits":67.23076923076923,"dds":"0.17848970251716245","last_synced_commit":"acd2c9090b541ae4c9793ccd54df320b0ec1e184"},"previous_names":["unifyai/unify-llm-python"],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unifyai%2Funify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unifyai%2Funify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unifyai%2Funify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unifyai%2Funify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unifyai","download_url":"https://codeload.github.com/unifyai/unify/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253660817,"owners_count":21943817,"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","claude","gpt","gpt-4","llama2","llm","llm-inference","llms","mixtral","openai","python"],"created_at":"2024-08-13T07:04:03.334Z","updated_at":"2025-05-15T08:00:23.287Z","avatar_url":"https://github.com/unifyai.png","language":"Python","funding_links":[],"categories":["NLP","Python"],"sub_categories":[],"readme":"\n\u003ca href=\"https://console.unify.ai/\"\u003e\n    \u003cpicture\u003e\n        \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/unifyai/unifyai.github.io/refs/heads/main/img/logos/unify_logo_inverted_cropped.svg\"/\u003e\n        \u003cimg class=\"dark-light\" width=\"30%\" src=\"https://raw.githubusercontent.com/unifyai/unifyai.github.io/refs/heads/main/img/logos/unify_logo_cropped.svg\"/\u003e\n    \u003c/picture\u003e\n\u003c/a\u003e\n\n----\n\n\u003ca href=\"https://www.ycombinator.com/companies/unify\"\u003e![Static Badge](https://img.shields.io/badge/Y%20Combinator-W23-orange)\u003c/a\u003e\n\u003ca href=\"https://x.com/letsunifyai\"\u003e![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/letsunifyai)\u003c/a\u003e\n\u003ca href=\"https://discord.gg/sXyFF8tDtm\"\u003e ![Static Badge](https://img.shields.io/badge/Join_Discord-464646?\u0026logo=discord\u0026logoColor=5865F2) \u003c/a\u003e\n\n\u003cdiv style=\"display: block;\" align=\"center\"\u003e\n    \u003ca href=\"https://console.unify.ai/\"\u003e\n        \u003cimg class=\"dark-light\" width=\"100%\" src=\"https://raw.githubusercontent.com/unifyai/unifyai.github.io/refs/heads/main/img/externally_linked/docs/line_group_dark.gif\"/\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n**Fully hackable** LLMOps. Build *custom* interfaces for: logging, evals, guardrails, labelling, tracing, agents, human-in-the-loop, hyperparam sweeps, and anything else you can think of ✨\n\nJust `unify.log` your data, and add an interface using the four building blocks:\n\n1.  **tables** 🔢\n2.  **views** 🔍\n3. **plots** 📊\n4. **editor** 🕹️ (coming soon)\n\nEvery LLM product has **unique** and **changing** requirements, as do the **users**. Your infra should reflect this!\n\nWe've tried to make Unify as **(a) simple**, **(b) modular** and **(c) hackable** as possible, so you can quickly probe, analyze, and iterate on the data that's important for **you**, your **product** and your **users** ⚡\n\n## Quickstart\n\n[Sign up](https://console.unify.ai/), `pip install unifyai`, run your first eval ⬇️, and then check out the logs in your first [interface](https://console.unify.ai) 📊\n\n```python\nimport unify\nfrom random import randint, choice\n\n# initialize project\nunify.activate(\"Maths Assistant\")\n\n# build agent\nclient = unify.Unify(\"o3-mini@openai\", traced=True)\nclient.set_system_message(\n    \"You are a helpful maths assistant, \"\n    \"tasked with adding and subtracting integers.\"\n)\n\n# add test cases\nqs = [\n    f\"{randint(0, 100)} {choice(['+', '-'])} {randint(0, 100)}\"\n    for i in range(10)\n]\n\n# define evaluator\n@unify.traced\ndef evaluate_response(question: str, response: str) -\u003e float:\n    correct_answer = eval(question)\n    try:\n        response_int = int(\n            \"\".join(\n                [\n                    c for c in response.split(\" \")[-1]\n                    if c.isdigit()\n                ]\n            ),\n        )\n        return float(correct_answer == response_int)\n    except ValueError:\n        return 0.\n\n# define evaluation\n@unify.traced\ndef evaluate(q: str):\n    response = client.copy().generate(q)\n    score = evaluate_response(q, response)\n    unify.log(\n        question=q,\n        response=response,\n        score=score\n    )\n\n# execute + log your evaluation\nwith unify.Experiment():\n    unify.map(evaluate, qs)\n```\n\nCheck out our [Quickstart Video](https://youtu.be/fl9SzsoCegw?si=MhQZDfNS6U-ZsVYc) for a guided walkthrough.\n\n## Focus on your *product*, not the *LLM* 🎯\n\nDespite all of the hype, abstractions, and jargon, the *process* for building quality LLM apps is pretty simple.\n\n```\ncreate simplest possible agent 🤖\nwhile True:\n    create/expand unit tests (evals) 🗂️\n    while run(tests) failing: 🧪\n        Analyze failures, understand the root cause 🔍\n        Vary system prompt, in-context examples, tools etc. to rectify 🔀\n    Beta test with users, find more failures 🚦\n```\n\nWe've tried to strip away all of the excessive LLM jargon, so you can focus on your *product*, your *users*, and the *data* you care about, and *nothing else* 📈\n\nUnify takes inspiration from:\n- [PostHog](https://posthog.com/) / [Grafana](https://grafana.com/) / [LogFire](https://pydantic.dev/logfire) for powerful observability 🔬\n- [LangSmith](https://www.langchain.com/langsmith) / [BrainTrust](https://www.braintrust.dev/) / [Weave](https://wandb.ai/site/weave/) for LLM abstractions 🤖\n- [Notion](https://www.notion.com/) / [Airtable](https://www.airtable.com/) for composability and versatility 🧱\n\nWhether you're technical or non-technical, we hope Unify can help you to rapidly build top-notch LLM apps, and to remain fully focused on your *product* (not the *LLM*).\n\n## Learn More\n\nCheck out our [docs](https://docs.unify.ai/), and if you have any questions feel free to reach out to us on [discord](https://discord.com/invite/sXyFF8tDtm) 👾\n\nUnify is under active development 🚧, feedback in all shapes/sizes is also very welcome! 🙏\n\nHappy prompting! 🧑‍💻\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funifyai%2Funify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funifyai%2Funify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funifyai%2Funify/lists"}