File size: 11,897 Bytes
f91b52e
e903aa8
4a91f1e
 
e903aa8
f91b52e
e903aa8
ddbc89c
f91b52e
ddbc89c
 
 
 
f91b52e
4a91f1e
ddbc89c
e903aa8
 
f91b52e
 
 
ddbc89c
 
4a91f1e
 
 
 
 
 
 
 
 
f91b52e
 
ddbc89c
 
4a91f1e
 
 
 
 
 
 
 
 
 
 
 
 
ddbc89c
f91b52e
ddbc89c
 
4a91f1e
 
 
 
 
 
 
 
 
 
 
 
 
f91b52e
 
ddbc89c
 
4a91f1e
 
 
 
 
 
 
f91b52e
 
ddbc89c
 
 
 
 
 
 
 
 
 
 
 
 
 
f91b52e
 
 
b338e39
 
4a91f1e
f91b52e
 
 
 
 
 
ddbc89c
f91b52e
 
 
 
e903aa8
344e1c5
 
 
 
f91b52e
 
 
eaf5db3
f91b52e
 
e903aa8
012c0e8
 
f91b52e
 
 
012c0e8
e903aa8
e5ae432
 
f91b52e
e903aa8
f91b52e
012c0e8
e903aa8
983d3f5
befe967
1291b13
 
 
 
 
ddbc89c
1291b13
 
 
 
 
ddbc89c
 
 
 
f91b52e
 
012c0e8
f91b52e
 
 
012c0e8
f91b52e
 
 
 
012c0e8
f91b52e
e903aa8
eaf5db3
7b5b11f
eaf5db3
 
 
e903aa8
 
4a91f1e
f91b52e
 
 
 
4a91f1e
f91b52e
 
e903aa8
f91b52e
 
 
 
 
c471c4c
f91b52e
 
4a91f1e
 
ddbc89c
 
4a91f1e
 
 
 
 
 
 
ddbc89c
 
4a91f1e
 
 
 
 
 
 
 
 
 
 
 
ddbc89c
 
 
4a91f1e
 
 
f91b52e
 
 
 
 
4a91f1e
 
 
 
f91b52e
4a91f1e
 
 
f91b52e
 
 
ddbc89c
f91b52e
4a91f1e
f91b52e
ddbc89c
 
 
 
 
 
4a91f1e
 
ddbc89c
 
4a91f1e
 
 
 
 
 
f91b52e
 
 
 
 
4a91f1e
 
 
 
f91b52e
4a91f1e
 
 
 
 
 
 
e903aa8
 
 
4a91f1e
e903aa8
f91b52e
e903aa8
 
 
4a91f1e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
from datetime import datetime

import gradio as gr

# Organization details
ORG_NAME = "Narrative I/O"
DESCRIPTION = """
Narrative I/O builds tools and infrastructure for data processing and ML model development:

* Data normalization and schema standardization
* LLM fine-tuning and deployment infrastructure
* Function calling and tool integration frameworks
* Open-source ML model and dataset publishing

Our platform focuses on solving practical data integration challenges through
standardized APIs, normalized schemas, and deployable ML models.
"""

# News/Announcements
ANNOUNCEMENTS = [
    {
        "date": "2025-01-07",
        "title": "🚀Narrative Model Studio Released",
        "content": (
            "Today we're making Narrative Model Studio available to the public. "
            "[Model Studio](https://www.narrative.io/products/model-studio) is a platform to make it "
            "easy for *anyone* to train a LLM. Model Studio builds on top of our best in class Data "
            "Collaboration Platform and Data Marketplace to allow users to source, normalize, and "
            "package data for training, with no technical expertise required. That data can then be "
            "used to fine-tune an LLM for enterprise specific use cases and further deployed to "
            "inference endpoints."
        ),
    },
    {
        "date": "2025-01-07",
        "title": "🔄 Rosetta Stone 2.0 Private Model Release",
        "content": (
            "Today we are releasing our [Rosetta Stone 2.0]("
            "https://www.narrative.io/products/rosetta-stone) Private Model. When we started "
            "Narrative we set out to make it easier for everyone to work with data. One of the "
            "biggest challenges we found users faced was the lack of a normalization layer across "
            "different data sources, both internally and externally. We built Rosetta Stone to "
            "tackle this problem by using AI to normalize data to a common ontology and syntax, "
            "and making that normalized data directly queryable. Rosetta Stone 2.0 builds on the "
            "first version by leveraging the latest LLM Models and fine tuning them to perform "
            "even better than the first version. This release also marks the first time that the "
            "model is available for users to host on their own infrastructure, further reducing "
            "governance and compliance burdens."
        ),
    },
    {
        "date": "2025-01-07",
        "title": "🎯 Public Function Calling Models + Dataset Released",
        "content": (
            "Today we're excited to announce the release of our specialized function calling models "
            "and accompanying dataset. We've launched both 3B and 8B parameter models (with a 70B "
            "version coming soon) that have been meticulously fine-tuned for function calling "
            "applications. These models are built on our newly created normalized function calling "
            "dataset, which standardizes the approach to tool use in LLMs. Our implementation adopts "
            "a more standardized JSON schema for function calls, coupled with token enforcement "
            "through our [LLM Tools](https://github.com/narrative-io/narrative-llm-tools) to ensure "
            "models consistently respond using available functions. This makes these models "
            "particularly well-suited for enterprise applications where LLMs operate as backend "
            "processors, making tool calls on users' behalf rather than generating direct responses "
            "(though user interaction is still possible through a dedicated respond_to_user tool)."
        ),
    },
    {
        "date": "2025-01-07",
        "title": "🛠️ Narrative LLM Tools Released",
        "content": (
            "Today, we're excited to announce the release of our [LLM Tools Github repository]("
            "https://github.com/narrative-io/narrative-llm-tools). Narrative LLM Tools are a "
            "collection of tools that make it easier to use LLMs trained in Narrative's Model "
            "Studio alongside HuggingFace's Inference Endpoints."
        ),
    },
]

# Public Models
# PUBLIC_MODELS = [
#     {
#         "name": "entity-matcher-v1",
#         "description": "High-performance entity matching model",
#         "link": "https://huggingface.co/Narrative-IO/entity-matcher-v1"
#     },
#     {
#         "name": "data-enrichment-v2",
#         "description": "Advanced data enrichment pipeline",
#         "link": "https://huggingface.co/Narrative-IO/data-enrichment-v2"
#     }
# ]

# Public Datasets
PUBLIC_DATASETS = [
    {
        "name": "narrative-function-calling-v1",
        "description": "Function calling dataset for LLM training and evaluation",
        "link": "https://huggingface.co/datasets/narrative-io/narrative-function-calling-v1",
    }
]

# Demo configurations
DEMOS = [
    {
        "title": "Coming Soon",
    },
]

# Custom CSS for styling
custom_css = """
body {
    background: #1438f5;
}

.container {
    gap: 1rem;
}

.card {
    border-radius: 10px;
    padding: 20px;
    background: #ffffff;  /* surface-a */
    box-shadow: 0 4px 6px rgba(3, 21, 83, 0.1);  /* text-color with opacity */
    margin-bottom: 1rem;
}
.main-card {
    background: linear-gradient(135deg, #ecf1f9 0%, #e0e4f5 100%);  /* surface-b to surface-c */
}

h1 {
    font-size: 20px;
    font-weight: bold;
    margin-bottom: 10px;
    color: #031553;  /* text-color */
}

h2, strong, h3 {
    font-size: 16px;
    color: #415290;  /* text-color-secondary */
    margin-bottom: 15px;
}

p, span, li, em {
    font-size: 14px;
    color: #415290;  /* text-color-secondary */
    margin-bottom: 15px;
}

em {
    font-style: italic;
}

.news-item {
    padding: 10px 0;
    border-bottom: 1px solid #ced4da;  /* surface-d */
}
.news-date {
    font-size: 14px;
    color: #415290;  /* text-color-secondary */
}
.model-item, .dataset-item {
    padding: 10px;
    margin: 5px 0;
    background: #ecf1f9;  /* surface-b */
    border-radius: 5px;
}

.gr-button {
    background-color: #081662 !important;
    color: white !important;
}
"""


def format_date(date_str):
    date = datetime.strptime(date_str, "%Y-%m-%d")
    return date.strftime("%B %d, %Y")


def create_organization_page():
    """Creates the organization page with multiple cards and demos"""
    with gr.Blocks(css=custom_css) as interface:
        with gr.Row(elem_classes="container"):
            # Left section (2/3 width)
            with gr.Column(scale=2):
                # Main organization card
                with gr.Column(elem_classes="card main-card"):
                    gr.Markdown(f"# {ORG_NAME}", elem_classes="title")
                    gr.Markdown(DESCRIPTION)
                    with gr.Row():
                        gr.HTML(
                            """
                            <div style="display: flex; gap: 20px;">
                                <a href="https://narrative.io" target="_blank" class="icon-link">
                                    <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"
                                        viewBox="0 0 24 24" fill="#0922A6">
                                        <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 
                                        12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 
                                        1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8
                                        v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 
                                        2.08-.8 3.97-2.1 5.39z"/>
                                    </svg>
                                </a>
                                <a href="https://github.com/narrative-io" target="_blank" 
                                    class="icon-link">
                                    <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"
                                        viewBox="0 0 24 24" fill="#0922A6">
                                        <path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23
                                        .66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91
                                        -.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09
                                        -.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71
                                        -.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33
                                        .85 0 1.71.11 2.5.33 1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 
                                        2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92
                                        .69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2z"/>
                                    </svg>
                                </a>
                            </div>
                        """
                        )

                # News and Announcements
                with gr.Column(elem_classes="card"):
                    gr.Markdown("## Latest News & Announcements")
                    for announcement in ANNOUNCEMENTS:
                        with gr.Row(elem_classes="news-item"):
                            gr.Markdown(
                                f"""
                            **{announcement['title']}**
                            ### {format_date(announcement['date'])}
                            {announcement['content']}
                            """
                            )

                # Interactive Demos
                with gr.Column(elem_classes="card"):
                    gr.Markdown("## Interactive Demos")
                    gr.Markdown("Coming Soon")

            # Right section (1/3 width)
            with gr.Column(scale=1):
                # # Public Models card
                # with gr.Column(elem_classes="card"):
                #     gr.Markdown("## Public Models")
                #     for model in PUBLIC_MODELS:
                #         with gr.Row(elem_classes="model-item"):
                #             gr.Markdown(f"""
                #             **{model['name']}**
                #             {model['description']}
                #             [View Model]({model['link']})
                #             """)
                #     gr.Markdown(
                #         "[View All Models →](https://huggingface.co/collections/narrative-io/"
                #         "public-models-6777e756fe3748f33c403a31)",
                #         elem_classes="view-all-link"
                #     )

                # Public Datasets card
                with gr.Column(elem_classes="card"):
                    gr.Markdown("## Public Datasets")
                    for dataset in PUBLIC_DATASETS:
                        with gr.Row(elem_classes="dataset-item"):
                            gr.Markdown(
                                f"""
                            **{dataset['name']}**
                            {dataset['description']}
                            [View Dataset]({dataset['link']})
                            """
                            )
                    gr.Markdown(
                        "[View All Datasets →](https://huggingface.co/collections/narrative-io/"
                        "public-datasets-6777e72061a6437f5d3ce491)",
                        elem_classes="view-all-link",
                    )

    return interface


# Create and launch the interface
demo = create_organization_page()

# Launch the app
if __name__ == "__main__":
    demo.launch()